Logo

郎哥编程

爬虫Spider类

2020-12-17 169

1、 认识Spider类

爬虫Spider类是爬虫程序的核心模块,使用Scarpy框架创建爬虫项目后,框架并没有创建Spider类,需要使用命令来创建,启动Windows命令行窗口,将项目目录设置为当前目录,输入下面的命令:

scrapy genspider spider_baidunews news.baidu.com

scrapy genspider是Scrapy框架的创建爬虫命令,spider_baidunews是爬虫模块名称,news.baidu.com是爬虫要爬取的网站域名。

命令执行后,Scarpy框架会在项目子包目录spiders下创建spider_baidunews.py模块文件,该模块文件就是爬虫Spider类的实现文件。文件代码如下:

import scrapy
class SpiderBaidunewsSpider(scrapy.Spider):
    name = 'spider_baidunews'
    allowed_domains = ['news.baidu.com']
    start_urls = ['http://news.baidu.com/']
 
    def parse(self, response):
        pass

SpiderBaidunewsSpider类是爬虫Spider类的子类。

属性name设置爬虫名称,在一个爬虫项目内允许有多个爬虫类,爬虫名称必须是唯一的。

属性allowed_domains设置允许爬虫爬取的域名列表,该属性是列表类型,可以设置多个网站域名。

属性start_urls设置开始爬取的URL地址,爬虫将从该列表获取起始的爬取URL地址,后续的URL将会从爬取到的数据中提取。该属性是列表类型,可以设置多个起始URL地址,爬虫将依次爬取列表内的URL。

parse()方法是回调方法,当爬虫下载数据完成后,会自动调用parse()方法,并传入生成的response实例对象,response对象封装了解析下载数据的方法。该方法或者返回从下载数据提取的Item实例对象,或者返回request实例对象。

22.png

上图是Spider类的工作流程图,Spider类将待爬取的URL封装为Request实例对象,并通过Scrapy引擎发送Request请求,Scrapy引擎调用下载管理器下载Request请求返回的数据,并生成Response实例对象,Scrapy引擎回调Request请求绑定的回调方法,并传入Response实例对象。Spider类默认的回调方法是parse()方法。

2  Spider类的属性和方法

下表给出了Spider类的主要属性:

23.png

下表给出了Spider类的主要方法:

26.png

注释(1)

该方法创建Spider类实例对象,相当于代替了类的构造方法_init_()。该方法还会设置crawler和settings属性。

参数crawler是Crawler类实例对象,它是整个爬虫程序的实例对象,通过from_crawler类方法传递给Scrapy组件,此对象提供对所有Scrapy组件的访问。Spider类实例对象将绑定到crawler实例对象。

参数args是传递给_init_()方法的参数。

参数kwargs是传递给_init_()方法的关键字参数。

注释(2)

该方法在爬取开始时调用,且仅调用一次。继承的Spider子类可以重写该方法。若要更改开始爬取的URL,可以在该方法中实现。

例如:若要爬取需要登录的网站,可以在该方法中进入登录页,并登录网站。

class MySpider(scrapy.Spider):
    name = 'myspider'
    # 重写start_requests方法
    def start_requests(self):
        # 返回列表对象
        return [scrapy.FormRequest("http://www.example.com/login",
              formdata={'user':'john','pass': 'secret'},
              callback=self.logged_in)]
# 回调方法
def logged_in(self, response):
        # 解析返回的登录数据
        pass

FormRequest是Request类的子类,用于向网站发送表单请求。FormRequest的构造方法如下:

class scrapy.http.FormRequest(url[, formdata, ...][, callback])

参数url是发送表单请求的URL。

formdata是可选参数,它是一个字典类型的数据,其中包含HTML表单数据。

callback是可选参数,它用于设置回调方法。

注释(3)

该方法发送日志记录到Scrpay的logger日志实例对象。参数message是日志消息,参数level是日志等级。

 3、  CrawlSpider类

CrawlSpider类是Spider类的子类,它继承了Spider类的所有属性和方法,同时它定义一组规则为提取网页中的链接提供了一种方便的机制。

在爬取网站时,网站有很多URL指向一些不需要爬取的网址,通过在CrawlSpider类添加爬取规则,可以避免爬虫爬取这些无用的URL。

CrawlSpider类的属性如下表所示:

27.png

 CrawlSpider类的方法如下表所示:

28.png

如何定义规则?

Spider类的Rule()方法用于设置爬取规则:

classs crapy.spiders.Rule(
  link_extractor=None, 
  callback=None, 
   cb_kwargs=None, 
   follow=None, 
   process_links=None, 
   process_request=None, 
   errback=None
)

该方法用于设置一个爬取规则,可以使用该方法设置多个爬取规则。

参数link_extractor是一个LinkExtractor对象,用于定义需要提取的链接。

参数callback是回调方法,用于处理LinkExtractor内的URL请求返回的响应。

注意:设置的爬虫规则,要避免使用parse作为回调函数。因为CrawlSpider使用parse方法来实现其逻辑,如果覆盖了parse方法,CrawlSpider将会运行失败。

参数cb_kwargs是传递给回调方法的关键字参数。

参数follow是一个布尔值,用于设置根据该规则从response提取的链接是否继续爬取。若callback为None,follow默认设置为True,否则默认为Flase。

参数process_links是一个回调方法。若提供了该参数,当提取到一个URL链接时,该方法将被调用,主要用于过滤URL链接。

参数process_request是一个回调方法。若提供了该参数,在发送Request请求之前,该方法将被调用,主要用于过滤Request请求。

参数errback是一个回调方法。若提供了该参数,当发生异常时,该方法将被调用。

LinkExtractor对象

LinkExtractor对象是从响应中提取链接的对象。LinkExtractor类的构造方法为:

LinkExtractor(
    allow=(), 
    deny=(), 
    allow_domains=(), 
    deny_domains=(), 
    deny_extensions=None, 
    restrict_xpaths=(), 
    restrict_css=(), 
    tags='a', 
    'area', 
    attrs='href', 
    canonicalize=False, 
    unique=True, 
    process_value=None, 
    strip=True
)

构造方法参数很多,都是关键字参数。实际上在创建一个LinkExtractor实例对象时,不需要传入这么多关键字参数,每个关键字参数都有默认值。其主要参数说明如下:

参数allow:括号内为提取URL链接的正则表达式,与正则表达式匹配的URL链接会被提取。若没有提供参数或参数为空,则全部匹配。

参数deny:括号内为不提取URL链接的正则表达式,与正则表达式匹配的URL链接将不会被提取。若没有提供参数或参数为空,该参数被忽略。

参数allow_domains:URL链接在allow_domains域内会被提取。

参数deny_domains:URL链接在allow_domains域内不会被提取。

参数restrick_xpaths:括号内为XPath表达式,与参数allow共同作用过滤URL链接。顺序为XPath表达式返回节点列表,再由allow正则表达式处理节点列表。

代码在线纠错(通义千问 qwen-max)

支持粘贴多个代码文件,提交后由阿里云通义千问自动分析代码漏洞、语法错误、逻辑问题并给出修改建议。
您已解锁 AI 代码纠错功能,可正常使用!

评论区

登录 后发表评论
暂无评论