1. CrawlSpider介绍
CrawlSpider是Python中Scrapy框架提供的一个高级爬虫类,它主要用于爬取网站上的链接和页面,并且支持深度优先算法和广度优先算法进行爬取。CrawlSpider的一个特点是它可以根据特定的规则提取数据。如果你想爬取一个多级页面的网站,而且这个页面的链接是有规律的,那么CrawlSpider将会是你的不二选择。
2. 安装CrawlSpider
在使用CrawlSpider之前,需要安装Scrapy。如果你已经安装好了Scrapy,那么你就可以直接通过命令行创建一个CrawlSpider的模板:
scrapy genspider -t crawl example example.com
通常情况下,我们需要在项目的settings.py文件中启用DOWNLOADER_MIDDLEWARES和ROBOTSTXT_OBEY。这里是修改的代码:
DOWNLOADER_MIDDLEWARES = {
'scrapy.contrib.downloadermiddleware.useragent.UserAgentMiddleware': None,
'scrapy_fake_useragent.middleware.RandomUserAgentMiddleware': 400,
'scrapy_downloadermiddlewares.httpproxy.HttpProxyMiddleware': 100,
'scrapy.contrib.downloadermiddleware.retry.RetryMiddleware': 90,
'retry.RetryMiddleware': 100
}
ROBOTSTXT_OBEY = False
3. CrawlSpider的运行机制
CrawlSpider的运行机制是根据指定的链接和规则进行爬取。通常情况下,我们需要重写CrawlSpider的两个重要方法:allowed_domains和start_requests。
3.1 allowed_domains 方法
这个方法是指定从哪些域名下面爬取数据的。例如我们要爬取的网站是www.example.com,那么这个方法就可以写成这样:
allowed_domains = ['www.example.com']
3.2 start_requests 方法
这个方法是处理起始链接的。当爬虫启动时,它会自动调用这个方法,并且把指定的链接添加到LinkExtractor中进行爬取。例如我们要爬取的页面是www.example.com/index.html,那么这个方法可以写成这样:
def start_requests(self):
yield scrapy.Request(
url='http://www.example.com/index.html',
callback=self.parse
)
4. CrawlSpider的规则
规则是CrawlSpider最核心的部分,因为它可以帮助我们快速的定位和提取数据。通常情况下,我们使用LinkExtractor来定义规则。LinkExtractor是Scrapy中一个很强大的类,它可以通过一些特定语法来提取不同页面中的链接。
4.1 规则示例
下面是一个简单的规则示例,它可以提取一个网页中所有链接:
rules = (
Rule(LinkExtractor(), callback='parse_item', follow=True),
)
其中的LinkExtractor()表示提取所有的链接。callback参数表示哪个方法进行数据提取处理。follow参数表示是否跟从页面中的所有链接进行爬取。
4.2 LinkExtractor参数
除了简单的规则之外,我们还可以带上参数限制我们所要提取的链接范围。LinkExtractor有以下参数:
allow_domains:允许提取的域名
deny_domains:不允许提取的域名
allow:允许的路径,支持正则表达式
deny:不允许的路径,支持正则表达式
restrict_xpaths:基于xpath提取链接
下面是一个规则示例,它可以提取www.example.com页面中属性名为‘stock’的链接:
rules = (
Rule(
LinkExtractor(
allow=r'/stock/.*',
deny_domains=['category.example.com'],
restrict_xpaths='//div[@class="stock-list"]'
),
callback='parse_item'
),
)
5. CrawlSpider的数据提取
在CrawlSpider中提取数据是比较简单的,只需要编写callback对应的处理方法即可。在方法内使用xpath或css将需要的数据提取出来即可。
5.1 数据提取示例
下面是一个处理方法的例子,它可以提取一个页面中的标题和内容:
def parse_item(self, response):
for sel in response.xpath('//div[@class="post"]/text()'):
item = ExampleItem()
item['title'] = sel.xpath('h1/text()').extract_first()
item['content'] = sel.xpath('p/text()').extract_first()
yield item
这个方法中先选择页面中所有的div标签,然后通过xpath选择带有class属性为‘post’的标签。之后分别对标题和内容进行xpath选择获取。
6. 运行CrawlSpider
当我们终于写完了所有的代码,就可以运行我们的CrawlSpider了。使用下面的命令即可开始爬取:
scrapy crawl example
其中example是我们自己定义的爬虫名称。爬虫运行时,可以在终端看到爬虫日志信息。如果你想将日志信息保存起来,可以使用下面的命令:
scrapy crawl example -o example.json
这个命令将会把爬虫爬取到的数据保存到名为example.json的文件中。
7. 总结
CrawlSpider是Scrapy框架自带的高级爬虫类,它可以帮助我们快速的提取数据和爬取链接。使用CrawlSpider,我们可以定义规则对网页数据进行提取和处理,极大的提高了爬虫的效率。