python网络爬虫——CrawlSpider

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,我们可以定义规则对网页数据进行提取和处理,极大的提高了爬虫的效率。

后端开发标签