Python爬虫框架Scrapy之爬取下一页网页的方法(二)
laoyan 2017-09-05 22:35:49
分 享


背景简介


Python爬虫框架Scrapy介绍(一)主要简单介绍了Scrapy框架的用法,本篇文章【Python爬虫框架Scrapy之爬取下一页网页的方法】介绍的重点是怎么爬取动态网页中的下一页方法。让你爬完怎么网站的内容。


翻页爬取


方法一:使用Spider爬取


#coding=utf-8
from scrapy.spiders import Spider
from scrapy.selector import Selector
from scrapy.http import HtmlResponse
from scrapy.http import Request
from lybbnspider.items import LybbnspiderItem
 
class LybbnSpider(Spider):
    name="lybbn"
    allowed_domains=["lybbn.cn"]
    start_urls=["http://www.lybbn.cn/index.php"]
    def parse(self,response):
        sel=Selector(response)
        mylis=sel.xpath('//*[@id="excerpt"]/li')
        for myli in mylis:
            item=LybbnspiderItem()
            item['title']=myli.xpath('h2/a/text()').extract()
            item['link']=myli.xpath('h2/a/@href').extract()
            yield item
        next_page_args=sel.xpath('//*[@id="page"]/a[6]/@href').extract()
        if next_page_args:
            next_page="http://www.lybbn.cn/index.php%s"%next_page_args[0]
            yield Request(next_page, callback=self.parse)


解释:


yield Request(next_page, callback=self.parse)也就是将新获取的request返回给引擎,实现继续循环。也就实现了“自动下一网页的爬取”。


遇到问题


SyntaxError: 'return' with argument inside generator


原因:yield和return不能用在一个python文件中,使用yield时不要用return语句


方法二:使用CrawlSpider


CrawlSpider是Spider的派生类,首先在说下Spider,它是所有爬虫的基类,对于它的设计原则是只爬取start_url列表中的网页,而从爬取的网页中获取link并继续爬取的工作CrawlSpider类更适合。它与Spider类的最大不同是多了一个rules参数,其作用是定义提取动作。在rules中包含一个或多个Rule对象,Rule类与CrawlSpider类都位于scrapy.contrib.spiders模块中。


class scrapy.contrib.spiders.Rule(link_extractor, callback=None, cb_kwargs=None, follow=None, process_links=None, process_request=None)


link_extractor 是一个 Link Extractor 对象。 其定义了如何从爬取到的页面提取链接。
callback 是一个callable或string(该spider中同名的函数将会被调用)。 从link_extractor中每获取到链接时将会调用该函数。该回调函数接受一个response作为其第一个参数, 并返回一个包含 Item 以及(或) Request 对象(或者这两者的子类)的列表(list)。
cb_kwargs 包含传递给回调函数的参数(keyword argument)的字典。
follow 是一个布尔(boolean)值,指定了根据该规则从response提取的链接是否需要跟进。 如果 callback 为None, follow 默认设置为 True ,否则默认为 False 。
process_links 是一个callable或string(该spider中同名的函数将会被调用)。 从link_extractor中获取到链接列表时将会调用该函数。该方法主要用来过滤。
process_request 是一个callable或string(该spider中同名的函数将会被调用)。 该规则提取到每个request时都会调用该函数。该函数必须返回一个request或者None。 (用来过滤request)


注意:当编写爬虫规则时,请避免使用 parse 作为回调函数。 由于 CrawlSpider 使用 parse方法来实现其逻辑,如果 您覆盖了parse方法,crawl spider将会运行失败。


CrawlSpider翻页例子


#coding=utf-8
from scrapy.contrib.spiders import CrawlSpider,Rule
# 导入链接匹配规则类,用来提取符合规则的链接
from scrapy.linkextractors import LinkExtractor
from scrapy.selector import Selector
from scrapy.http import HtmlResponse
from scrapy.http import Request
from lybbnspider.items import LybbnspiderItem
 
class LybbnSpider(CrawlSpider):
    name="lybbn"
    allowed_domains=["lybbn.cn"]
    start_urls=["http://www.lybbn.cn/index.php"]
    rules=[Rule(LinkExtractor(allow=('index.php*')),callback='parse_item',follow=True,)]
     # follow = True需要跟进的时候加上这句。
     # 有callback的时候就有follow
     # 只要符合匹配规则,在rule中都会发送请求,同是调用回调函数处理响应
     # rule就是批量处理请求
     # 不能写parse方法,因为源码中已经有了,会覆盖导致程序不能跑
    def parse_item(self,response):
        sel=Selector(response)
        mylis=sel.xpath('//*[@id="excerpt"]/li')
        for myli in mylis:
            item=LybbnspiderItem()
            item['title']=myli.xpath('h2/a/text()').extract()
            item['link']=myli.xpath('h2/a/@href').extract()
            yield item


解释:


allow里面=和?前面都有一个转义字符 \   ,allow里面要想表示? . = ' 等等特殊字符,记得在前面转义字符  \ ,但是如果是链接里的路径符 / ,那么前面就不要加转移符了。


传送门


Python爬虫框架Scrapy介绍(一)


http://www.lybbn.cn/data/datas.php?yw=260


Python爬虫框架Scrapy之管道文件pipeline介绍(三)


http://www.lybbn.cn/data/datas.php?yw=266


Python爬虫框架Scrapy爬虫文件之spider介绍(四)


http://www.lybbn.cn/data/datas.php?yw=267




相关连接


官方网站:http://scrapy.org/
开源地址:https://github.com/scrapy/scrapy
中文文档:http://scrapy-chs.readthedocs.io/zh_CN/latest/intro/overview.html


转载请注明来自Lybbn(lybbn.cn)


我要小额支持下

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

取消
吐槽一下

游客

所有吐槽
  • 暂时还没有吐槽,赶紧来吐槽!