经过线程协程,写爬虫以及质量相比较

一、进程:

 

 

python选拔 多进程/二十四线程/协程 写爬虫以及品质比较,牛逼的分分钟就将二个网站爬下来!,python爬虫

 

首先我们来打探下python中的进度,线程以及协程!

从电脑硬件角度:

电脑的主导是CPU,承担了全数的估算职分。
三个CPU,在二个时光切片里只好运转三个先后。

 

从操作系统的角度:

进程和线程,都以一种CPU的执行单元。

进度:表示2个先后的上下文执行活动(打开、执行、保存…)

线程:进度执行顺序时候的微乎其微调度单位(执行a,执行b…)

1个先后至少有二个经过,二个历程至少有多个线程。

 

并行 和 并发:

交互:三个CPU主旨,区其余顺序就分配给差其余CPU来运维。可以让四个程序同时实施。

cpu1 ————-
cpu2 ————-
cpu3 ————-
cpu4 ————-

出现:单个CPU大旨,在一个时间切片里1次只可以运营二个先后,如若急需周转多个程序,则串行执行。

cpu1  —-  —-

cpu1    —-  —-

 

多进程/多线程:
表示可以而且施行四个义务,进程和线程的调度是由操作系统自动完结。

经过:每一个进度都有谈得来单独的内存空间,差别进程之间的内存空间不共享。
过程之间的通讯有操作系统传递,导致通信作用低,切换开支大。

线程:四个进度能够有多少个线程,所无线程共享进度的内存空间,通信效能高,切换费用小。

共享意味着竞争,导致数据不安全,为了爱惜内存空间的数目安全,引入”互斥锁”。

1个线程在拜访内存空间的时候,其余线程不容许访问,必须等待从前的线程访问截止,才能应用这几个内存空间。

互斥锁:一种安全有序的让四个线程访问内存空间的建制。

 

Python的八线程:

GIL 全局解释器锁:线程的施行权限,在Python的历程里唯有2个GIL。

经过线程协程,写爬虫以及质量相比较。多少个线程要求履行职责,必须拿到GIL。

好处:直接杜绝了多少个线程访问内存空间的平安难点。
弊病:Python的四线程不是真正八线程,不或许丰裕利用多核CPU的能源。

然而,在I/O阻塞的时候,解释器会放出GIL。

所以:

多进度:密集CPU义务,须要丰盛使用多核CPU财富(服务器,多量的并行总括)的时候,用多进度。
multiprocessing
缺点:三个进度之间通信花费高,切换费用大。

四线程:密集I/O职责(互联网I/O,磁盘I/O,数据库I/O)使用多线程合适。
threading.Thread、multiprocessing.dummy
症结:同三个时日切片只好运转1个线程,无法不蔓不枝高并行,不过可以成功高并发。

协程:又称微线程,在单线程上推行多少个职分,用函数切换,费用极小。不通过操作系统调度,没有经过、线程的切换开支。genvent,monkey.patchall

四线程请求再次回到是无序的,那1个线程有数量重返就处理非凡线程,而协程重临的多寡是一成不变的。

缺陷:单线程执行,处理密集CPU和本地磁盘IO的时候,品质较低。处理互连网I/O质量依旧比较高.

 

下边以这些网站为例,采取两种格局爬取。爬取前250名的摄像。。

 通过分析网页发现第3页的url start=25,第壹页的url
start=50,第2页的start=75。由此得以汲取这些网站每一页的数局是透过递增start那一个参数获取的。

貌似不看率先页的多寡,第②页的远非参考价值。

澳门葡京备用网址 1

 

这次我们重点爬取,电影名字跟评分。只是使用分化措施去对待下不一致点,所以数据方面就不过多领取恐怕封存。只是简单的将其爬取下打印出来看看。

先是:接纳多进程 , multiprocessing 模块。
当然这些耗时更互连网好坏有关。在全体要请求都健康的情状下耗时15s多。

 

澳门葡京备用网址 2

#!/usr/bin/env python2
# -*- coding=utf-8 -*-

from multiprocessing import Process, Queue

import time
from lxml import etree
import requests


class DouBanSpider(Process):
    def __init__(self, url, q):
        # 重写写父类的__init__方法
        super(DouBanSpider, self).__init__()
        self.url = url
        self.q = q
        self.headers = {
            'Host': 'movie.douban.com',
            'Referer': 'https://movie.douban.com/top250?start=225&filter=',
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.104 Safari/537.36',
        }

    def run(self):
        self.parse_page()

    def send_request(self,url):
        '''
        用来发送请求的方法
        :return: 返回网页源码
        '''
        # 请求出错时,重复请求3次,
        i = 0
        while i <= 3:
            try:
                print u"[INFO]请求url:"+url
                return requests.get(url=url,headers=self.headers).content
            except Exception as e:
                print u'[INFO] %s%s'% (e,url)
                i += 1

    def parse_page(self):
        '''
        解析网站源码,并采用xpath提取 电影名称和平分放到队列中
        :return:
        '''
        response = self.send_request(self.url)
        html = etree.HTML(response)
        # 获取到一页的电影数据
        node_list = html.xpath("//div[@class='info']")
        for move in node_list:
            # 电影名称
            title = move.xpath('.//a/span/text()')[0]
            # 评分
            score = move.xpath('.//div[@class="bd"]//span[@class="rating_num"]/text()')[0]

            # 将每一部电影的名称跟评分加入到队列
            self.q.put(score + "\t" + title)


def main():
    # 创建一个队列用来保存进程获取到的数据
    q = Queue()
    base_url = 'https://movie.douban.com/top250?start='
    # 构造所有url
    url_list = [base_url+str(num) for num in range(0,225+1,25)]

    # 保存进程
    Process_list = []
    # 创建并启动进程
    for url in url_list:
        p = DouBanSpider(url,q)
        p.start()
        Process_list.append(p)

    # 让主进程等待子进程执行完成
    for i in Process_list:
        i.join()

    while not q.empty():
        print q.get()

if __name__=="__main__":

    start = time.time()
    main()
    print '[info]耗时:%s'%(time.time()-start)

Process多进程完毕

#!/usr/bin/env python2
# -*- coding=utf-8 -*-

from multiprocessing import Process, Queue

import time
from lxml import etree
import requests


class DouBanSpider(Process):
    def __init__(self, url, q):
        # 重写写父类的__init__方法
        super(DouBanSpider, self).__init__()
        self.url = url
        self.q = q
        self.headers = {
            'Host': 'movie.douban.com',
            'Referer': 'https://movie.douban.com/top250?start=225&filter=',
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.104 Safari/537.36',
        }

    def run(self):
        self.parse_page()

    def send_request(self,url):
        '''
        用来发送请求的方法
        :return: 返回网页源码
        '''
        # 请求出错时,重复请求3次,
        i = 0
        while i <= 3:
            try:
                print u"[INFO]请求url:"+url
                return requests.get(url=url,headers=self.headers).content
            except Exception as e:
                print u'[INFO] %s%s'% (e,url)
                i += 1

    def parse_page(self):
        '''
        解析网站源码,并采用xpath提取 电影名称和平分放到队列中
        :return:
        '''
        response = self.send_request(self.url)
        html = etree.HTML(response)
        # 获取到一页的电影数据
        node_list = html.xpath("//div[@class='info']")
        for move in node_list:
            # 电影名称
            title = move.xpath('.//a/span/text()')[0]
            # 评分
            score = move.xpath('.//div[@class="bd"]//span[@class="rating_num"]/text()')[0]

            # 将每一部电影的名称跟评分加入到队列
            self.q.put(score + "\t" + title)


def main():
    # 创建一个队列用来保存进程获取到的数据
    q = Queue()
    base_url = 'https://movie.douban.com/top250?start='
    # 构造所有url
    url_list = [base_url+str(num) for num in range(0,225+1,25)]

    # 保存进程
    Process_list = []
    # 创建并启动进程
    for url in url_list:
        p = DouBanSpider(url,q)
        p.start()
        Process_list.append(p)

    # 让主进程等待子进程执行完成
    for i in Process_list:
        i.join()

    while not q.empty():
        print q.get()

if __name__=="__main__":

    start = time.time()
    main()
    print '[info]耗时:%s'%(time.time()-start)

  

澳门葡京备用网址 3

 

 

 

  采取二十四线程时,耗时10.4s

 

澳门葡京备用网址 4

#!/usr/bin/env python2
# -*- coding=utf-8 -*-

from threading import Thread
from Queue import Queue
import time
from lxml import etree
import requests


class DouBanSpider(Thread):
    def __init__(self, url, q):
        # 重写写父类的__init__方法
        super(DouBanSpider, self).__init__()
        self.url = url
        self.q = q
        self.headers = {
            'Cookie': 'll="118282"; bid=ctyiEarSLfw; ps=y; __yadk_uid=0Sr85yZ9d4bEeLKhv4w3695OFOPoedzC; dbcl2="155150959:OEu4dds1G1o"; as="https://sec.douban.com/b?r=https%3A%2F%2Fbook.douban.com%2F"; ck=fTrQ; _pk_id.100001.4cf6=c86baf05e448fb8d.1506160776.3.1507290432.1507283501.; _pk_ses.100001.4cf6=*; __utma=30149280.1633528206.1506160772.1507283346.1507290433.3; __utmb=30149280.0.10.1507290433; __utmc=30149280; __utmz=30149280.1506160772.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); __utma=223695111.1475767059.1506160772.1507283346.1507290433.3; __utmb=223695111.0.10.1507290433; __utmc=223695111; __utmz=223695111.1506160772.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); push_noty_num=0; push_doumail_num=0',
            'Host': 'movie.douban.com',
            'Referer': 'https://movie.douban.com/top250?start=225&filter=',
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.104 Safari/537.36',
        }

    def run(self):
        self.parse_page()

    def send_request(self,url):
        '''
        用来发送请求的方法
        :return: 返回网页源码
        '''
        # 请求出错时,重复请求3次,
        i = 0
        while i <= 3:
            try:
                print u"[INFO]请求url:"+url
                html = requests.get(url=url,headers=self.headers).content
            except Exception as e:
                print u'[INFO] %s%s'% (e,url)
                i += 1
            else:
                return html

    def parse_page(self):
        '''
        解析网站源码,并采用xpath提取 电影名称和平分放到队列中
        :return:
        '''
        response = self.send_request(self.url)
        html = etree.HTML(response)
        # 获取到一页的电影数据
        node_list = html.xpath("//div[@class='info']")
        for move in node_list:
            # 电影名称
            title = move.xpath('.//a/span/text()')[0]
            # 评分
            score = move.xpath('.//div[@class="bd"]//span[@class="rating_num"]/text()')[0]

            # 将每一部电影的名称跟评分加入到队列
            self.q.put(score + "\t" + title)


def main():
    # 创建一个队列用来保存进程获取到的数据
    q = Queue()
    base_url = 'https://movie.douban.com/top250?start='
    # 构造所有url
    url_list = [base_url+str(num) for num in range(0,225+1,25)]

    # 保存线程
    Thread_list = []
    # 创建并启动线程
    for url in url_list:
        p = DouBanSpider(url,q)
        p.start()
        Thread_list.append(p)

    # 让主线程等待子线程执行完成
    for i in Thread_list:
        i.join()

    while not q.empty():
        print q.get()

if __name__=="__main__":

    start = time.time()
    main()
    print '[info]耗时:%s'%(time.time()-start)

thread

#!/usr/bin/env python2
# -*- coding=utf-8 -*-

from threading import Thread
from Queue import Queue
import time
from lxml import etree
import requests


class DouBanSpider(Thread):
    def __init__(self, url, q):
        # 重写写父类的__init__方法
        super(DouBanSpider, self).__init__()
        self.url = url
        self.q = q
        self.headers = {
            'Cookie': 'll="118282"; bid=ctyiEarSLfw; ps=y; __yadk_uid=0Sr85yZ9d4bEeLKhv4w3695OFOPoedzC; dbcl2="155150959:OEu4dds1G1o"; as="https://sec.douban.com/b?r=https%3A%2F%2Fbook.douban.com%2F"; ck=fTrQ; _pk_id.100001.4cf6=c86baf05e448fb8d.1506160776.3.1507290432.1507283501.; _pk_ses.100001.4cf6=*; __utma=30149280.1633528206.1506160772.1507283346.1507290433.3; __utmb=30149280.0.10.1507290433; __utmc=30149280; __utmz=30149280.1506160772.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); __utma=223695111.1475767059.1506160772.1507283346.1507290433.3; __utmb=223695111.0.10.1507290433; __utmc=223695111; __utmz=223695111.1506160772.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); push_noty_num=0; push_doumail_num=0',
            'Host': 'movie.douban.com',
            'Referer': 'https://movie.douban.com/top250?start=225&filter=',
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.104 Safari/537.36',
        }

    def run(self):
        self.parse_page()

    def send_request(self,url):
        '''
        用来发送请求的方法
        :return: 返回网页源码
        '''
        # 请求出错时,重复请求3次,
        i = 0
        while i <= 3:
            try:
                print u"[INFO]请求url:"+url
                html = requests.get(url=url,headers=self.headers).content
            except Exception as e:
                print u'[INFO] %s%s'% (e,url)
                i += 1
            else:
                return html

    def parse_page(self):
        '''
        解析网站源码,并采用xpath提取 电影名称和平分放到队列中
        :return:
        '''
        response = self.send_request(self.url)
        html = etree.HTML(response)
        # 获取到一页的电影数据
        node_list = html.xpath("//div[@class='info']")
        for move in node_list:
            # 电影名称
            title = move.xpath('.//a/span/text()')[0]
            # 评分
            score = move.xpath('.//div[@class="bd"]//span[@class="rating_num"]/text()')[0]

            # 将每一部电影的名称跟评分加入到队列
            self.q.put(score + "\t" + title)


def main():
    # 创建一个队列用来保存进程获取到的数据
    q = Queue()
    base_url = 'https://movie.douban.com/top250?start='
    # 构造所有url
    url_list = [base_url+str(num) for num in range(0,225+1,25)]

    # 保存线程
    Thread_list = []
    # 创建并启动线程
    for url in url_list:
        p = DouBanSpider(url,q)
        p.start()
        Thread_list.append(p)

    # 让主线程等待子线程执行完成
    for i in Thread_list:
        i.join()

    while not q.empty():
        print q.get()

if __name__=="__main__":

    start = time.time()
    main()
    print '[info]耗时:%s'%(time.time()-start)

  

 澳门葡京备用网址 5

 

 

运用协程爬取,耗时15S,

澳门葡京备用网址 6

#!/usr/bin/env python2
# -*- coding=utf-8 -*-

from Queue import Queue
import time
from lxml import etree
import requests
import gevent

# 打上猴子补丁
from gevent import monkey
monkey.patch_all()

class DouBanSpider(object):
    def __init__(self):
        # 创建一个队列用来保存进程获取到的数据
        self.q = Queue()
        self.headers = {
            'Cookie': 'll="118282"; bid=ctyiEarSLfw; ps=y; __yadk_uid=0Sr85yZ9d4bEeLKhv4w3695OFOPoedzC; dbcl2="155150959:OEu4dds1G1o"; as="https://sec.douban.com/b?r=https%3A%2F%2Fbook.douban.com%2F"; ck=fTrQ; _pk_id.100001.4cf6=c86baf05e448fb8d.1506160776.3.1507290432.1507283501.; _pk_ses.100001.4cf6=*; __utma=30149280.1633528206.1506160772.1507283346.1507290433.3; __utmb=30149280.0.10.1507290433; __utmc=30149280; __utmz=30149280.1506160772.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); __utma=223695111.1475767059.1506160772.1507283346.1507290433.3; __utmb=223695111.0.10.1507290433; __utmc=223695111; __utmz=223695111.1506160772.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); push_noty_num=0; push_doumail_num=0',
            'Host': 'movie.douban.com',
            'Referer': 'https://movie.douban.com/top250?start=225&filter=',
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.104 Safari/537.36',
        }

    def run(self,url):
        self.parse_page(url)

    def send_request(self,url):
        '''
        用来发送请求的方法
        :return: 返回网页源码
        '''
        # 请求出错时,重复请求3次,
        i = 0
        while i <= 3:
            try:
                print u"[INFO]请求url:"+url
                html = requests.get(url=url,headers=self.headers).content
            except Exception as e:
                print u'[INFO] %s%s'% (e,url)
                i += 1
            else:
                return html

    def parse_page(self,url):
        '''
        解析网站源码,并采用xpath提取 电影名称和平分放到队列中
        :return:
        '''
        response = self.send_request(url)
        html = etree.HTML(response)
        # 获取到一页的电影数据
        node_list = html.xpath("//div[@class='info']")
        for move in node_list:
            # 电影名称
            title = move.xpath('.//a/span/text()')[0]
            # 评分
            score = move.xpath('.//div[@class="bd"]//span[@class="rating_num"]/text()')[0]

            # 将每一部电影的名称跟评分加入到队列
            self.q.put(score + "\t" + title)


    def main(self):


        base_url = 'https://movie.douban.com/top250?start='
        # 构造所有url
        url_list = [base_url+str(num) for num in range(0,225+1,25)]
        # 创建协程并执行
        job_list = [gevent.spawn(self.run,url) for url in url_list]
        # 让线程等待所有任务完成,再继续执行。
        gevent.joinall(job_list)

        while not self.q.empty():
            print self.q.get()

if __name__=="__main__":
    start = time.time()
    douban = DouBanSpider()
    douban.main()
    print '[info]耗时:%s'%(time.time()-start)

gevent

 

 澳门葡京备用网址 7

 

 

用了多进度,二十多线程,协程,完成的代码都一模一样,没有测试出鲜明的百般好!都不分上下,只怕跟网络,大概服务器配置有关。

但辩解上的话线程,协程在I/O密集的操作品质是要大于进度的。

 

也大概是本身的办法有题目,还望大神们求教!

 

多进度/二十八线程/协程
写爬虫以及品质比较,牛逼的分分钟就将一个网站爬下来!,python爬虫
首先我们来询问下python中的进度,线程…

  进度是2个主次在三个数目汇总的一次动态执行进程,可以领会为“正在执行的顺序”。进度一般由程序集、数据集、进程控制块三局地组成。进度是系统举办财富分配和调度的宗旨单位,是操作系统的基本功。进度是线程的器皿,进度是程序的实体。

率先大家来询问下python中的进度,线程以及协程!

率先我们来打探下python中的进度,线程以及协程!

  程序集:讲述过程要达成哪些职能以及如何成功

从总结机硬件角度:

从计算机硬件角度:

  数据集:次第在举行进度所急需利用的财富

微机的中坚是CPU,承担了具备的测算职分。
二个CPU,在多少个小时切片里只好运营一个主次。

电脑的宗旨是CPU,承担了具备的总结职责。
3个CPU,在多个岁月切片里只好运维一个主次。

  过程控制块:保留程序运维的意况

 

 

  进程的局限性是成立、取消和切换的支付相比大。

从操作系统的角度:

从操作系统的角度:

二、线程

经过和线程,都以一种CPU的执行单元。

经过和线程,都以一种CPU的实践单元。

  线程也叫轻量级进程,它是叁个主导的CPU执行单元,也是程序执行的微小单位。2个进度最少有二个主线程。

经过:表示三个程序的上下文执行活动(打开、执行、保存…)

进程:表示三个程序的上下文执行活动(打开、执行、保存…)

  线程的长处:减小了先后现身执行的用度,提升了系统的产出质量。

线程:进度执行顺序时候的小小调度单位(执行a,执行b…)

线程:进度执行顺序时候的细小调度单位(执行a,执行b…)

  线程的通病:线程没有本身的系统能源,唯有运营时不可缺失的能源,可是同样进度的各线程可以共享进程所拥有的系统财富。对于有些独占能源存在锁机制,处理不当会现出死锁。

一个主次至少有四个历程,一个进度至少有一个线程。

一个主次至少有贰个历程,一个历程至少有一个线程。

三、协程

 

 

  协程是一种用户态的轻量级线程,又称微线程。协程调度完全由用户控制,相当于子程序。

并行 和 并发:

并行 和 并发:

  协程的独到之处:协程执行效能高。因为子程序切换不是线程切换,由程序自己控制,没无线程切换的支付。

相互:八个CPU主题,差别的先后就分配给差别的CPU来运作。能够让五个程序同时进行。

互相:多少个CPU大旨,不相同的先后就分配给不相同的CPU来运作。可以让多少个程序同时举行。

        协程不须要四线程的锁机制。在协程中控制共享财富不加锁,只须求判定状态就好

cpu1 ————-
cpu2 ————-
cpu3 ————-
cpu4 ————-

cpu1 ————-
cpu2 ————-
cpu3 ————-
cpu4 ————-

④ 、进度和线程不一致

并发:单个CPU核心,在2个年华切片里3次只好运转多个顺序,假若须要周转八个程序,则串行执行。

出现:单个CPU主题,在一个光阴切片里3遍只好运维贰个顺序,假使急需周转几个程序,则串行执行。

  ① 、财富方面:进度间互动独立,同一进程的各线程间共享。某进程内的线程在其他进度不可知

cpu1  —-  —-

cpu1  —-  —-

澳门葡京备用网址,  二 、通讯:进度间通讯IPC,进程间可以从来读写进度数据段举办通信——须要进度同步和排斥手段帮衬,以保障数据的一致性

cpu1    —-  —-

cpu1    —-  —-

  ③ 、调度和切换:线程上下文切换比进度上下文切换要快的多

 

 

  四 、在二十四线程OS中,线程不是三个可举行的实体

多进程/多线程:
表示可以而且施行五个职分,进度和线程的调度是由操作系统自动完结。

多进程/多线程:
表示可以而且推行八个义务,进程和线程的调度是由操作系统自动达成。

5、并发并行

经过:每一种进程都有协调单身的内存空间,不相同进度之间的内存空间不共享。
进度之间的通讯有操作系统传递,导致通信功能低,切换花费大。

经过:逐个进程都有友好独立的内存空间,不一样进度之间的内存空间不共享。
进度之间的通讯有操作系统传递,导致通信效用低,切换费用大。

  壹 、并行是两个或然三个时刻在同一时半刻刻发生的;而出现是五个恐怕七个时刻在同目前间间隔暴发。

线程:3个历程可以有四个线程,全体线程共享进程的内存空间,通信作用高,切换开支小。

线程:三个进度能够有四个线程,全数线程共享进度的内存空间,通信功能高,切换开支小。

  ② 、并行是在不一致实体上的五个事件,并发是同一实体上四个事件

共享意味着竞争,导致数据不安全,为了保证内存空间的多寡安全,引入”互斥锁”。

共享意味着竞争,导致数据不安全,为了爱慕内存空间的数额安全,引入”互斥锁”。

  三 、在一台机械上还要处理三个公文;在四个总结机上同时处理七个职务

贰个线程在拜访内存空间的时候,其他线程不容许访问,必须等待从前的线程访问为止,才能利用那么些内存空间。

三个线程在造访内存空间的时候,其余线程不容许访问,必须等待此前的线程访问停止,才能应用这几个内存空间。

  解释:

互斥锁:一种安全有序的让四个线程访问内存空间的机制。

互斥锁:一种安全平稳的让三个线程访问内存空间的机制。

    并行:同时做不一样工作的力量

 

 

    并发:交替做分化工作的能力

Python的三二十四线程:

Python的二十四线程:

  专业术语:

GIL 全局解释器锁:线程的履行权限,在Python的历程里只有3个GIL。

GIL 全局解释器锁:线程的实践权限,在Python的经过里唯有一个GIL。

    并行:区其余代码块同时执行

1个线程要求执行义务,必须取得GIL。

1个线程要求举行义务,必须取得GIL。

    并发:不一样的代码块交替执行

便宜:直接杜绝了几个线程访问内存空间的安全难题。
坏处:Python的二十八线程不是实在八线程,无法丰硕利用多核CPU的财富。

好处:直接杜绝了多少个线程访问内存空间的嘉峪关难题。
弊病:Python的十二线程不是的确二十多线程,不可以丰富利用多核CPU的财富。

  并行并发的含义:

不过,在I/O阻塞的时候,解释器会自由GIL。

唯独,在I/O阻塞的时候,解释器会自由GIL。

    并发和互动都得以拍卖“多职分”,二者的重点差异在于是还是不是是“同时开展”多少个的天职。

所以:

所以:

    但是涉及到任务分解(有先后着重的职务就不可能一呵而就相互)、使时局行(只怕要考虑互斥、锁、共享等)、结果合并

多进度:密集CPU任务,需求充分行使多核CPU能源(服务器,大批量的并行总计)的时候,用多进度。
multiprocessing
症结:多少个进程之间通讯开销高,切换费用大。

多进度:密集CPU职责,必要充足运用多核CPU财富(服务器,大批量的并行总计)的时候,用多进程。
multiprocessing
症结:三个经过之间通讯花费高,切换费用大。

                下一篇作品再贴代码

十二线程:密集I/O义务(网络I/O,磁盘I/O,数据库I/O)使用多线程合适。
threading.Thread、multiprocessing.dummy
缺点:同三个岁月切片只能运维三个线程,无法不负众望高并行,可是足以完结高并发。

八线程:密集I/O职务(网络I/O,磁盘I/O,数据库I/O)使用多线程合适。
threading.Thread、multiprocessing.dummy
缺点:同一个岁月切片只可以运营3个线程,无法不负众望高并行,不过足以成功高并发。

 

协程:又称微线程,在单线程上推行多个义务,用函数切换,开销极小。不通过操作系统调度,没有经过、线程的切换开支。genvent,monkey.patchall

协程:又称微线程,在单线程上举办多少个任务,用函数切换,开销极小。不通过操作系统调度,没有经过、线程的切换开支。genvent,monkey.patchall

八线程请求再次回到是无序的,这个线程有数量再次回到就处理极度线程,而协程再次回到的数码是逐步的。

二十四线程请求重临是无序的,那些线程有数量重返就处理极度线程,而协程重回的数目是铁板钉钉的。

症结:单线程执行,处理密集CPU和当地磁盘IO的时候,品质较低。处理互联网I/O质量依然相比较高.

缺陷:单线程执行,处理密集CPU和本地磁盘IO的时候,品质较低。处理互联网I/O质量如故比较高.

 

 

上边以那些网站为例,采用二种方法爬取。爬取前250名的影片。。

下边以那些网站为例,选拔三种办法爬取。爬取前250名的影视。。

 通过分析网页发现第②页的url start=25,第二页的url
start=50,第③页的start=75。因而得以汲取这一个网站每一页的数局是透过递增start那几个参数获取的。

 通过分析网页发现第一页的url start=25,第1页的url
start=50,第二页的start=75。因而得以汲取那么些网站每一页的数局是透过递增start这几个参数获取的。

貌似不看率先页的数据,第3页的远非参考价值。

貌似不看率先页的数额,第二页的尚未参考价值。

澳门葡京备用网址 8

澳门葡京备用网址 9

 

 

本次我们紧要爬取,电影名字跟评分。只是利用不同措施去对待下差距点,所以数据方面就可是多领取恐怕封存。只是简单的将其爬取下打印出来看看。

本次我们重点爬取,电影名字跟评分。只是利用不相同方式去对待下差距点,所以数据方面就只是多领取或许封存。只是简短的将其爬取下打印出来看看。

首先:采取多进度 , multiprocessing 模块。
当然那一个耗时更互连网好坏有关。在一切要呼吁都符合规律的情状下耗时15s多。

先是:采取多进度 , multiprocessing 模块。
当然那几个耗时更网络好坏有关。在全方位要央浼都健康的意况下耗时15s多。

 

 

澳门葡京备用网址 10澳门葡京备用网址 11

澳门葡京备用网址 12澳门葡京备用网址 13

#!/usr/bin/env python2
# -*- coding=utf-8 -*-

from multiprocessing import Process, Queue

import time
from lxml import etree
import requests


class DouBanSpider(Process):
    def __init__(self, url, q):
        # 重写写父类的__init__方法
        super(DouBanSpider, self).__init__()
        self.url = url
        self.q = q
        self.headers = {
            'Host': 'movie.douban.com',
            'Referer': 'https://movie.douban.com/top250?start=225&filter=',
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.104 Safari/537.36',
        }

    def run(self):
        self.parse_page()

    def send_request(self,url):
        '''
        用来发送请求的方法
        :return: 返回网页源码
        '''
        # 请求出错时,重复请求3次,
        i = 0
        while i <= 3:
            try:
                print u"[INFO]请求url:"+url
                return requests.get(url=url,headers=self.headers).content
            except Exception as e:
                print u'[INFO] %s%s'% (e,url)
                i += 1

    def parse_page(self):
        '''
        解析网站源码,并采用xpath提取 电影名称和平分放到队列中
        :return:
        '''
        response = self.send_request(self.url)
        html = etree.HTML(response)
        # 获取到一页的电影数据
        node_list = html.xpath("//div[@class='info']")
        for move in node_list:
            # 电影名称
            title = move.xpath('.//a/span/text()')[0]
            # 评分
            score = move.xpath('.//div[@class="bd"]//span[@class="rating_num"]/text()')[0]

            # 将每一部电影的名称跟评分加入到队列
            self.q.put(score + "\t" + title)


def main():
    # 创建一个队列用来保存进程获取到的数据
    q = Queue()
    base_url = 'https://movie.douban.com/top250?start='
    # 构造所有url
    url_list = [base_url+str(num) for num in range(0,225+1,25)]

    # 保存进程
    Process_list = []
    # 创建并启动进程
    for url in url_list:
        p = DouBanSpider(url,q)
        p.start()
        Process_list.append(p)

    # 让主进程等待子进程执行完成
    for i in Process_list:
        i.join()

    while not q.empty():
        print q.get()

if __name__=="__main__":

    start = time.time()
    main()
    print '[info]耗时:%s'%(time.time()-start)
#!/usr/bin/env python2
# -*- coding=utf-8 -*-

from multiprocessing import Process, Queue

import time
from lxml import etree
import requests


class DouBanSpider(Process):
    def __init__(self, url, q):
        # 重写写父类的__init__方法
        super(DouBanSpider, self).__init__()
        self.url = url
        self.q = q
        self.headers = {
            'Host': 'movie.douban.com',
            'Referer': 'https://movie.douban.com/top250?start=225&filter=',
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.104 Safari/537.36',
        }

    def run(self):
        self.parse_page()

    def send_request(self,url):
        '''
        用来发送请求的方法
        :return: 返回网页源码
        '''
        # 请求出错时,重复请求3次,
        i = 0
        while i <= 3:
            try:
                print u"[INFO]请求url:"+url
                return requests.get(url=url,headers=self.headers).content
            except Exception as e:
                print u'[INFO] %s%s'% (e,url)
                i += 1

    def parse_page(self):
        '''
        解析网站源码,并采用xpath提取 电影名称和平分放到队列中
        :return:
        '''
        response = self.send_request(self.url)
        html = etree.HTML(response)
        # 获取到一页的电影数据
        node_list = html.xpath("//div[@class='info']")
        for move in node_list:
            # 电影名称
            title = move.xpath('.//a/span/text()')[0]
            # 评分
            score = move.xpath('.//div[@class="bd"]//span[@class="rating_num"]/text()')[0]

            # 将每一部电影的名称跟评分加入到队列
            self.q.put(score + "\t" + title)


def main():
    # 创建一个队列用来保存进程获取到的数据
    q = Queue()
    base_url = 'https://movie.douban.com/top250?start='
    # 构造所有url
    url_list = [base_url+str(num) for num in range(0,225+1,25)]

    # 保存进程
    Process_list = []
    # 创建并启动进程
    for url in url_list:
        p = DouBanSpider(url,q)
        p.start()
        Process_list.append(p)

    # 让主进程等待子进程执行完成
    for i in Process_list:
        i.join()

    while not q.empty():
        print q.get()

if __name__=="__main__":

    start = time.time()
    main()
    print '[info]耗时:%s'%(time.time()-start)

Process多进度已毕

Process多进度完毕

#!/usr/bin/env python2
# -*- coding=utf-8 -*-

from multiprocessing import Process, Queue

import time
from lxml import etree
import requests


class DouBanSpider(Process):
    def __init__(self, url, q):
        # 重写写父类的__init__方法
        super(DouBanSpider, self).__init__()
        self.url = url
        self.q = q
        self.headers = {
            'Host': 'movie.douban.com',
            'Referer': 'https://movie.douban.com/top250?start=225&filter=',
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.104 Safari/537.36',
        }

    def run(self):
        self.parse_page()

    def send_request(self,url):
        '''
        用来发送请求的方法
        :return: 返回网页源码
        '''
        # 请求出错时,重复请求3次,
        i = 0
        while i <= 3:
            try:
                print u"[INFO]请求url:"+url
                return requests.get(url=url,headers=self.headers).content
            except Exception as e:
                print u'[INFO] %s%s'% (e,url)
                i += 1

    def parse_page(self):
        '''
        解析网站源码,并采用xpath提取 电影名称和平分放到队列中
        :return:
        '''
        response = self.send_request(self.url)
        html = etree.HTML(response)
        # 获取到一页的电影数据
        node_list = html.xpath("//div[@class='info']")
        for move in node_list:
            # 电影名称
            title = move.xpath('.//a/span/text()')[0]
            # 评分
            score = move.xpath('.//div[@class="bd"]//span[@class="rating_num"]/text()')[0]

            # 将每一部电影的名称跟评分加入到队列
            self.q.put(score + "\t" + title)


def main():
    # 创建一个队列用来保存进程获取到的数据
    q = Queue()
    base_url = 'https://movie.douban.com/top250?start='
    # 构造所有url
    url_list = [base_url+str(num) for num in range(0,225+1,25)]

    # 保存进程
    Process_list = []
    # 创建并启动进程
    for url in url_list:
        p = DouBanSpider(url,q)
        p.start()
        Process_list.append(p)

    # 让主进程等待子进程执行完成
    for i in Process_list:
        i.join()

    while not q.empty():
        print q.get()

if __name__=="__main__":

    start = time.time()
    main()
    print '[info]耗时:%s'%(time.time()-start)
#!/usr/bin/env python2
# -*- coding=utf-8 -*-

from multiprocessing import Process, Queue

import time
from lxml import etree
import requests


class DouBanSpider(Process):
    def __init__(self, url, q):
        # 重写写父类的__init__方法
        super(DouBanSpider, self).__init__()
        self.url = url
        self.q = q
        self.headers = {
            'Host': 'movie.douban.com',
            'Referer': 'https://movie.douban.com/top250?start=225&filter=',
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.104 Safari/537.36',
        }

    def run(self):
        self.parse_page()

    def send_request(self,url):
        '''
        用来发送请求的方法
        :return: 返回网页源码
        '''
        # 请求出错时,重复请求3次,
        i = 0
        while i <= 3:
            try:
                print u"[INFO]请求url:"+url
                return requests.get(url=url,headers=self.headers).content
            except Exception as e:
                print u'[INFO] %s%s'% (e,url)
                i += 1

    def parse_page(self):
        '''
        解析网站源码,并采用xpath提取 电影名称和平分放到队列中
        :return:
        '''
        response = self.send_request(self.url)
        html = etree.HTML(response)
        # 获取到一页的电影数据
        node_list = html.xpath("//div[@class='info']")
        for move in node_list:
            # 电影名称
            title = move.xpath('.//a/span/text()')[0]
            # 评分
            score = move.xpath('.//div[@class="bd"]//span[@class="rating_num"]/text()')[0]

            # 将每一部电影的名称跟评分加入到队列
            self.q.put(score + "\t" + title)


def main():
    # 创建一个队列用来保存进程获取到的数据
    q = Queue()
    base_url = 'https://movie.douban.com/top250?start='
    # 构造所有url
    url_list = [base_url+str(num) for num in range(0,225+1,25)]

    # 保存进程
    Process_list = []
    # 创建并启动进程
    for url in url_list:
        p = DouBanSpider(url,q)
        p.start()
        Process_list.append(p)

    # 让主进程等待子进程执行完成
    for i in Process_list:
        i.join()

    while not q.empty():
        print q.get()

if __name__=="__main__":

    start = time.time()
    main()
    print '[info]耗时:%s'%(time.time()-start)

  

  

澳门葡京备用网址 14

澳门葡京备用网址 15

 

 

 

 

 

 

  拔取四线程时,耗时10.4s

  选择多线程时,耗时10.4s

 

 

澳门葡京备用网址 16澳门葡京备用网址 17

澳门葡京备用网址 18澳门葡京备用网址 19

#!/usr/bin/env python2
# -*- coding=utf-8 -*-

from threading import Thread
from Queue import Queue
import time
from lxml import etree
import requests


class DouBanSpider(Thread):
    def __init__(self, url, q):
        # 重写写父类的__init__方法
        super(DouBanSpider, self).__init__()
        self.url = url
        self.q = q
        self.headers = {
            'Cookie': 'll="118282"; bid=ctyiEarSLfw; ps=y; __yadk_uid=0Sr85yZ9d4bEeLKhv4w3695OFOPoedzC; dbcl2="155150959:OEu4dds1G1o"; as="https://sec.douban.com/b?r=https%3A%2F%2Fbook.douban.com%2F"; ck=fTrQ; _pk_id.100001.4cf6=c86baf05e448fb8d.1506160776.3.1507290432.1507283501.; _pk_ses.100001.4cf6=*; __utma=30149280.1633528206.1506160772.1507283346.1507290433.3; __utmb=30149280.0.10.1507290433; __utmc=30149280; __utmz=30149280.1506160772.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); __utma=223695111.1475767059.1506160772.1507283346.1507290433.3; __utmb=223695111.0.10.1507290433; __utmc=223695111; __utmz=223695111.1506160772.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); push_noty_num=0; push_doumail_num=0',
            'Host': 'movie.douban.com',
            'Referer': 'https://movie.douban.com/top250?start=225&filter=',
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.104 Safari/537.36',
        }

    def run(self):
        self.parse_page()

    def send_request(self,url):
        '''
        用来发送请求的方法
        :return: 返回网页源码
        '''
        # 请求出错时,重复请求3次,
        i = 0
        while i <= 3:
            try:
                print u"[INFO]请求url:"+url
                html = requests.get(url=url,headers=self.headers).content
            except Exception as e:
                print u'[INFO] %s%s'% (e,url)
                i += 1
            else:
                return html

    def parse_page(self):
        '''
        解析网站源码,并采用xpath提取 电影名称和平分放到队列中
        :return:
        '''
        response = self.send_request(self.url)
        html = etree.HTML(response)
        # 获取到一页的电影数据
        node_list = html.xpath("//div[@class='info']")
        for move in node_list:
            # 电影名称
            title = move.xpath('.//a/span/text()')[0]
            # 评分
            score = move.xpath('.//div[@class="bd"]//span[@class="rating_num"]/text()')[0]

            # 将每一部电影的名称跟评分加入到队列
            self.q.put(score + "\t" + title)


def main():
    # 创建一个队列用来保存进程获取到的数据
    q = Queue()
    base_url = 'https://movie.douban.com/top250?start='
    # 构造所有url
    url_list = [base_url+str(num) for num in range(0,225+1,25)]

    # 保存线程
    Thread_list = []
    # 创建并启动线程
    for url in url_list:
        p = DouBanSpider(url,q)
        p.start()
        Thread_list.append(p)

    # 让主线程等待子线程执行完成
    for i in Thread_list:
        i.join()

    while not q.empty():
        print q.get()

if __name__=="__main__":

    start = time.time()
    main()
    print '[info]耗时:%s'%(time.time()-start)
#!/usr/bin/env python2
# -*- coding=utf-8 -*-

from threading import Thread
from Queue import Queue
import time
from lxml import etree
import requests


class DouBanSpider(Thread):
    def __init__(self, url, q):
        # 重写写父类的__init__方法
        super(DouBanSpider, self).__init__()
        self.url = url
        self.q = q
        self.headers = {
            'Cookie': 'll="118282"; bid=ctyiEarSLfw; ps=y; __yadk_uid=0Sr85yZ9d4bEeLKhv4w3695OFOPoedzC; dbcl2="155150959:OEu4dds1G1o"; as="https://sec.douban.com/b?r=https%3A%2F%2Fbook.douban.com%2F"; ck=fTrQ; _pk_id.100001.4cf6=c86baf05e448fb8d.1506160776.3.1507290432.1507283501.; _pk_ses.100001.4cf6=*; __utma=30149280.1633528206.1506160772.1507283346.1507290433.3; __utmb=30149280.0.10.1507290433; __utmc=30149280; __utmz=30149280.1506160772.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); __utma=223695111.1475767059.1506160772.1507283346.1507290433.3; __utmb=223695111.0.10.1507290433; __utmc=223695111; __utmz=223695111.1506160772.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); push_noty_num=0; push_doumail_num=0',
            'Host': 'movie.douban.com',
            'Referer': 'https://movie.douban.com/top250?start=225&filter=',
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.104 Safari/537.36',
        }

    def run(self):
        self.parse_page()

    def send_request(self,url):
        '''
        用来发送请求的方法
        :return: 返回网页源码
        '''
        # 请求出错时,重复请求3次,
        i = 0
        while i <= 3:
            try:
                print u"[INFO]请求url:"+url
                html = requests.get(url=url,headers=self.headers).content
            except Exception as e:
                print u'[INFO] %s%s'% (e,url)
                i += 1
            else:
                return html

    def parse_page(self):
        '''
        解析网站源码,并采用xpath提取 电影名称和平分放到队列中
        :return:
        '''
        response = self.send_request(self.url)
        html = etree.HTML(response)
        # 获取到一页的电影数据
        node_list = html.xpath("//div[@class='info']")
        for move in node_list:
            # 电影名称
            title = move.xpath('.//a/span/text()')[0]
            # 评分
            score = move.xpath('.//div[@class="bd"]//span[@class="rating_num"]/text()')[0]

            # 将每一部电影的名称跟评分加入到队列
            self.q.put(score + "\t" + title)


def main():
    # 创建一个队列用来保存进程获取到的数据
    q = Queue()
    base_url = 'https://movie.douban.com/top250?start='
    # 构造所有url
    url_list = [base_url+str(num) for num in range(0,225+1,25)]

    # 保存线程
    Thread_list = []
    # 创建并启动线程
    for url in url_list:
        p = DouBanSpider(url,q)
        p.start()
        Thread_list.append(p)

    # 让主线程等待子线程执行完成
    for i in Thread_list:
        i.join()

    while not q.empty():
        print q.get()

if __name__=="__main__":

    start = time.time()
    main()
    print '[info]耗时:%s'%(time.time()-start)

thread

thread

#!/usr/bin/env python2
# -*- coding=utf-8 -*-

from threading import Thread
from Queue import Queue
import time
from lxml import etree
import requests


class DouBanSpider(Thread):
    def __init__(self, url, q):
        # 重写写父类的__init__方法
        super(DouBanSpider, self).__init__()
        self.url = url
        self.q = q
        self.headers = {
            'Cookie': 'll="118282"; bid=ctyiEarSLfw; ps=y; __yadk_uid=0Sr85yZ9d4bEeLKhv4w3695OFOPoedzC; dbcl2="155150959:OEu4dds1G1o"; as="https://sec.douban.com/b?r=https%3A%2F%2Fbook.douban.com%2F"; ck=fTrQ; _pk_id.100001.4cf6=c86baf05e448fb8d.1506160776.3.1507290432.1507283501.; _pk_ses.100001.4cf6=*; __utma=30149280.1633528206.1506160772.1507283346.1507290433.3; __utmb=30149280.0.10.1507290433; __utmc=30149280; __utmz=30149280.1506160772.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); __utma=223695111.1475767059.1506160772.1507283346.1507290433.3; __utmb=223695111.0.10.1507290433; __utmc=223695111; __utmz=223695111.1506160772.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); push_noty_num=0; push_doumail_num=0',
            'Host': 'movie.douban.com',
            'Referer': 'https://movie.douban.com/top250?start=225&filter=',
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.104 Safari/537.36',
        }

    def run(self):
        self.parse_page()

    def send_request(self,url):
        '''
        用来发送请求的方法
        :return: 返回网页源码
        '''
        # 请求出错时,重复请求3次,
        i = 0
        while i <= 3:
            try:
                print u"[INFO]请求url:"+url
                html = requests.get(url=url,headers=self.headers).content
            except Exception as e:
                print u'[INFO] %s%s'% (e,url)
                i += 1
            else:
                return html

    def parse_page(self):
        '''
        解析网站源码,并采用xpath提取 电影名称和平分放到队列中
        :return:
        '''
        response = self.send_request(self.url)
        html = etree.HTML(response)
        # 获取到一页的电影数据
        node_list = html.xpath("//div[@class='info']")
        for move in node_list:
            # 电影名称
            title = move.xpath('.//a/span/text()')[0]
            # 评分
            score = move.xpath('.//div[@class="bd"]//span[@class="rating_num"]/text()')[0]

            # 将每一部电影的名称跟评分加入到队列
            self.q.put(score + "\t" + title)


def main():
    # 创建一个队列用来保存进程获取到的数据
    q = Queue()
    base_url = 'https://movie.douban.com/top250?start='
    # 构造所有url
    url_list = [base_url+str(num) for num in range(0,225+1,25)]

    # 保存线程
    Thread_list = []
    # 创建并启动线程
    for url in url_list:
        p = DouBanSpider(url,q)
        p.start()
        Thread_list.append(p)

    # 让主线程等待子线程执行完成
    for i in Thread_list:
        i.join()

    while not q.empty():
        print q.get()

if __name__=="__main__":

    start = time.time()
    main()
    print '[info]耗时:%s'%(time.time()-start)
#!/usr/bin/env python2
# -*- coding=utf-8 -*-

from threading import Thread
from Queue import Queue
import time
from lxml import etree
import requests


class DouBanSpider(Thread):
    def __init__(self, url, q):
        # 重写写父类的__init__方法
        super(DouBanSpider, self).__init__()
        self.url = url
        self.q = q
        self.headers = {
            'Cookie': 'll="118282"; bid=ctyiEarSLfw; ps=y; __yadk_uid=0Sr85yZ9d4bEeLKhv4w3695OFOPoedzC; dbcl2="155150959:OEu4dds1G1o"; as="https://sec.douban.com/b?r=https%3A%2F%2Fbook.douban.com%2F"; ck=fTrQ; _pk_id.100001.4cf6=c86baf05e448fb8d.1506160776.3.1507290432.1507283501.; _pk_ses.100001.4cf6=*; __utma=30149280.1633528206.1506160772.1507283346.1507290433.3; __utmb=30149280.0.10.1507290433; __utmc=30149280; __utmz=30149280.1506160772.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); __utma=223695111.1475767059.1506160772.1507283346.1507290433.3; __utmb=223695111.0.10.1507290433; __utmc=223695111; __utmz=223695111.1506160772.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); push_noty_num=0; push_doumail_num=0',
            'Host': 'movie.douban.com',
            'Referer': 'https://movie.douban.com/top250?start=225&filter=',
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.104 Safari/537.36',
        }

    def run(self):
        self.parse_page()

    def send_request(self,url):
        '''
        用来发送请求的方法
        :return: 返回网页源码
        '''
        # 请求出错时,重复请求3次,
        i = 0
        while i <= 3:
            try:
                print u"[INFO]请求url:"+url
                html = requests.get(url=url,headers=self.headers).content
            except Exception as e:
                print u'[INFO] %s%s'% (e,url)
                i += 1
            else:
                return html

    def parse_page(self):
        '''
        解析网站源码,并采用xpath提取 电影名称和平分放到队列中
        :return:
        '''
        response = self.send_request(self.url)
        html = etree.HTML(response)
        # 获取到一页的电影数据
        node_list = html.xpath("//div[@class='info']")
        for move in node_list:
            # 电影名称
            title = move.xpath('.//a/span/text()')[0]
            # 评分
            score = move.xpath('.//div[@class="bd"]//span[@class="rating_num"]/text()')[0]

            # 将每一部电影的名称跟评分加入到队列
            self.q.put(score + "\t" + title)


def main():
    # 创建一个队列用来保存进程获取到的数据
    q = Queue()
    base_url = 'https://movie.douban.com/top250?start='
    # 构造所有url
    url_list = [base_url+str(num) for num in range(0,225+1,25)]

    # 保存线程
    Thread_list = []
    # 创建并启动线程
    for url in url_list:
        p = DouBanSpider(url,q)
        p.start()
        Thread_list.append(p)

    # 让主线程等待子线程执行完成
    for i in Thread_list:
        i.join()

    while not q.empty():
        print q.get()

if __name__=="__main__":

    start = time.time()
    main()
    print '[info]耗时:%s'%(time.time()-start)

  

  

 澳门葡京备用网址 20

 澳门葡京备用网址 21

 

 

 

 

利用协程爬取,耗时15S,

运用协程爬取,耗时15S,

澳门葡京备用网址 22澳门葡京备用网址 23

澳门葡京备用网址 24澳门葡京备用网址 25

#!/usr/bin/env python2
# -*- coding=utf-8 -*-

from Queue import Queue
import time
from lxml import etree
import requests
import gevent

# 打上猴子补丁
from gevent import monkey
monkey.patch_all()

class DouBanSpider(object):
    def __init__(self):
        # 创建一个队列用来保存进程获取到的数据
        self.q = Queue()
        self.headers = {
            'Cookie': 'll="118282"; bid=ctyiEarSLfw; ps=y; __yadk_uid=0Sr85yZ9d4bEeLKhv4w3695OFOPoedzC; dbcl2="155150959:OEu4dds1G1o"; as="https://sec.douban.com/b?r=https%3A%2F%2Fbook.douban.com%2F"; ck=fTrQ; _pk_id.100001.4cf6=c86baf05e448fb8d.1506160776.3.1507290432.1507283501.; _pk_ses.100001.4cf6=*; __utma=30149280.1633528206.1506160772.1507283346.1507290433.3; __utmb=30149280.0.10.1507290433; __utmc=30149280; __utmz=30149280.1506160772.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); __utma=223695111.1475767059.1506160772.1507283346.1507290433.3; __utmb=223695111.0.10.1507290433; __utmc=223695111; __utmz=223695111.1506160772.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); push_noty_num=0; push_doumail_num=0',
            'Host': 'movie.douban.com',
            'Referer': 'https://movie.douban.com/top250?start=225&filter=',
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.104 Safari/537.36',
        }

    def run(self,url):
        self.parse_page(url)

    def send_request(self,url):
        '''
        用来发送请求的方法
        :return: 返回网页源码
        '''
        # 请求出错时,重复请求3次,
        i = 0
        while i <= 3:
            try:
                print u"[INFO]请求url:"+url
                html = requests.get(url=url,headers=self.headers).content
            except Exception as e:
                print u'[INFO] %s%s'% (e,url)
                i += 1
            else:
                return html

    def parse_page(self,url):
        '''
        解析网站源码,并采用xpath提取 电影名称和平分放到队列中
        :return:
        '''
        response = self.send_request(url)
        html = etree.HTML(response)
        # 获取到一页的电影数据
        node_list = html.xpath("//div[@class='info']")
        for move in node_list:
            # 电影名称
            title = move.xpath('.//a/span/text()')[0]
            # 评分
            score = move.xpath('.//div[@class="bd"]//span[@class="rating_num"]/text()')[0]

            # 将每一部电影的名称跟评分加入到队列
            self.q.put(score + "\t" + title)


    def main(self):


        base_url = 'https://movie.douban.com/top250?start='
        # 构造所有url
        url_list = [base_url+str(num) for num in range(0,225+1,25)]
        # 创建协程并执行
        job_list = [gevent.spawn(self.run,url) for url in url_list]
        # 让线程等待所有任务完成,再继续执行。
        gevent.joinall(job_list)

        while not self.q.empty():
            print self.q.get()

if __name__=="__main__":
    start = time.time()
    douban = DouBanSpider()
    douban.main()
    print '[info]耗时:%s'%(time.time()-start)
#!/usr/bin/env python2
# -*- coding=utf-8 -*-

from Queue import Queue
import time
from lxml import etree
import requests
import gevent

# 打上猴子补丁
from gevent import monkey
monkey.patch_all()

class DouBanSpider(object):
    def __init__(self):
        # 创建一个队列用来保存进程获取到的数据
        self.q = Queue()
        self.headers = {
            'Cookie': 'll="118282"; bid=ctyiEarSLfw; ps=y; __yadk_uid=0Sr85yZ9d4bEeLKhv4w3695OFOPoedzC; dbcl2="155150959:OEu4dds1G1o"; as="https://sec.douban.com/b?r=https%3A%2F%2Fbook.douban.com%2F"; ck=fTrQ; _pk_id.100001.4cf6=c86baf05e448fb8d.1506160776.3.1507290432.1507283501.; _pk_ses.100001.4cf6=*; __utma=30149280.1633528206.1506160772.1507283346.1507290433.3; __utmb=30149280.0.10.1507290433; __utmc=30149280; __utmz=30149280.1506160772.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); __utma=223695111.1475767059.1506160772.1507283346.1507290433.3; __utmb=223695111.0.10.1507290433; __utmc=223695111; __utmz=223695111.1506160772.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); push_noty_num=0; push_doumail_num=0',
            'Host': 'movie.douban.com',
            'Referer': 'https://movie.douban.com/top250?start=225&filter=',
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.104 Safari/537.36',
        }

    def run(self,url):
        self.parse_page(url)

    def send_request(self,url):
        '''
        用来发送请求的方法
        :return: 返回网页源码
        '''
        # 请求出错时,重复请求3次,
        i = 0
        while i <= 3:
            try:
                print u"[INFO]请求url:"+url
                html = requests.get(url=url,headers=self.headers).content
            except Exception as e:
                print u'[INFO] %s%s'% (e,url)
                i += 1
            else:
                return html

    def parse_page(self,url):
        '''
        解析网站源码,并采用xpath提取 电影名称和平分放到队列中
        :return:
        '''
        response = self.send_request(url)
        html = etree.HTML(response)
        # 获取到一页的电影数据
        node_list = html.xpath("//div[@class='info']")
        for move in node_list:
            # 电影名称
            title = move.xpath('.//a/span/text()')[0]
            # 评分
            score = move.xpath('.//div[@class="bd"]//span[@class="rating_num"]/text()')[0]

            # 将每一部电影的名称跟评分加入到队列
            self.q.put(score + "\t" + title)


    def main(self):


        base_url = 'https://movie.douban.com/top250?start='
        # 构造所有url
        url_list = [base_url+str(num) for num in range(0,225+1,25)]
        # 创建协程并执行
        job_list = [gevent.spawn(self.run,url) for url in url_list]
        # 让线程等待所有任务完成,再继续执行。
        gevent.joinall(job_list)

        while not self.q.empty():
            print self.q.get()

if __name__=="__main__":
    start = time.time()
    douban = DouBanSpider()
    douban.main()
    print '[info]耗时:%s'%(time.time()-start)

gevent

gevent

 

 

 澳门葡京备用网址 26

 澳门葡京备用网址 27

 

 

 

 

用了多进度,二十四线程,协程,完毕的代码都一模一样,没有测试出强烈的百般好!都不分上下,或许跟网络,大概服务器配置有关。

用了多进度,二十八线程,协程,完成的代码都一律,没有测试出显明的不得了好!都不分上下,大概跟互联网,只怕服务器配置有关。

但辩解上的话线程,协程在I/O密集的操作质量是要当先进度的。

但辩解上的话线程,协程在I/O密集的操作质量是要当先进度的。

 

 

也说不定是本人的办法有非常态,还望大神们求教!

也恐怕是本身的措施有难点,还望大神们请教!

 

 

相关文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注

*
*
Website