前面介绍到的Spider中只能解析在start_urls中的网页。虽然在上一章也实现了自动爬取的规则。但略显负责。在scrapy中可以用CrawlSpider来进行网页的自动爬取。
爬取的规则原型如下:
classscrapy.contrib.spiders.Rule(link_extractor, callback=None, cb_kwargs=None, follow=None,process_links=None, process_request=None)
LinkExtractor.:它的作用是定义了如何从爬取到的的页面中提取链接
Callback指向一个调用函数,每当从LinkExtractor获取到链接时将调用该函数进行处理,该回调函数接受一个response作为第一个参数。注意:在用CrawlSpider的时候禁止用parse作为回调函数。因为CrawlSpider使用parse方法来实现逻辑,因此如果使用parse函数将会导致调用失败
Follow是一个判断值,用来指示从response中提取的链接是否需要跟进
在scrapy shell中提取www.sina.com.cn为例
LinkExtractor中的allow只针对href属性:
例如下面的链接只针对href属性做正则表达式提取
结构如下:可以得到各个链接。
可以通过restrict_xpaths对各个链接加以限制,如下的方法:
实例2:还是以之前的迅读网为例
提取网页中的下一节的地址:
网页地址:
http://www.xunread.com/article/8c39f5a0-ca54-44d7-86cc-148eee4d6615/1.shtml
下一页的的相对URL地址为2.shtml。
通过如下规则提取出来
>>>item=LinkExtractor(allow=(‘\d\.shtml’)).extract_links(response)
>>> for i in item:
… print i.ur
也通过导航页面直接获取所有章节的链接:
C:\Users\Administrator>scrapy shellhttp://www.xunread.com/article/8c39f5a0-ca54
-44d7-86cc-148eee4d6615/index.shtml
from scrapy.linkextractors importLinkExtractor
>>>item=LinkExtractor(allow=(‘\d\.shtml’)).extract_links(response)
>>> for i in item:
… print i.url
得到如下全部的链接
那么接下来构造在scrapy中的代码,如下
class testSpider(CrawlSpider): name=“test1” allowd_domains=[‘http://www.xunsee.com’] start_urls=[“http://www.xunsee.com/article/8c39f5a0-ca54-44d7-86cc-148eee4d6615/1.shtml”] rules=(Rule(LinkExtractor(allow=(‘\d\.shtml’)),callback=‘parse_item’,follow=True),) print rules def parse_item(self, response): print response.url sel=Selector(response) context=” content=sel.xpath(‘//div[@id=”content_1″]/text()’).extract() for c in content: context=context+c.encode(‘utf-8’) items=Test1Item() items[‘content’]=context yield items
关键的是rules=(Rule(LinkExtractor(allow=(‘\d\.shtml’)),callback=‘parse_item’,follow=True),) 这个里面规定了提取网页的规则。以上面的例子为例。爬取的过程分为如下几个步骤:
1 从http://www.xunsee.com/article/8c39f5a0-ca54-44d7-86cc-148eee4d6615/1.shtml开始,第一调用parse_item,用xpath提取网页内容,然后用Rule提取网页规则,在这里提取到2.shtml。
2 进入2.shtml.进入2.shtml后再重复运行第一步的过程。直到Rules中提取不到任何规则
我们也可以做一下优化,设置start_urls为页面索引页面
http://www.xunsee.com/article/8c39f5a0-ca54-44d7-86cc-148eee4d6615/index.shtml
这样通过Rule可以一下提取出所有的链接。然后对每个链接调用parse_item进行网页信息提取。这样的效率比从1.shtml要高效很多。可以看到CrawlSpider的核心在于rule的编写
神龙|纯净稳定代理IP免费测试>>>>>>>>天启|企业级代理IP免费测试>>>>>>>>IPIPGO|全球住宅代理IP免费测试