普通爬虫有啥意思,我写了个通用Scrapy爬虫

小詹学Python

共 3131字,需浏览 7分钟

 ·

2021-10-21 05:32


大家好,我是Kuls。今天是来自读者剑南的投稿。

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

Scrapy通用爬虫

创建Scrapy项目

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

Scrapy startproject Scrapy项目名

Spider爬虫模板

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

scrapy genspider -l

运行结果如下图所示:

其中:

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模板的通用爬虫通过执行以下命令来创建,以http://quotes.toscrape.com网站为例子,该网站是一个著名作家名言的网站,命令如下所示:

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

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

import scrapyfrom scrapy.linkextractors import LinkExtractorfrom scrapy.spiders import CrawlSpider, Ruleclass 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类,继承自CrawlSpidername是定义此爬虫名称的字符串,每个项目唯一的名字,用来区分不同的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规则,进入名人名言网站[2]并打开开发者工具,如下图所示:

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

浏览 7
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报