初识爬虫类CrawlSpider
Scrapy框架在scrapy.spiders模块中提供了CrawlSpider类专门用于自动爬取,CrawlSpider类是Spider的派生类,Spider类的设计原则是只爬取start_url列表中的网页,而CrawlSpider类定义了一些规则(rule)来提供跟进link的方便机制,对于从爬取的网页中获取link并继续爬取的工作更适合。
通过下面的命令可以快速创建一个使用CrawlSpider模板的爬虫。
scrapy genspider -t crawl tencent tencent.com
其中,选项-t表示模板,crawl表示模板的名称,使用该命令指定了爬虫创建时使用的模板为crawl。
多学一招:Scrapy框架的模板
Scapy框架在创建项目和爬虫时都使用了模板,接下来就为大家介绍这两种模板。首先是项目模板,我们先创建一个Scrapy项目,取名为mycrawlprj,代码如下所示。
C:\Users\admin>scrapy startproject mycrawlprj
New Scrapy project 'mycrawlprj', using template directory 'c:\\users\\admin\\app
data\\local\\programs\\python\\python36-32\\lib\\site-packages\\scrapy\\templates\\project', created in:
C:\Users\admin\mycrawlprj
You can start your first spider with:
cd mycrawlprj
scrapy genspider example example.com
创建爬虫项目成功之后,控制台返回提示信息的第一行就是“使用模块创建项目”,说明该爬虫项目是通过模板创建的,模板的路径也在提示信息中指明(如本例中的地址为:
C:\Users\admin\AppData\Local\Programs\Python\Python36-32\Lib\site-packages\scrapy\templates\project)。
该文件夹的目录结构如图1所示。
图1 项目模板的文件夹结构
从图1可知,该模块指定了创建新爬虫项目时的默认文件结构和内容。知道了这个原理之后,就可以修改模板的设置,或者向模板文件中填充一些我们需要用到的值,比如default_settings.py文件中默认的settings键值对,这样每次使用的时候就不会在自己项目的settings.py中找不到相关的键值了。处理一类的项目比如采集各种新闻网站,需要采集的字段(也就是item)一样,那么items.py和pipelines.py文件就可以用模板构建,这样就不用每次都要自己手写了。我们还可以在里面构造自己的模板文件,但是这样就需要修改startproject.py源码文件中的TEMPLATES_TO_RENDER值。
接下来,就可以通过scrapy genspider –l命令查看该爬虫项目下拥有的爬虫模板,代码如下所示。
C:\Users\admin>scrapy genspider -l
Available templates:
basic
crawl
csvfeed
xmlfeed
从控制台返回的消息可知,爬虫一共有4个模板。如果想知道一种模板里面是什么内容,可以使用命令scrapy genspider -d template(例如crawl)进行查看。下列信息是使用该命令查看到的CrawlSpider模板的内容。
C:\Users\admin>scrapy genspider -d crawl
# -*- coding: utf-8 -*-
import scrapy
from scrapy.linkextractors import LinkExtractor
from scrapy.spiders import CrawlSpider, Rule
class $classname(CrawlSpider):
name = '$name'
allowed_domains = ['$domain']
start_urls = ['http://$domain/']
rules = (
Rule(LinkExtractor(allow=r'Items/'), callback='parse_item',
follow=True),
)
def parse_item(self, response):
i = {}
#i['domain_id'] = response.xpath('//input[@id="sid"]/@value').extract()
#i['name'] = response.xpath('//div[@id="name"]').extract()
#i['description'] =
response.xpath('//div[@id="description"]').extract()
return i
在对几个模板熟悉以后就可以使用scrapy genspider (-t template) name domain创建spider。如果不指定模板,则默认使用basic模板创建爬虫。
注意,这里的name不能使用项目的name,也不能使用已存在的spider的name,不然系统会报错。如果想覆盖以前的spider ,可以在genspider后加--force参数,则后面的name是被覆盖spider的name。
还可以为框架添加自己设计的爬虫模板,爬虫模板的位置与项目模板文件夹并列,名称为spiders。可以在爬虫模板中增加自己常用的方法,也可以设计一个简单的类框架,以适应所需要采集的页面规则。