最新公告
  • 欢迎您光临网站无忧模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • Python爬虫之Scrapy框架基本流程

    正文概述    2020-04-14   333

    Python爬虫之Scrapy框架基本流程

    scrapy结构图:

    Python爬虫之Scrapy框架基本流程

    scrapy组件:

    (1)ENGINE:引擎,框架的核心,其它所有组件在其控制下协同工作。

    (2)SCHEDULER:调度器,负责对SPIDER提交的下载请求进行调度。

    (3)DOWNLOADER:下载器,负责下载页面(发送HTTP请求/接收HTTP响应)。

    (4)SPIDER:爬虫,负责提取页面中的数据,并产生对新页面的下载请求。

    (5)MIDDLEWARE:中间件,负责对Request对象和Response对象进行处理。

    (6)ITEM PIPELINE:数据管道,负责对爬取到的数据进行处理。

    对于用户来说,Spider是最核心的组件,Scrapy爬虫开发是围绕实现Spider展开的。

    框架中的数据流:

    (1)REQUEST:scrapy中的HTTP请求对象。

    (2)RESPONSE:scrapy中的HTTP响应对象。

    (3)ITEM:从页面中爬取的一项数据。

    Request和Response是HTTP协议中的术语,即HTTP请求和HTTP响应,Scrapy框架中定义了相应的Request和Response类,这里的Item代表Spider从页面中爬取的一项数据。

    scrapy大致工作流程:

    (1)当SPIDER要爬取某URL地址的页面时,需使用该URL构造一个Request对象,提交给ENGINE。

    (2)ENGINE将Request对象传给SCHEDULER,SCHEDULER对URL进行去重,按某种算法进行排队,之后的某个时刻SCHEDULER将其出队,将处理好的Request对象返回给ENGINE。

    (3)ENGINE将SCHEDULER处理后的Request对象发送给DOWNLOADER下载页面。

    (4)DOWNLOADER根据MIDDLEWARE的规则,使用Request对象中的URL地址发送一次HTTP请求到网站服务器,之后用服务器返回的HTTP响应构造出一个Response对象,其中包含页面的HTML文本。DOWNLOADER将结果Resopnse对象传给ENGINE。

    (5)ENGINE将Response对象发送给SPIDER的页面解析函数(构造Request对象时指定)进行处理,页面解析函数从页面中提取数据,封装成Item后提交给ENGINE。

    (6)ENGINE将Item送往ITEMPIPELINES进行处理,最终以某种数据格式写入文件(csv,json)或者存储到数据库中。

    整个流程的核心都是围绕着ENGINE进行的。 

    Request对象

    Request对象用来描述一个HTTP请求,下面是其构造器方法的参数列表。

    Request(url, callback=None, method='GET', headers=None, body=None,
                     cookies=None, meta=None, encoding='utf-8', priority=0,
                     dont_filter=False, errback=None, flags=None)
    # url(必选):请求页面的url地址,bytes或str类型,如'http://www.baidu.com'。
    # callback:页面解析函数, Callable类型,Request对象请求的页面下载完成后,由该参数指定的页面解析函数被调用。如果未传递
    该参数,默认调用Spider的parse方法。
    # method:HTTP请求的方法,默认为'GET'。
    # headers:HTTP请求的头部字典,dict类型,例如{'Accept':'text/html', 'User-Agent':Mozilla/5.0'}。如果其中某项的值为
    None,就表示不发送该项HTTP头部,例如{'Cookie':None},禁止发送Cookie。
    # body:HTTP请求的正文,bytes或str类型。
    # cookies:Cookie信息字典,dict类型,例如{'currency':  'USD','country': 'UY'}。
    # meta:Request的元数据字典,dict类型,用于给框架中其他组件传递信息,比如中间件Item  Pipeline。其他组件可以使用
    Request对象的meta属性访问该元数据字典(request.meta),也用于给响应处理函数传递信息,
    #       详见Response的meta属性。
    # encoding:url和body参数的编码默认为'utf-8'。如果传入的url或body参数是str类型,就使用该参数进行编码。
    # priority:请求的优先级默认值为0,优先级高的请求优先下载。
    # dont_filter:默认情况下(dont_filter=False),对同一个url地址多次提交下载请求,后面的请求会被去重过滤器过滤
    (避免重复下载)。如果将该参数置为True,可以使请求避免被过滤,强制下载。例如,在多次爬取
    #             一个内容随时间而变化的页面时(每次使用相同的url),可以将该参数置为True。
    # errback:请求出现异常或者出现HTTP错误时(如404页面不存在)的回调函数。

    虽然参数很多,但除了url参数外,其他都带有默认值。在构造Request对象时,通常我们只需传递一个url参数或再加一个callback参数,其他使用默认值即可。

    Response对象:

    Response对象用来描述一个HTTP响应,Response只是一个基类,根据响应内容的不同有如下子类:

    (1)TextResponse

    (2)HtmlResponse

    (3)XmlResponse

    当一个页面下载完成时,下载器依据HTTP响应头部中的Content-Type信息创建某个Response的子类对象。我们通常爬取的网页,其内容是HTML文本,创建的便是HtmlResponse对象,其中HtmlResponse和XmlResponse是TextResponse的子类。实际上,这3个子类只有细微的差别,这里以HtmlResponse为例进行讲解。

    下面是HtmlResponse对象的属性及方法。

    url:HTTP响应的url地址,str类型。
    status:HTTP响应的状态码,int类型,例如200,404。
    headers:HTTP响应的头头部,类字典类型,可以调用get或getlist方法对其进行访问,例如:response.headers.get('Content-Type')
      response.headers.getlist('Set-Cookie')
    body:HTTP响应正文,bytes类型。
    text:文本形式的HTTP响应正文,str类型,它是由response.body使用response.encoding解码得到的,即reponse.text = 
    response.body.decode(response.encoding)
    encoding:HTTP响应正文的编码,它的值可能是从HTTP响应头部或正文中解析出来的。
    request:产生该HTTP响应的Request对象。
    meta:即response.request.meta,在构造Request对象时,可将要传递给响应处理函数的信息通过meta参数传入;响应处理函数处理
    响应时,通过response.meta将信息取出。
    selector:Selector对象用于在Response中提取数据。
    xpath(query):使用XPath选择器在Response中提取数据,实际上它是response.selector.xpath方法的快捷方式。
    css(query):使用CSS选择器在Response中提取数据,实际上它是response.selector.css方法的快捷方式。
    urljoin(url):用于构造绝对url。当传入的url参数是一个相对地址时,根据response.url计算出相应的绝对url。例如:
    response.url为http://www.example.com/a,url为b/index.html,调用response.urljoin(url)的结果为http://www.example.com 
    /a/b/index.html。

    虽然HtmlResponse对象有很多属性,但最常用的是以下的3个方法:

    (1)xpath(query)

    (2)css(query)

    (3)urljoin(url)

    前两个方法用于提取数据,后一个方法用于构造绝对url。

    相关推荐:《Python视频教程》

    spied开发流程

    实现一个Spider子类的过程很像是完成一系列填空题,Scrapy框架提出以下问题让用户在Spider子类中作答:

    (1)爬虫从哪个或哪些页面开始爬取?

    (2)对于一个已下载的页面,提取其中的哪些数据?

    (3)爬取完当前页面后,接下来爬取哪个或哪些页面?

    实现一个Spider只需要完成下面4个步骤:

    (1)继承scrapy.Spider。

    (2)为Spider取名。

    (3)设定起始爬取点。

    (4)实现页面解析函数。

    scrapy.Spider基类实现了以下内容:

    (1)供Scrapy引擎调用的接口,例如用来创建Spider实例的类方法from_crawler。

    (2)供用户使用的实用工具函数,例如可以调用log方法将调试信息输出到日志。

    (3)供用户访问的属性,例如可以通过settings属性访问配置文件中的配置。

    关于起始URL start_urls:

    Python爬虫之Scrapy框架基本流程

    start_urls通常被实现成一个列表,其中放入所有起始爬取点的url(例子中只有一个起始点)。看到这里,大家可能会想,请求页面下载不是一定要提交Request对象么?而我们仅定义了url列表,是谁

    暗中构造并提交了相应的Request对象呢?

    1.我们将起始URL提交给ENGINE。

    2.ENGINE调用start_requests方法,我们没有实现整个方法,所以调用了基类的start_requests方法。

    3.通过阅读Spider基类的源码可以看到如下内容:

    Python爬虫之Scrapy框架基本流程

    4.基类的start_requests将我们的URL封装成Request对象。

    由此我们知道Request对象是调用基类start_requests方法产生的,因此我们也可以自己定义start_requests方法(覆盖基类Spider的start_requests方法),直接构造并提交起始爬取点的Request对象。在某些场景下使用这种方式更加灵活,例如有时想为Request添加特定的HTTP请求头部,或想为Request指定特定的页面解析函数。

    页面解析函数parse:

    页面解析函数也就是构造Request对象时通过callback参数指定的回调函数(或默认的parse方法)。页面解析函数是实现Spider中最核心的部分,它需要完成以下两项工作:

    (1)使用选择器提取页面中的数据,将数据封装后(Item或字典)提交给Scrapy引擎。

    (2)使用选择器或LinkExtractor提取页面中的链接,用其构造新的Request对象并提交给Scrapy引擎(下载链接页面)。

    一个页面中可能包含多项数据以及多个链接,因此页面解析函数被要求返回一个可迭代对象(通常被实现成一个生成器函数),每次迭代返回一项数据(Item或字典)或一个Request对象。

    Python爬虫之Scrapy框架基本流程

    内容小结:

    (1)了解scrapy的六个组件的功能。

    (2)理解scrapy工作流程。

    相关推荐:

    Python爬虫之scrapy项目创建


    下载网 » Python爬虫之Scrapy框架基本流程

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元