前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >SCRAPY学习笔记九 增量爬取url 使用 yield 的用法

SCRAPY学习笔记九 增量爬取url 使用 yield 的用法

作者头像
十四君
发布2019-11-27 15:17:10
1.7K0
发布2019-11-27 15:17:10
举报
文章被收录于专栏:Urlteam

在scrapy中parse部分经常要实现继续爬去下面的页面需要使用到给request 增加新的url请求。要用到yield。但是非常难理解。这里做一个总结,尝试说一下这个问题。

代码片段如下,具体解析含义可以看看之前的文章。

Scrapy笔记三 自动多网页爬取-本wordpress博客所有文章

代码语言:javascript
复制
#!/usr/bin/python
# -*- coding:utf-8 -*-
 
# from scrapy.contrib.spiders import  CrawlSpider,Rule
 
from scrapy.spider import Spider
from scrapy.http import Request
from scrapy.selector import Selector
from URLteam.items import UrlteamItem
 
 
class URLteamSpider(Spider):
    name = "urlteam"
    #减慢爬取速度 为1s
    download_delay = 1
    allowed_domains = ["urlteam.org"]
    start_urls = [
        "https://www.urlteam.org/2016/06/scrapy-%E5%85%A5%E9%97%A8%E9%A1%B9%E7%9B%AE-%E7%88%AC%E8%99%AB%E6%8A%93%E5%8F%96w3c%E7%BD%91%E7%AB%99/"
    ]
 
    def parse(self, response):
        sel = Selector(response)
 
        #items = []
        #获得文章url和标题
        item = UrlteamItem()
 
        article_url = str(response.url)
        article_name = sel.xpath('//h1/text()').extract()
 
        item['article_name'] = [n.encode('utf-8') for n in article_name]
        item['article_url'] = article_url.encode('utf-8')
 
        <span style="color: #ff0000;">yield</span> item
 
        #获得下一篇文章的url
        urls = sel.xpath('//div[@class="nav-previous"]/a/@href').extract()
 
        for url in urls:
            print url
            <span style="color: #ff0000;">yield</span> Request(url, callback=self.parse)

在代码代码中用红色标记出来的yield

首先不用太去在意他是怎么断开前前后后的。要知道使用他的目的就是将当前抓取的url增加到待爬队列里,以前可以用:如下

代码语言:javascript
复制
 result_list.append(scrapy.Request(url, callback=self.parse))

这样来增加,我初步尝试没有成功,因为找不到这个result_list,

现在用

代码语言:javascript
复制
<span style="color: #ff0000;">yield</span> Request(url, callback=self.parse)

只是将要抓的url,传递给请求对象。由调度器继续发送请求。

用了yield的函数会返回一个生成器,生成器不会一次把所有值全部返回给你,而是你每调用一次next返回一个值。

而scrapy内部则就是处理这样的next。所以当你使用return 的时候反而是结束了函数,并没有增加新的url。

parse方法是个生成器,可迭代,不是一个操作流程。它里面的yield都是返回“独立”一个生成器,通过自身self.parse返回的,当最外层的parse迭代时候,里面的子生成器会被每次推送出来。整个parse就是产生一大堆相关的生成器。

当然,我也有点蒙,所以理解起来就是使用yield是并不是用他各种跳转的特效,而是让这个函数成为一个迭代器,返回可以执行next的函数,从而进行下一次的抓取。

如还是蒙,请继续找资料,如果有非常合理的解释请发送给我。

原创文章,转载请注明: 转载自URl-team

本文链接地址: SCRAPY学习笔记九 增量爬取url 使用 yield 的用法

Related posts:

  1. 爬虫首尝试—爬取百度贴吧图片
  2. Scrapy-笔记一 入门项目 爬虫抓取w3c网站
  3. Scrapy-笔记二 中文处理以及保存中文数据
  4. Scrapy笔记三 自动多网页爬取-本wordpress博客所有文章
  5. Scrapy笔记五 爬取妹子图网的图片 详细解析
  6. Scrapy笔记零 环境搭建与五大组件架构
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2016-07-22,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Related posts:
相关产品与服务
网站建设
网站建设(Website Design Service,WDS),是帮助您快速搭建企业网站的服务。通过自助模板建站工具及专业设计服务,无需了解代码技术,即可自由拖拽模块,可视化完成网站管理。全功能管理后台操作方便,一次更新,数据多端同步,省时省心。使用网站建设服务,您无需维持技术和设计师团队,即可快速实现网站上线,达到企业数字化转型的目的。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档