scrapy实现递归爬取

使用scrapy踩的坑之如何使用scrapy实现递归爬取

因为对scrapy并不了解,所以在做使用scrapy爬取网站上的所有图片时,并不知道如何能够不断的循环爬取,在网上找到一篇文章:
Some Experiences Of Using Scrapy,文章中提到:

不断的抓取下一个链接如何实现,items如何保存?
这里需要解释一下parse()方法,parse可以返回Request列表,或者items列表,如果返回的是Request,则这个Request会放到下一次需要抓取的队列,如果返回items,则对应的items才能传到pipelines处理(或者直接保存,如果使用默认FEED exporter)。那么如果由parse()方法返回下一个链接,那么items怎么返回保存? Request对象接受一个参数callback指定这个Request返回的网页内容的解析函数(实际上start_urls对应的callback默认是parse方法),所以可以指定parse返回Request,然后指定另一个parse_item方法返回items:

def parse(self, response):
    # doSomething
    return [Request(url, callback=self.parse_item)]
def parse_item(self, response):
    # item['key'] = value
    return [item]

关于解析函数的返回值,除了返回列表,其实还可以使用生成器,是等价的:

def parse(self, response):
    # doSomething
    yield Request(url, callback=self.parse_item)
def parse_item(self, response):
    yield item

但是自己在实践的过程中发现上面提到的方法好像并不可行。第一个代码片段,因为Requestcallbackparse_item 所以并没有新的请求提交到parse方法中,那就是没有实现所谓的递归爬取了?第二个代码片段也是如此。而且个人觉得returnyield在案例中能算是等价的吗?此处存疑,因为作者觉得例子中的parse_item方法中没有出现for循环,如果使用return,就只能执行一个整个方法就返回(return)了,跟yield并不一样。

后来又找到了有一个人在segmentfault问的问题scrapy如何迭代爬去? 第二个答案里答主给了一个爬取汽车数据的DEMO,看到他的一个方法里面有两个yield,才明白yield和return是不同的,之前被网上的一些DEMO给忽悠住了,以为yield和return差不多(都怪自己的python太菜o(╥﹏╥)o),所以先来了解一下yield:Python yield 使用浅析


弄明白了这个,下面感觉就好办了。

下面重点来了

def parse(self, response):
    # doSomething
    for item in items
        yield item
    for url in urls
        yield Request(url, callback=self.parse)

感觉上面才是实现递归爬取的正确道路。但是事情到这儿并没有结束,因为一开始我也不是按上面的格式来写的,而是走了个弯路(┳Д┳)

def parse_item(self, response):
    # doSomething
    for item in items
        yield item

def parse(self, response):
    # doSomething
    self.parse_item(response)
    for url in urls
        yield Request(url, callback=self.parse)

这里是项目的blog:使用scrapy爬取网站上的所有图片
完整的代码:https://github.com/wly2014/ImageSpider


以为这样就完了吗?♪(´ε`)
个人想,就只是把负责item操作部分的代码提取出来形成新的方法,这样不应该代码结构更清楚吗?so easy↖(^ω^)↗?

但是,却! 不! 行! ,运行起来没有任何的结果,或者说反应,难道是我的代码写错了,还是说上面的理解全是错的?为什么?

这儿找到了一篇相似的问题的文章scrapy递归抓取网页数据 作者最后好像也没有弄明白是怎么回事(●´ω`●)。

如果有大神知道原因或上面分析有错误之处,希望可以告知一下(๑^ں^๑)

  • 6
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
使用 Scrapy 爬取今日头条可以分为以下步骤: 1. 创建 Scrapy 项目 ``` scrapy startproject toutiao ``` 2. 创建一个 Spider 在 Scrapy 项目中,每个爬虫都是由一个 Spider 类来定义的。在 `spiders` 文件夹下创建一个 `toutiao_spider.py` 文件,并编写以下代码: ```python import scrapy class ToutiaoSpider(scrapy.Spider): name = "toutiao" start_urls = [ 'https://www.toutiao.com/ch/news_hot/', ] def parse(self, response): for article in response.css('div.card'): yield { 'title': article.css('div.title-box a::text').get(), 'url': article.css('div.title-box a::attr(href)').get(), 'source': article.css('a.lbtn.source::text').get(), 'time': article.css('span.time::text').get(), } next_page = response.css('a.next::attr(href)').get() if next_page is not None: yield response.follow(next_page, self.parse) ``` 在 Spider 中,我们首先指定了 Spider 的名称和起始 URL,然后定义了一个 `parse` 方法,用于解析响应并提取数据。在这个例子中,我们使用 CSS 选择器来提取文章的标题、URL、来源和发布时间,并将其作为字典类型的 item 返回。最后,我们通过在响应中查找“下一页”的链接来实现翻页,并使用 `response.follow` 方法来跟踪这些链接,最终递归调用 `parse` 方法。 3. 运行 Spider 完成 Spider 的编写后,我们可以在命令行中运行以下命令来启动爬虫: ``` scrapy crawl toutiao -o articles.csv ``` 此命令将运行名为 `toutiao` 的 Spider,并将结果输出到 `articles.csv` 文件中。您可以将此文件用于进一步的数据分析和处理。
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值