Scrapy+redis分布式爬虫(四、CrawlSpider爬
2020-09-15 本文已影响0人
眼君
创建CrawlSpider爬虫
之前,我们需要创建一个spider脚本时, 主要是使用genspider命令来实现:
scrapy genspider <spider_name> <aim_url>
实际上我们还可以使用genspider命令生成其它类型的spider脚本, 以下命令可以遍历所以方式:
scrapy genspider --list
我们可以发现, 实际上genspider可以使用四种方式:basic、crawl、csvfeed和xmlfeed,我们之前默认使用的是basic方式。这次我们使用crawl方式在项目中生成一个crawl脚本:
scrapy genspider -t crawl <爬虫名> <目标网站地址>
脚本如下所示:
import scrapy
from scrapy.linkextractors import LinkExtractor
from scrapy.spiders import CrawlSpider, Rule
class BkcrawlSpider(CrawlSpider):
name = 'BKcrawl'
allowed_domains = ['hz.ke.com']
start_urls = ['http://hz.ke.com/chengjiao//']
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
Rule和LinkExtractor的用法
crawlspider和之前的basespider脚本的显著区别是两者页面跳转逻辑不同:
- basespider通过parse函数之间回调来实现页面跳转,适合网页结构层次分明整齐的URL;
- 而crawlspider则是通过正则匹配URL实现页面跳转,适合URL结构具有一定规律的网页。
crawlspider里用到了Rule和LinkExtractor两个类, 而LinkExtractor是Rule中的第一个参数, 用于解析URL。
LinkExtractor的第一个参数allow是一个正则表达式, 满足该模式的URL才会被该rule解析;allow_domains记录允许解析的域名;restrict_xpaths用于限定只从哪种xpaths模式获取URL;tags用于限定只从哪种tags模式获取URL;attrs用于限定只从哪种attrs中获取URL;
Rule中的follow用于决定对于解析的页面的URL是否进行进一步的解析。
模拟登陆
通过重写start_requests来实现模拟登陆。