scrapy(网络爬虫)———CrawlSpider(规则爬虫)

孤街浪徒 提交于 2020-02-24 03:00:14

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
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!