Python爬虫——Scrapy通用爬虫

大家好,我是霖hero

除了钱,大家还比较喜欢什么?当然是全能、万能和通用的人或事物啦,例如:全能、什么都会的员工、万能钥匙、通用爬虫等等。今天我们学习Scrapy通用爬虫,利用Scrapy通用爬虫来获取美食杰网站。

Scrapy通用爬虫

创建Scrapy项目

Spider爬虫模板

CrawlSpider

创建crawl模板爬虫

定义rules规则

定义字段

提取数据

通用配置抽取

配置文件quotes.json

rules.py规则文件

启动爬虫run.py

spider爬虫初始化及获取配置

控制翻页数

实战演练

修改rules.py规则

修改quotes.json配置

修改next.py翻页

结果展示


Scrapy通用爬虫

创建Scrapy项目

Scrapy爬虫和Scrapy通用爬虫都是通过以下执行命令来创建Scrapy项目,没什么不同,命令如下所示:

Scrapy startproject Scrapy项目名

Spider爬虫模板

在创建spider爬虫前,我们先看看有什么可用的爬虫模板,执行命令如下所示:

scrapy genspider -l

运行结果如下图所示:

Python爬虫——Scrapy通用爬虫_第1张图片

其中:

  • basic是我们之前创建Spider的时候,默认使用的爬虫模板,也就是普通的爬虫模板;

  • crawl模板是最常用于抓取常规网站的爬虫模板,通过指定一些爬取规则来实现页面的提取,很多情况下这个模板的爬取就足够通用;

  • csvfeed模板是Scrapy最简单的爬虫模板,主要用于解析 CSV 文件,它是以行为单位来进行迭代,每迭代一行调用一次 parse_row() 方法;

  • xmlfeed模板主要用于处理RSS订阅信息,RSS是一种信息聚合技术,可以让信息的发布和共享更为高效和便捷。

接下来我们主要是讲解最常用的爬虫模板——crawl模板,其他模板我们会在往后的文章里讲解,敬请期待!!!

CrawlSpider

在使用crawl模板前,我们先要了解一下CrawlSpider。

CrawlSpider是Scrapy提供的一个通用Spider,继承自Spider类,除了拥有Spider类的所有方法和属性,它还提供了rules属性和parse_start_url()方法。

其中:

  • rules是包含一个或多个Rule对象的列表,我们可以指定一些爬取规则来实现页面的提取;

  • parse_start_url()是一个可重写的方法,当start_urls里对应的Request得到的Response时,该方法被调用。

创建crawl模板爬虫

crawl模板的通用爬虫通过执行以下命令来创建,以Quotes to Scrape网站为例子,该网站是一个著名作家名言的网站,命令如下所示:

scrapy genspider -t 模板类型 <爬虫名字> <允许爬取的域名>
scrapy genspider -t crawl quotes quotes.toscrape.com

当然,我们可以把命令中的crawl改为xmlfeed或者csvfeed,这样就会生成其他类型的爬虫,成功创建后,在spiders文件夹中多了一个quotes.py文件,该文件正是我们创建的spider爬虫,其内容如下所示:

import scrapy
from scrapy.linkextractors import LinkExtractor
from scrapy.spiders import CrawlSpider, Rule
​
class QuotesSpider(CrawlSpider):
    name = 'quotes'
    allowed_domains = ['quotes.toscrape.com']
    start_urls = ['http://quotes.toscrape.com/']
​
    rules = (
        Rule(LinkExtractor(allow=r'Items/'), callback='parse_item', follow=True),
    )
    def parse_item(self, response):
        item = {}
        #item['domain_id'] = response.xpath('//input[@id="sid"]/@value').get()
        #item['name'] = response.xpath('//div[@id="name"]').get()
        #item['description'] = response.xpath('//div[@id="description"]').get()
        return item

其中:

  • class QuotesSpider()是自定义spider类,继承自CrawlSpider

  • name是定义此爬虫名称的字符串,每个项目唯一的名字,用来区分不同的Spider,启动爬虫时使用scrapy crawl +该爬虫名字;

  • allowed_domains是允许爬取的域名,防止爬虫爬到其他网站;

  • start_urls是最开始爬取的url;

  • rules是爬取规则属性,是一个包含多个Rule对象的列表,该Rule主要用来确定当前页面中的哪些链接需要继续爬取、哪些页面的爬取结果需要哪个方法来解析等。

  • parse_item()方法是负责解析返回响应、提取数据或进一步生成要处理的请求。

注意:不能修改这个方法的名字,且不能定义parse()方法!!!

在创建Crawl模板的Spider爬虫时,Rule中只展示了最常用的参数,其完整参数如下所示:

Rule(LinkExtractor(allow=r'Items/', deny=(), allowed_domains=(), deny_domains=(), restrict_xpaths=()), callback='parse_item', follow=True, cb_kwargs=None, process_links=None, process_request=None)

Rule常见的参数如下:

  • LinkExtractor是一个链接提取对象,它定义了如何从每个已爬取的页面中提取链接并用于生成一个requests对象;

  • callback是一个可调用对象或字符,和之前定义requests的callback作用一样,

  • 指定链接提取器提取的每个链接交给哪个解析函数去处理;

  • follow是一个布尔值,它指定是否从使用此规则提取的每个响应中跟踪链接,当callback为None时,follow默认为True,否则为False;

  • cb_kwargs是字典,其包含了传递给回调用函数的参数;

  • process_links指定处理函数,从LinkExtractor中获取到链接列表时,该函数将会被调用,主要用于过滤url;

  • process_request指定哪个函数将会被调用,该规则提取到每个request时都会调用该函数,主要用于过滤request。

LinkExtractor常用的参数如下:

  • allow:满足括号中正则表达式的URL会被提取,如果为空,则全部匹配;

  • deny:满足括号中正则表达式的URL不会被提取,优先级高于allow;

  • allow_domains:会被提取的链接的domains;

  • deny_domains:不会被提取的链接的domains;

  • restrict_xpaths:使用xpath表达式来规则URL地址的范围。

定义rules规则

定义rules规则,也就是确定被提取的URL链接及其范围。

首先我们定义翻页的rules规则,进入名人名言网站并打开开发者工具,如下图所示:

Python爬虫——Scrapy通用爬虫_第2张图片

由图可知,翻页的URL存放在