scrapy(网络爬虫)———CrawlSpider(规则爬虫)
CrawlSpider(规则爬虫)
一 .简介:它是Spider的派生类,Spider类的设计原则是只爬取start_url列表中的网页,而CrawlSpider类定义了一些规则(rule)来提供跟进link的方便的机制,从爬取的网页中获取link并继续爬取的工作更适合。
二.创建爬虫命令:
1.前提是已经创建好爬虫项目了,若没有创建好项目,请使用 scrapy startproject 项目名
进入项目目录
2.在项目目录下执行创建规则爬虫:scrapy genspider -t crawl 爬虫名称 爬取域名
三.在pycharm中编写规则爬虫文件
1.爬虫文件中导入的Link Extractors:
class scrapy.linkextractors.LinkExtractor
作用是:
每个LinkExtractor有唯一的公共方法是 extract_links(),它接收一个 Response 对象,类中定义了Response中的链接的提取规则,并返回一个 scrapy.link.Link 对象,返回的是符合链接匹配对象的列表。
Link Extractors要实例化一次,并且extract_links 方法会根据不同的 response 调用多次提取链接。
2.Link Extractors 中的主要参数:
allow:满足括号中“正则表达式”的值会被提取,如果为空,则全部匹配。(使用最多)
deny:与这个正则表达式(或正则表达式列表)不匹配的URL一定不提取。
allow_domains:会被提取的链接的domains。
deny_domains:一定不会被提取链接的domains。
restrict_xpaths:使用xpath表达式,和allow共同作用过滤链接。
3.rules在rules中包含一个或多个Rule对象,每个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中每获取到链接时,参数所指定的值作为回调函数,该回调函数接受一个response作为其第一个参数。注意:当编写爬虫规则时,避免使用parse作为回调函数。由于CrawlSpider使用parse方法来实现其逻辑,如果覆盖了 parse方法,crawl spider将会运行失败。
-
follow
:是一个布尔(boolean)值,指定了根据该规则从response提取的链接是否需要跟进。 如果callback为None,follow 默认设置为True ,否则默认为False。 -
process_links
:指定该spider中哪个的函数将会被调用,从link_extractor中获取到链接列表时将会调用该函数。该方法主要用来过滤。 -
process_request
:指定该spider中哪个的函数将会被调用, 该规则提取到每个request时都会调用该函数。 (用来过滤request)
callback对应的函数
不要写parse
不要写parse!!!
四、以腾讯社招为例,编写crawlspider规则爬虫文件
# -*- coding: utf-8 -*- import scrapy from tencentpro.items import TencentproItem from scrapy.spider import CrawlSpider,Rule # 导入链接匹配规则,用来提取符合规则的链接 from scrapy.linkextractors import LinkExtractor class TencentdataSpider(CrawlSpider): name = 'tencentdata' allowed_domains = ['hr.tencent.com'] start_urls = ['https://hr.tencent.com/position.php?&start=0#a'] rules = ( # 先去匹配列表页链接 Rule(LinkExtractor(allow=r'start=\d+'), follow=True), # 匹配详情页数据 Rule(LinkExtractor(allow=r'id=\d+'), callback='parse_item',follow=False), ) def parse_item(self, response): # 处理详情页数据 item=TencentproItem() positionname=response.xpath('//td[@class="l2 bold size16"]/text()').extract()[0] positionaddress=response.xpath('//tr[@class="c bottomline"]/td[1]/text()').extract()[0] content=response.xpath('//ul[@class="squareli"]/li/text()').extract() content="".join(content) item['positionname']=positionname item['positionaddress']=positionaddress item['content']=content print(content) yield item
然后编写pipeline文件,运行程序,即可
更多见:https://blog.csdn.net/qq_42281826/article/details/81021280