爬虫框架Scrapy之scrapy.CrawlSpider
Scrapy提供了如下Spiders:
- scrapy.spiders.Spider
- scrapy.spiders.CrawlSpider
- scrapy.spiders.XMLFeedSpider
- scrapy.spiders.CSVFeedSpider
- scrapy.spiders.SitemapSpider
scrapy.spiders.Spider是之前一直介绍的,下面介绍另一个常用的,scrapy.spiders.CrawlSpider:
在爬取一些特殊类型的网站时,比如一些博客类网站,其网页的链接都会有一些特殊的形式,简单的例子,博客园的博客内容,http://www.cnblogs.com/cnkai/p/7397421.html,http://www.cnblogs.com/cnkai/p/7396835.html比如我们想爬取我的博客内容,会发现,除了最后的几个数字不同,其他的内容是相同的,因此,我们就可以通过这个类来进行自动抓取相似的链接,而无需我们自己定义。
CrawlSpider类定义了如下的属性和方法。
直接来个代码:
import scrapy
from scrapy.spiders import CrawlSpider, Rule
from scrapy.linkextractors import LinkExtractor
class MySpider(CrawlSpider):
name = 'cnblog'
allowed_domains = []
start_urls = ['http://www.cnblogs.com']
rules = (
Rule(LinkExtractor(allow=('http://www.cnblogs.com/\w+/p/\d+.html', )), callback='parse_item', follow=True),
)
def parse_item(self, response):
print(response.url)
简单的解释:
rules()中的allow=('http://www.cnblogs.com/\w+/p/\d+.html', )表示我们需要匹配的格式,其中包含了正则表达式,\w+表示匹配任意的字母数字下划线汉字至少一次,\d+表示匹配任意的数字至少一次,callback设置回调函数,follow=True表示跟进response里面的链接,最终的结果就是提取出所有的满足要求的连接,并打印出来,这个数量会很庞大,如果你的爬虫没有被ban的话,这里我简单的运行一下,可以看到下面的链接被打印了出来。且这些链接是满足我们要求的格式。

浙公网安备 33010602011771号