网络爬虫之Scrapy实战三:爬取多个网页CrawlSpider

469次阅读
没有评论

前面介绍到的Spider中只能解析在start_urls中的网页。虽然在上一章也实现了自动爬取的规则。但略显负责。在scrapy中可以用CrawlSpider来进行网页的自动爬取。

爬取的规则原型如下:

classscrapy.contrib.spiders.Rule(link_extractorcallback=Nonecb_kwargs=Nonefollow=None,process_links=Noneprocess_request=None)

LinkExtractor.:它的作用是定义了如何从爬取到的的页面中提取链接

Callback指向一个调用函数,每当从LinkExtractor获取到链接时将调用该函数进行处理,该回调函数接受一个response作为第一个参数。注意:在用CrawlSpider的时候禁止用parse作为回调函数。因为CrawlSpider使用parse方法来实现逻辑,因此如果使用parse函数将会导致调用失败

Follow是一个判断值,用来指示从response中提取的链接是否需要跟进

 

在scrapy shell中提取www.sina.com.cn为例

scrapy爬虫


LinkExtractor中的allow只针对href属性:

例如下面的链接只针对href属性做正则表达式提取

结构如下:可以得到各个链接。

网络爬虫之Scrapy实战三:爬取多个网页CrawlSpider



可以通过restrict_xpaths对各个链接加以限制,如下的方法:

scrapy爬虫


实例2:还是以之前的迅读网为例

提取网页中的下一节的地址:

网页地址:

http://www.xunread.com/article/8c39f5a0-ca54-44d7-86cc-148eee4d6615/1.shtml

scrapy爬虫


下一页的的相对URL地址为2.shtml。

通过如下规则提取出来

>>>item=LinkExtractor(allow=(‘\d\.shtml’)).extract_links(response)

>>> for i in item:

…  print i.ur

网络爬虫之Scrapy实战三:爬取多个网页CrawlSpider


也通过导航页面直接获取所有章节的链接:

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实战三:爬取多个网页CrawlSpider


那么接下来构造在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免费测试

相关文章:

版权声明:Python教程2022-10-25发表,共计2232字。
新手QQ群:570568346,欢迎进群讨论 Python51学习