scrapy(网络爬虫)———CrawlSpider(规则爬虫)
CrawlSpider(规则爬虫)
一 .简介: 它继承了Spider类,并遵循只处理指定start_url列表中的网页的原则。CrawlSpider类通过预设的一系列规则(rule)来简化对link的追踪过程。通过这种方式进行链接抓取和网页遍历更为高效。
二.创建爬虫命令:
以已建立了一个完整的爬虫项目的前提下,在缺少现有项目的场景下,请运行 scrapy startproject 命令启动新项目
进入项目目录
在项目目录中运行Scrapy爬虫工具:调用scrapy genspider命令并配置相关参数以实现从指定网站中抓取所需信息
三.在pycharm中编写规则爬虫文件
1.爬虫文件中导入的Link Extractors:
class scrapy.linkextractors.LinkExtractor
作用是:
每个LinkExtractor具有一个独特的公共功能称为extract_links()。该类通过接收一个Response对象来定义响应对象中的链接提取规则,并返回一个scrapy.link.Link对象。这个Link对象包含符合链接匹配规则的结果列表。
Link Extractors需在运行时初始化一次,并且该方法在每次响应处理时会被调用以提取相关链接
2.Link Extractors 中的主要参数:
allow:能够获取括号中"正则表达式"的值;若为空,则实现最大匹配。(优先级最高)
deny:与这个正则表达式(或正则表达式列表)不匹配的URL一定不提取。
allow_domains:会被提取的链接的domains。
deny_domains:一定不会被提取链接的domains。
restrict_xpaths:使用xpath表达式,和allow共同作用过滤链接。
3. rules
在规则集合中可能包含一个或多个Rule对象,在爬取网站的行为上进行了特定的操作定义。当多个rule匹配到同一链接时,则优先采用首次定义的规则进行处理。
class scrapy.spiders.Rule(
link_extractor,
callback = None,
cb_kwargs = None,
follow = None,
process_links = None,
process_request = None
解释一下以上参数:
link_extractor:是一个Link Extractor对象,用于定义需要提取的链接。
callback:每当从link_extractor获取链接时(或每当从link_extractor获取到链接时),其参数指定为回调函数所需的值(或其参数指定为回调函数所需的值),随后该回调函数接收一个response作为第一个接收参数(或随后该回调函数接收一个response作为其第一个接收参数)。
在编写爬虫规则时,在避免以parse函数作为回调进行处理的同时,请注意以下事项:由于CrawlSpider内部实现了与parse相关的功能(即已覆盖了与parse相关的方法),若覆盖了与parse相关的功能,则会导致crawl spider无法正常运行。
follow 属于布尔类型变量,在遵循特定规则时决定从response对象中提取的链接是否应继续跟踪。若callback参数未提供(即为None),则follow预设为True值;否则,默认设置为False值。
process_links是用来确定在某个spider中哪个特定的函数会被触发。当从link_extractor获取到链接列表时,该函数会被触发。此方法的主要作用是进行过滤。
process_request(...):将指定在该spider中某个特定的函数会被调用作为处理逻辑的主要入口点。 通过这种方式实现对每一个 incoming request 的处理流程进行统一管理与协调。 当系统处理每一个 request 时,此规则会自动触发并执行相应的操作以完成数据转换与结果生成的任务。 其主要作用是过滤掉不符合预设条件的请求从而确保整个系统的稳定运行。
callback对应的函数
不要写parse
不要写parse!!!
四、以腾讯社招为例,编写crawlspider规则爬虫文件
_# -*- coding: utf-8 -*-_**import****from****import****from****import** _# 导入链接匹配规则,用来提取符合规则的链接_**from****import****class****'tencentdata'********'hr.tencent.com'****'https://hr.tencent.com/position.php? &start=0#a'**_# 先去匹配列表页链接_ __ allow**r'start=\d+'** follow**True** _# 匹配详情页数据_ __ allow**r'id=\d+'** callback**'parse_item'** follow**False****def** self _# 处理详情页数据_ __**'//td[@class="l2 bold size16"]/text()'** 0**'//tr[@class="c bottomline"]/td[1]/text()'** 0**'//ul[@class="squareli"]/li/text()'****""****'positionname'****'positionaddress'****'content'** print**yield**
