精华内容
下载资源
问答
  • Python作为一门强大的脚本语言,我们经常使用python来写爬虫程序,简单的爬虫会写,可是用python写多线程网页爬虫,应该如何写呢?一般来说,使用线程有两种模式,一种是创建...实现python多线程(http://www.maizi...

    Python作为一门强大的脚本语言,我们经常使用python来写爬虫程序,简单的爬虫会写,可是用python写多线程网页爬虫,应该如何写呢?一般来说,使用线程有两种模式,一种是创建线程要执行的函数,把这个函数传递进Thread对象里,让它来执行.另一种是直接从Thread继承,创建一个新的class,把线程执行的代码放到这个新的class里。

    实现python多线程(http://www.maiziedu.com/group/article/10324/)网页爬虫,采用了多线程和锁机制,实现了广度优先算法的网页爬虫。

    先给大家简单介绍下我的实现思路:

    对于一个网络爬虫,如果要按广度遍历的方式下载,它是这样的:

    1.从给定的入口网址把第一个网页下载下来

    2.从第一个网页中提取出所有新的网页地址,放入下载列表中

    3.按下载列表中的地址,下载所有新的网页

    4.从所有新的网页中找出没有下载过的网页地址,更新下载列表

    5.重复3、4两步,直到更新后的下载列表为空表时停止

    python代码如下:

    #!/usr/bin/env python

    #coding=utf-8

    import threading

    import urllib

    import re

    import time

    g_mutex=threading.Condition()

    g_pages=[] #从中解析所有url链接

    g_queueURL=[] #等待爬取的url链接列表

    g_existURL=[] #已经爬取过的url链接列表

    g_failedURL=[] #下载失败的url链接列表

    g_totalcount=0 #下载过的页面数

    class Crawler:

    def __init__(self,crawlername,url,threadnum):

    self.crawlername=crawlername

    self.url=url

    self.threadnum=threadnum

    self.threadpool=[]

    self.logfile=file("log.txt",'w')

    def craw(self):

    global g_queueURL

    g_queueURL.append(url)

    depth=0

    print self.crawlername+" 启动..."

    while(len(g_queueURL)!=0):

    depth+=1

    print 'Searching depth ',depth,'... '

    self.logfile.write("URL:"+g_queueURL[0]+"........")

    self.downloadAll()

    self.updateQueueURL()

    content=' >>>Depth '+str(depth)+': '

    self.logfile.write(content)

    i=0

    while i

    content=str(g_totalcount+i)+'->'+g_queueURL+' '

    self.logfile.write(content)

    i+=1

    def downloadAll(self):

    global g_queueURL

    global g_totalcount

    i=0

    while i

    j=0

    while j

    g_totalcount+=1

    threadresult=self.download(g_queueURL[i+j],str(g_totalcount)+'.html',j)

    if threadresult!=None:

    print 'Thread started:',i+j,'--File number =',g_totalcount

    j+=1

    i+=j

    for thread in self.threadpool:

    thread.join(30)

    threadpool=[]

    g_queueURL=[]

    def download(self,url,filename,tid):

    crawthread=CrawlerThread(url,filename,tid)

    self.threadpool.append(crawthread)

    crawthread.start()

    def updateQueueURL(self):

    global g_queueURL

    global g_existURL

    newUrlList=[]

    for content in g_pages:

    newUrlList+=self.getUrl(content)

    g_queueURL=list(set(newUrlList)-set(g_existURL))

    def getUrl(self,content):

    reg=r'"(http://.+?)"'

    regob=re.compile(reg,re.DOTALL)

    urllist=regob.findall(content)

    return urllist

    class CrawlerThread(threading.Thread):

    def __init__(self,url,filename,tid):

    threading.Thread.__init__(self)

    self.url=url

    self.filename=filename

    self.tid=tid

    def run(self):

    global g_mutex

    global g_failedURL

    global g_queueURL

    try:

    page=urllib.urlopen(self.url)

    html=page.read()

    fout=file(self.filename,'w')

    fout.write(html)

    fout.close()

    except Exception,e:

    g_mutex.acquire()

    g_existURL.append(self.url)

    g_failedURL.append(self.url)

    g_mutex.release()

    print 'Failed downloading and saving',self.url

    print e

    return None

    g_mutex.acquire()

    g_pages.append(html)

    g_existURL.append(self.url)

    g_mutex.release()

    if __name__=="__main__":

    url=raw_input("请输入url入口: ")

    threadnum=int(raw_input("设置线程数:"))

    crawlername="小小爬虫"

    crawler=Crawler(crawlername,url,threadnum)

    crawler.craw()

    以上就用实例为大家讲解了python实现多线程爬虫的方法,有兴趣的朋友可以自己试试。

    展开全文
  • 虽然python多线程受GIL限制,并不是真正的多线程,但是对于I/O密集型计算还是能明显提高效率,比如说爬虫。分别用两种方式获取10个访问速度比较慢的网页,一般方式耗时50s,多线s。序:叮咚叮咚,...

    python是支持多线程的,主要是通过thread和threading这两个模块来实现的。thread模块是比较底层的模块,threading模块是对thread做了一些包装的,可以更加方便的使用。

    虽然python的多线程受GIL限制,并不是真正的多线程,但是对于I/O密集型计算还是能明显提高效率,比如说爬虫。

    分别用两种方式获取10个访问速度比较慢的网页,一般方式耗时50s,多线s。

    序:叮咚叮咚,走过路过不要错过啊。。。好久没写博客,上次都是几年前了,写过一些android的文章,然而我连账号都忘记了,真尼玛。。。大数据时代,人工智能,机器学习开始流行了,赶上了这个时代是好的,也...博文来自:shellc1992的博客

    本文所谓的爬虫就是通过本地远程访问url,然后将url的读成源代码形式,然后对源代码进行解析,获取自己需要的数据,相当于简单数据挖掘。本文实现的是将一个网页的图片爬出保存到本地的过程,例子很简单,用的...博文来自:xqn2017的博客

    多线程在介绍Python中的线程之前,先明确一个问题,Python中的多线程是假的多线程!为什么这么说,我们先明确一个概念,全局解释器锁(GIL)一、什么是GILPython代码的执行由Python虚...

    02-04阅读数 1万+在学生时期,可能听到网络爬虫这个词会觉得很高大上,但是它的简单实现可能学生都不难懂。网络爬虫应用,就是把整个互联网真的就当做一张网,像蜘蛛网那样,应用就像一个虫子,在网上面按照一定的规则爬动。现在互联...

    urllib库的简单使用&&一个简单的Python爬虫示例本篇文章,介绍urllib.request库的简单使用以及注意的问题。最后实现一个Python爬虫的示例。本文是基于Python3.6.2实现...博文来自:Widsom的博客

    扫描器_Python源码文件01-25黑客工具Python多线程爬虫扫描器_Python源码文件,欢迎下载下载

    思路分析Python有很多的第三方库,可以帮助我们实现各种各样的功能。问题在于,我们弄清楚我们需要什么:1)http请求库,根据网站地址可以获取网页源代码。甚至可以下载图片写入磁盘。2)解析网页源代码...

    Queue(队列对象)queue是python3中的标准库,可以直接importqueue引用;队列是线程间最常用的交换数据的形式。python下多线程的思考对于资源,加锁是个重要的环节。因为pyth...

    (补1:由于csdn页面重构了,看到有很多人浏览,特地更新一下获取内容补充的字都为绿字)Python是一种面向对象的解释型计算机程序设计语言,类似c,java,php,JavaScript一种语言,比...博文

    1,需要准备的工作,电脑已经安装好python,如果没装,可以执行去官网下载,初学者可以安装轻量级的wingidepython开发工具,python安装成...

    Python简单爬虫实例记录主要流程分为:爬取、整理、存储1.其中用到几个包,包括requests用于向网站发送请求,并获得网页代码BeautifulSoup4用于处理获得的网页代码,提取有效信息pa...

    说起多线程,你需要知道多进程和多线程的区别,了解多线程的概念,至于这两点,我不打算在本片文章中详述了,不错,因为我懒得整理。。。不了解的请先问度娘1、普通的单线程:打个比方,我想做听音乐和敲代码两件事...博文来自:sqc157400661的博客

    阅读数 2493第七章:提升爬虫的速度7.1.1并发和并行了解并发(concurrency)和并行(parallelism)的概念(操作系统)7.1.2同步和异步了解同步了异步的概念(操作系统)7.2多线程爬虫GIL...

    2019年是Python彻底崛起的一年,需求多,薪资高,掌握Python爬虫也已成为每个工程师的必备项,你get到了吗?本课程通过循序渐进的讲解,让学生能够利用Python多线程+生产者和消费者模式来构造一个表情包下 爬虫程序。(进入学习社群领取Python全年学习资源)

    *原创作者:VillanCh0×00介绍本文我们就两个方面来讨论如何改进我们的爬虫:数据存储和多线程,当然我承认这是为我们以后要讨论的一些东西做铺垫。目的:通常我们需要对爬虫捕捉的数据进行分析,处理,...

    If you can take it, you can make it.

    首先先来介绍下queue这个包吧,这个包叫队列,没错,就是那个和栈反过来的那个队列,大家一听队列就随口说出先进先出,而栈则是后进先出,为什么要用用队列来实现,其实我也不知道,反正用过之后很顺手...博文来自:

    linux下用python写简单的爬虫程序简述下这个爬虫程序的基本原理:HTTP请求通过起始url获得页面内容正则表达式通过正则表达式获取想要的信息获取到本地http请求geturl.py#codin...

    ###写在题外的话爬虫,我还是大三的时候,第一次听说,当时我的学姐给我找的一个勤工俭学的项目,要求是在微博上爬出感兴趣的信息,结果很遗憾,第一次邂逅只是擦肩而过。然后,时间来到4年后的研二,在做信息检...

    因为公司有个项目有webapp的需求,在前期准备的期间考虑过使用ionic,毕竟该项目web端的框架使用的是Angular,项目组的人也都比较熟悉,但是我们毕竟只是做个移动的网页,不想用ionic那么...

    tableView中添加按钮触发不了点击事件的解决办法05-24阅读数 1940

    三菱FX系列PLC与PC通讯的实现之专有协议(计算机联接)的程序设计之一02-11阅读数 2万+

    jquery/js实现一个网页同时调用多个倒计时(最新的)11-25阅读数 50万+

    授予每个自然月内发布4篇或4篇以上原创或翻译IT博文的用户。不积跬步无以至千里,不积小流无以成江海,程序人生的精彩需要坚持不懈地积累!

    编程视频全集,go语言、python、java、前端、Linux、大数据、项目等

    Python JSON:编码(转储),解码(加载)json数据和文件(示例)

    本文来自: 老铁博客,转载请保留出处!欢迎发表您的评论

    相关标签:多线程爬虫

    展开全文
  • 此为以斗图网抓取图片,以多线程为基础的Python实例
  • python提供了两个模块来实现多线程thread 和threading ,thread 有一些缺点,在threading 得到了弥补。并且在Python3中废弃了thread模块,保留了更强大的threading模块。使用场景在python的原始解释器CPython中存在...

    多线程概述

    多线程使得程序内部可以分出多个线程来做多件事情,充分利用CPU空闲时间,提升处理效率。python提供了两个模块来实现多线程thread 和threading ,thread 有一些缺点,在threading 得到了弥补。并且在Python3中废弃了thread模块,保留了更强大的threading模块。

    使用场景

    在python的原始解释器CPython中存在着GIL(Global Interpreter Lock,全局解释器锁),因此在解释执行python代码时,会产生互斥锁来限制线程对共享资源的访问,直到解释器遇到I/O操作或者操作次数达到一定数目时才会释放GIL。所以,虽然CPython的线程库直接封装了系统的原生线程,但CPython整体作为一个进程,同一时间只会有一个获得GIL的线程在跑,其他线程则处于等待状态。这就造成了即使在多核CPU中,多线程也只是做着分时切换而已。

    如果你的程序是CPU密集型,多个线程的代码很有可能是线性执行的。所以这种情况下多线程是鸡肋,效率可能还不如单线程因为有上下文切换开销。但是如果你的代码是IO密集型,涉及到网络、磁盘IO的任务都是IO密集型任务,多线程可以明显提高效率,例如多线程爬虫,多线程文件处理等等

    多线程爬虫

    多线程爬虫的代码实例

    注: 以下代码在python3下运行通过, python2版本差异较大,不能运行成功,如需帮助请下方留意。

    # coding=utf-8

    import threading, queue, time, urllib

    from urllib import request

    baseUrl = 'http://www.pythontab.com/html/pythonjichu/'

    urlQueue = queue.Queue()

    for i in range(2, 10):

    url = baseUrl + str(i) + '.html'

    urlQueue.put(url)

    #print(url)

    def fetchUrl(urlQueue):

    while True:

    try:

    #不阻塞的读取队列数据

    url = urlQueue.get_nowait()

    i = urlQueue.qsize()

    except Exception as e:

    break

    print ('Current Thread Name %s, Url: %s ' % (threading.currentThread().name, url))

    try:

    response = urllib.request.urlopen(url)

    responseCode = response.getcode()

    except Exception as e:

    continue

    if responseCode == 200:

    #抓取内容的数据处理可以放到这里

    #为了突出效果, 设置延时

    time.sleep(1)

    if __name__ == '__main__':

    startTime = time.time()

    threads = []

    # 可以调节线程数, 进而控制抓取速度

    threadNum = 4

    for i in range(0, threadNum):

    t = threading.Thread(target=fetchUrl, args=(urlQueue,))

    threads.append(t)

    for t in threads:

    t.start()

    for t in threads:

    #多线程多join的情况下,依次执行各线程的join方法, 这样可以确保主线程最后退出, 且各个线程间没有阻塞

    t.join()

    endTime = time.time()

    print ('Done, Time cost: %s ' % (endTime - startTime))

    运行结果:

    1个线程时:

    Current Thread Name Thread-1, Url: http://www.pythontab.com/html/pythonjichu/2.html

    Current Thread Name Thread-1, Url: http://www.pythontab.com/html/pythonjichu/3.html

    Current Thread Name Thread-1, Url: http://www.pythontab.com/html/pythonjichu/4.html

    Current Thread Name Thread-1, Url: http://www.pythontab.com/html/pythonjichu/5.html

    Current Thread Name Thread-1, Url: http://www.pythontab.com/html/pythonjichu/6.html

    Current Thread Name Thread-1, Url: http://www.pythontab.com/html/pythonjichu/7.html

    Current Thread Name Thread-1, Url: http://www.pythontab.com/html/pythonjichu/8.html

    Current Thread Name Thread-1, Url: http://www.pythontab.com/html/pythonjichu/9.html

    Done, Time cost: 8.182249069213867

    2个线程时:

    Current Thread Name Thread-1, Url: http://www.pythontab.com/html/pythonjichu/2.html

    Current Thread Name Thread-2, Url: http://www.pythontab.com/html/pythonjichu/3.html

    Current Thread Name Thread-2, Url: http://www.pythontab.com/html/pythonjichu/4.html

    Current Thread Name Thread-1, Url: http://www.pythontab.com/html/pythonjichu/5.html

    Current Thread Name Thread-2, Url: http://www.pythontab.com/html/pythonjichu/6.html

    Current Thread Name Thread-1, Url: http://www.pythontab.com/html/pythonjichu/7.html

    Current Thread Name Thread-2, Url: http://www.pythontab.com/html/pythonjichu/8.html

    Current Thread Name Thread-1, Url: http://www.pythontab.com/html/pythonjichu/9.html

    Done, Time cost: 4.0987958908081055

    3个线程时:

    Current Thread Name Thread-1, Url: http://www.pythontab.com/html/pythonjichu/2.html

    Current Thread Name Thread-2, Url: http://www.pythontab.com/html/pythonjichu/3.html

    Current Thread Name Thread-3, Url: http://www.pythontab.com/html/pythonjichu/4.html

    Current Thread Name Thread-4, Url: http://www.pythontab.com/html/pythonjichu/5.html

    Current Thread Name Thread-2, Url: http://www.pythontab.com/html/pythonjichu/6.html

    Current Thread Name Thread-4, Url: http://www.pythontab.com/html/pythonjichu/7.html

    Current Thread Name Thread-1, Url: http://www.pythontab.com/html/pythonjichu/9.html

    Current Thread Name Thread-3, Url: http://www.pythontab.com/html/pythonjichu/8.html

    Done, Time cost: 2.287320137023926

    通过调节线程数可以看到,执行时间会随着线程数的增加而缩短,抓取效率成正比增加。

    总结:

    Python多线程在IO密集型任务,多线程可以明显提高效率,CPU密集型任务不适合使用多线程处理。

    以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

    本文标题: Python3多线程爬虫实例讲解代码

    本文地址: http://www.cppcns.com/jiaoben/python/216839.html

    展开全文
  • Python多线程爬虫实例

    万次阅读 多人点赞 2018-04-03 17:46:04
    前言  大数据分析自然需要大量的数据,爬虫是获取数据的一种途径,Python是十分适合写爬虫的语言,Scrapy是Python的一个高级爬虫框架,那么学习Scrapy之前先简单实现一些爬虫例子,本文记录作者第一次实现爬虫。...

    前言

      大数据分析自然需要大量的数据,爬虫是获取数据的一种途径,Python是十分适合写爬虫的语言,Scrapy是Python的一个高级爬虫框架,那么学习Scrapy之前先简单实现一些爬虫例子,本文记录作者第一次实现爬虫。
    未成年人请酌情阅读

    正文

      首先当然要安装Python了,作者使用Python2.7.14,IDE使用PyCharm,需要准备的模块有requests、re、lxml(可以通过pip下载或者在PyCharm里面下载),软件配置和运行什么的请另找教程。
      那么准备爬取哪些网站呢?第一次操作我选择一个比较特殊的网站http://hotpics.cc/,这是一个有大量图片的成人网站,而且结构比较简单,我们今天将里面的图片爬取并保存到本地。
      首先观察网站的页数,翻页时网址变化为http://hotpics.cc/page/2/显然页数就是后面那个数字。然后用Chrome分析网站图片的代码,审查元素指向图片,容易发现图片url都在名为figure的标签内,那么我们先把figure标签提取出来再把图片的url提取出来就行了,提取标签当然是用强大的XPATH实现
    这里写图片描述
      先放代码

    # coding=utf-8
    from lxml import etree
    from multiprocessing.dummy import Pool as ThreadPool
    import requests
    import re
    import sys
    import time
    reload(sys)
    sys.setdefaultencoding("utf-8")
    def spider(url):
        print url
        headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36'}
        html = requests.get(url, headers=headers) #伪装成浏览器
        selector = etree.HTML(html.text) #将网页html变成树结构,用于xpath
        content = selector.xpath('//figure[@class="post-image "]') #提取figure标签
        for each in content:
            tmp = each.xpath('a/img/@src')#把img标签的src属性提取出来
            pic = requests.get(tmp[0])#访问图片
            print 'downloading: ' + tmp[0]
            string = re.search('\d+/\d+/(.*?)\\.jpg', str(tmp[0])).group(1) #正则表达式匹配图片名字
            fp=open('pic2\\'+string+'.jpg','wb')#放到pic2文件夹内,要自己创建
            fp.write(pic.content)
            fp.close
    if __name__ == '__main__':
        pool = ThreadPool(2) #双核电脑
        tot_page = []
        for i in range(1,11): #提取1到10页的内容
            link = 'http://hotpics.cc/page/' + str(i)
            tot_page.append(link)
        pool.map(spider, tot_page)#多线程工作
        pool.close()
        pool.join()
    
    
    

    然后运行一下,一个简单的爬虫爬取图片的例子就完成了(`・ω・´)
    这里写图片描述
    这里写图片描述

    展开全文
  • python多线程爬虫实例

    2020-02-22 00:28:31
    单线程爬虫已经写过了,这边文章就对上一篇...对于多线程爬虫,常见有2种写法,一种是继承threading.Thread类,还有一种是直接使用,至于线程池什么的,我还没了解过,本篇文章是直接使用Thread。 一般来说: CPU密...
  • 进程 Multiprocessing 模块Process 类用来描述一个进程对象。创建子进程的时候,只需要传入一个执行函数和函数的参数即可完成 Process 示例的创建。star() 方法启动进程,join() 方法实现进程间的同步,等待所有...
  • 编辑推荐:本文主要介绍对Python多线程爬虫实战的整体的思路,希望对大家有帮助。本文来知乎,由火龙果软件Alice编辑,推荐。最近在写爬虫程序爬取亚马逊上的评论信息,因此也自学了很多爬虫相关的知识,其实网络上...
  • 爬虫网站和爬取目标 爬虫网站:全景网 https://www.quanjing.com/ 爬取目标:根据搜索关键词爬取图片 分析过程 没有分析过程的爬虫都是耍流氓。 首先进入全景网首页,F12打开谷歌开发者工具,...
  • python是支持多线程的, 主要是通过thread和threading这两个模块来实现的,本文主要给大家分享python实现多线程网页爬虫一般来说,使用线程有两种模式, 一种是创建线程要执行的函数, 把这个函数传递进Thread对象里,...
  • python提供了两个模块来实现多线程thread 和threading ,thread 有一些缺点,在threading 得到了弥补。并且在Python3中废弃了thread模块,保留了更强大的threading模块。 使用场景 在python的原始解释器CPython中...
  • 很久没写爬虫了,一个经典的Python爬虫例子,Python多线程爬虫例子案例,目标网站结构比较简单,适合练手使用,采用了经典的生产者和消费者模式,同时结合python类和装饰器的使用,...
  • 题记:作为测试工程师经常需要解决测试数据来源的问题,解决思路无非是三种:(1)直接从生产环境拷贝...作为一个精益求精的测试工程师,决定研究一下多线程爬虫领域的应用,以提高爬虫的效率。一、为什么需要多线...
  • python是支持多线程的, 主要是通过thread和threading这两个模块来实现的,本文主要给大家分享python实现多线程网页爬虫 一般来说,使用线程有两种模式, 一种是创建线程要执行的函数, 把这个函数传递进Thread对象里,...
  • 多线程爬虫:即程序中的某些程序段并行执行, 合理地设置多线程,可以让爬虫效率更高 糗事百科段子普通爬虫和多线程爬虫 分析该网址链接得出: https://www.qiushibaike.com/8hr/page/页码/ 多线程爬虫也就和JAVA的...
  • 之前写过一篇爬取小说的博客,但是单线程爬取速度太慢了,之前爬取一部小说花了700秒,1秒两章的速度有点让人难以...python爬虫实例之小说爬取器 下面就上新鲜出炉代码: import threading import time from bs4 impo
  • def __init__(self, queue): super().__init__() self.queue = queue def run(self): i = 1 while True: context = requests.get('http://python.jobbole.com/category/project/page/{}/'.format(i)) if context....
  • 主要为大家详细介绍了Python多线程爬虫简单示例,感兴趣的小伙伴们可以参考一下
  • 如下,线程池两个线程: 线程池关键代码: 源码如下: import re, multiprocessing import requests, time class HandleLaGou(object): def __init__(self): self.laGou_session = requests.session() self....
  • 糗事百科爬虫实例:需求:使用requests获取页面信息,用XPath / re 做数据提取获取每个帖子里的用户头像链接、用户姓名、段子内容、点赞次数和评论次数保存到 json 文件内#qiushibaike.py#import urllib#import re#...
  • 虽然python多线程受GIL限制,并不是真正的多线程,但是对于I/O密集型计算还是能明显提高效率,比如说爬虫。分别用两种方式获取10个访问速度比较慢的网页,一般方式耗时50s,多线s。序:叮咚叮咚,...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 7,286
精华内容 2,914
关键字:

python多线程爬虫实例

python 订阅
爬虫 订阅