当前位置:   article > 正文

网络爬虫之Scrapy实战三:爬取多个网页CrawlSpider_crawlspider 多层页面

crawlspider 多层页面

前面介绍到的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为例



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的编写



声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/AllinToyou/article/detail/437276
推荐阅读
相关标签
  

闽ICP备14008679号