• 5-----Scrapy框架中Spiders用法


    Spider类定义了如何爬去某个网站,包括爬取的动作以及如何从网页内容中提取结构化的数据,总的来说spider就是定义爬取的动作以及分析某个网页

    工作流程分析

    1、以初始的URL初始化Request,并设置回调函数,当该request下载完毕并返回时,将生成response,并作为参数传给回调函数. spider中初始的 requesst是通过 start_requests()来获取的。start_requests()获取 start_urls中的URL,并以 parse以回调函数生成 Request 

    2、在回调函数内分析返回的网页内容,可以返回Item对象,或者 Dict,或者 Request,以及是一个包含三者的可迭代的容器,返回的Request对象之后会经过Scrapy处理,下载相应的内容,并调用设置的 callback函数

    3、在回调函数内,可以通过 lxml,bs4,xpath,css等方法获取我们想要的内容生成 item

    4、最后将 item传递给 Pipeline处理

    我们以通过简单的分析源码来理解
    我通常在写spiders下写爬虫的时候,我们并没有写 start_requests来处理 start_urls中的url,这是因为我们在继承的scrapy.Spider中已经写过了,我们可以点开scrapy.Spider查看分析。

    通过上述代码我们可以看到在父类里这里实现了 start_requests方法,通过 make_requests_from_url做了Request请求
    如下图所示的一个例子,parse回调函数中的 response就是父类列 start_requests方法调用 make_requests_from_url返回的结果,并且在parse回调函数中我们可以继续返回 Request,如下属代码中 yield Request()并设置回调函数。

    spider内的一些常用属性

    我们所有自己写的爬虫都是继承与spider.Spider这个类

    name

    定义爬虫名字,我们通过命令启动的时候用的就是这个名字,这个名字必须是唯一的

    allowed_domains

    包含了spider允许爬取的域名列表。当offsiteMiddleware启用时,域名不在列表中URL不会被访问
    所以在爬虫文件中,每次生成Request请求时都会进行和这里的域名进行判断

    start_urls

    起始的url列表
    这里会通过spider.Spider方法中会调用start_request循环请求这个列表中每个地址。

    custom_settings

    自定义配置,可以覆盖settings的配置,主要用于当我们对爬虫有特定需求设置的时候

    设置的是以字典的方式设置:custom_settings = {}

    from_crawler

    这是一个类方法,我们定义这样一个类方法,可以通过crawler.settings.get()这种方式获取settings配置文件中的信息,同时这个也可以在pipeline中使用

    start_requests()
    这个方法必须返回一个可迭代对象,该对象包含了spider用于爬取的第一个Request请求
    这个方法是在被继承的父类中spider.Spider中写的,默认是通过get请求,如果我们需要修改最开始的这个请求,可以重写这个方法,如我们想通过post请求

    make_requests_from_url(url)
    这个也是在父类中start_requests调用的,当然这个方法我们也可以重写

    parse(response)
    这个其实默认的回调函数
    负责处理response并返回处理的数据以及跟进的url
    该方法以及其他的Request回调函数必须返回一个包含Request或Item的可迭代对象

  • 相关阅读:
    [置顶] 也论百度轻应用--一个开发者的吐槽
    HDU 1506 Largest Rectangle in a Histogram
    [置顶] 搭建apache+tomcat+memcached集群环境
    (step8.2.6)hdu 1848(Fibonacci again and again——组合博弈)
    SQL2005、2008、2000 清空删除日志
    网络获取北京时间和系统时间
    C++界面库
    Cocos2d-X游戏开发之Windows7+VS2010环境搭建(亲测)
    华为面试题——一道关于指针方面的编程题(C/C++)
    java之Math
  • 原文地址:https://www.cnblogs.com/edeny/p/9855883.html
Copyright © 2020-2023  润新知