Python爬虫5.8 — scrapy框架CrawlSpider模块的使用
综述
本系列文档用于对Python爬虫技术的学习进行简单的教程讲解,巩固自己技术知识的同时,万一一不小心又正好对你有用那就更好了。
Python 版本是3.7.4
在前面的几篇文章中我们对Scrapy框架做了整体的介绍说明,和一些基本功能的使用教程。下面我们就开始学习一些Scrapy框架的高级用法。
CrawlSpider 介绍
在上面的第一个糗事百科的爬虫案例中,我们是自己在解析完整个页面后获取下一页的url,然后重新发送一个请求。有时候我们想要这样做,只要满足某个条件的url,都要进行爬取。那么这时候我们就可以通过CrawlSpider
来帮我们完成。CrawlSpider
继承自Spider
,只不过是在之前的基础上增加了新的功能,可以定义爬取的url的规则,以后scrapy碰到满足条件的url都进行爬取,而不用手动的yield Request()
。
CrawlSpider 爬虫
创建CrawlSpider爬虫
之前创建爬虫的方式是通过scrapy genspider [爬虫名称] [域名]
的方式创建的,如果想要创建CrawlSpider
爬虫,那么应该通过以下命令创建:
scrapy genspider -t crawl [爬虫名字] [域名]
LinkExtractors链接提取器
使用LinkExtractors
可以不用程序员自己提取想要的url,然后发送请求。这些工作都可以交给LinkExtractors
,它会在所有爬的页面中找到满足规划的url,实现自动的爬取。以下对LinkExtractors
类做一个简单的介绍:
class scrapy.linkextractors.LinkExtractor {
allow = {},
deny = {},
allow_domains = {},
deny_domains = {},
deny_extensions = None,
restrict_xpath = {},
tags = ('a','area'),
attrs = ('href'),
canonicalize = True,
unique = True,
process_value = None
}
主要参数讲解:
allow
: 所有满足这个正则表达式的url都会被提取。deny
: 禁止的url,所有满足这个正则表达式的url都不会被提取。allow_domains
: 允许的域名。只有在这个里面指定的域名的url才会被提取。deny_domains
: 禁止的域名,所有在这个里面指定的域名的url都不会被提取。restrict_xpath
: 严格的xpath,和allow共同过滤链接。
Rule规则类
定义爬虫的规则类,以下对这个类做一个简单的介绍:
class scrapy.spider.Rule {
link_extractor,
callback = None,
cb_kwargs = None,
follow = None,
process_links = None,
process_request = None
}
主要参数讲解:
link_extractor
: 一个LinkExtractor
对象,用于定义爬取规则。callback
: 满足这个规则的url,应该要执行那个回调函数,因为CrawlSpider
继承类的底层使用了parse
作为回调函数,因此如果在定义parse
就会覆盖掉底层parse
函数从而会可能造成错误。follow
: 指定根据该规则从response中提取的链接是否需要跟进。process_link
: 从link_extractor中获取到链接后会传递给这个函数,用来过滤不需要爬取的来链接。
微信小程序社区CrawlSpider使用案例
根据下列命令创建项目:
# 创建项目
scrapy startproject wxapp
# 创建爬虫
scrapy genspider -t crawl wxapp_spider wxapp-union.com
进行修改setting.py
文件更改完善爬虫配置,修改items.py
文件定义item内容(在这里就不再贴这两个文件的代码)。然后在wxapp_spider.py
文件写入如下代码:
# -*- coding: utf-8 -*-
from scrapy.linkextractors import LinkExtractor
from scrapy.spiders import CrawlSpider, Rule
from wxapp.items import WxappItem
class WxappSpiderSpider(CrawlSpider):
name = 'wxapp_spider'
allowed_domains = ['wxapp-union.com']
start_urls = ['http://www.wxapp-union.com/portal.php?mod=list&catid=2&page=1']
# 定义提取url地址规则
rules = (
# LinkExtractor链接提取器,获取符合要求的url链接地址
# callback 提取出来的url地址的response会交给callback处理
# follow 当前url地址的相应是否重新经过Rules来提取url地址
Rule(LinkExtractor(allow=r'.+mod=list&catid=2&page=\d+'), follow=True),
Rule(LinkExtractor(allow=r'.+article-.+\.html'), callback="parse_detail", follow=False),
)
# parse函数有特殊功能,不能定义,此函数名已被底层使用,不能重新定义覆盖
def parse_detail(self, response):
title = response.xpath('//h1[@class="ph"]/text()').get()
author_p = response.xpath('//p[@class="authors"]')
author = author_p.xpath('.//a/text()').get()
pub_time = author_p.xpath('.//span/text()').get()
content = response.xpath('//td[@id="article_content"]//text()').getall()
item = WxappItem(title=title, author=author, pub_time=pub_time, content=content)
yield item
在pipeline.py
中写入相应的代码进行保存数据,允许即可查看效果。
CrawlSpider总结
CrawlSpider需要使用LinkExtractor
和Rule
,这两个东西决定爬虫的具体走向。
- allow设置规则的方法:要能够限制在我们想要的url上面,不要跟其他的url产生相同的正则表达式即可。
- 什么情况下使用follow:如果在爬取页面的时候,需要将满足当前条件的url再进行跟进,那么就设置为True,否则设置为False。
- 什么情况下该指定callback:如果这个url对应的页面,只是为了获取更多的url,并不需要里面的数据,那么可以不指定callback,如果想要获取url对应页面中的数据,那么就需要指定一个callback。
其他博文链接
- Python爬虫1.1 — urllib基础用法教程
- Python爬虫1.2 — urllib高级用法教程
- Python爬虫1.3 — requests基础用法教程
- Python爬虫1.4 — requests高级用法教程
- Python爬虫2.1 — BeautifulSoup用法教程
- Python爬虫2.2 — xpath用法教程
- Python爬虫3.1 — json用法教程
- Python爬虫3.2 — csv用法教程
- Python爬虫3.3 — txt用法教程
- Python爬虫4.1 — threading(多线程)用法教程
- Python爬虫4.2 — ajax(动态网页数据抓取)用法教程
- Python爬虫4.3 — selenium基础用法教程
- Python爬虫4.4 — selenium高级用法教程
- Python爬虫4.5 — tesseract(图片验证码识别)用法教程
- Python爬虫5.1 — scrapy框架简单入门
- Python爬虫5.2 — scrapy框架pipeline模块的使用
- Python爬虫5.3 — scrapy框架spider[Request和Response]模块的使用
- Python爬虫5.4 — scrapy框架items模块的使用
- Python爬虫5.5 — scrapy框架logging模块的使用
- Python爬虫5.6 — scrapy框架setting模块的使用
- Python爬虫5.7 — scrapy框架Shell命令的使用