本系列文档用于对Python爬虫技术的学习进行简单的教程讲解,巩固自己技术知识的同时,万一一不小心又正好对你有用那就更好了。
Python 版本是3.7.4
在前面的几篇文章中我们对Scrapy框架做了整体的介绍说明,和一些基本功能的使用教程。下面我们就开始学习一些Scrapy框架的高级用法。
在上面的第一个糗事百科的爬虫案例中,我们是自己在解析完整个页面后获取下一页的url,然后重新发送一个请求。有时候我们想要这样做,只要满足某个条件的url,都要进行爬取。那么这时候我们就可以通过CrawlSpider
来帮我们完成。CrawlSpider
继承自Spider
,只不过是在之前的基础上增加了新的功能,可以定义爬取的url的规则,以后scrapy碰到满足条件的url都进行爬取,而不用手动的yield Request()
。
之前创建爬虫的方式是通过scrapy genspider [爬虫名称] [域名]
的方式创建的,如果想要创建CrawlSpider
爬虫,那么应该通过以下命令创建:
scrapy genspider -t crawl [爬虫名字] [域名]
使用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共同过滤链接。定义爬虫的规则类,以下对这个类做一个简单的介绍:
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中获取到链接后会传递给这个函数,用来过滤不需要爬取的来链接。根据下列命令创建项目:
# 创建项目
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需要使用LinkExtractor
和Rule
,这两个东西决定爬虫的具体走向。