鱼C论坛

 找回密码
 立即注册
查看: 663|回复: 1

[已解决]多层yeild循环嵌套有点懵,求指点

[复制链接]
发表于 2018-8-15 20:50:26 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
  1. # -*- coding: utf-8 -*-
  2. 有没有大神给我讲讲yeild的具体的递归过程,我已经绕晕了
  3. import scrapy
  4. from scrapy import Spider,Request
  5. import json
  6. from zhihuuser.items import UserItem

  7. class ZhihuSpider(Spider):
  8.     name = 'zhihu'
  9.     allowed_domains = ['www.zhihu.com']
  10.     start_urls = ['https://www.zhihu.com']

  11.     start_user = 'excited-vczh'

  12.     user_url = 'https://www.zhihu.com/api/v4/members/{user}?include={include}'
  13.     uesr_query = 'allow_message,is_followed,is_following,is_org,is_blocking,employments,answer_count,follower_count,articles_count,gender,badge[?(type=best_answerer)].topics'

  14.     follows_url = 'https://www.zhihu.com/api/v4/members/{user}/followees?include{include}&offset={offset}&limit={limit}'
  15.     follows_query = 'data[*].answer_count,articles_count,gender,follower_count,is_followed,is_following,badge[?(type=best_answerer)].topics'

  16.     #当spider启动爬取时调用
  17.     def start_requests(self):
  18.         yield Request(self.user_url.format(user=self.start_user,include=self.uesr_query),self.parse_user)
  19.         yield Request(self.follows_url.format(user=self.start_user,include=self.follows_query,offset=0,limit=20),callback=self.parse_follows)

  20.     #解析单个用户的信息
  21.     def parse_user(self, response):
  22.         result = json.loads(response.text)
  23.         item = UserItem()
  24.        # item.fields输出items.py里面定义的所有名称
  25.         for field in item.fields:
  26.             if field in result.keys():
  27.                 #字典的get函数拿到值
  28.                 item[field] = result.get(field)
  29.         yield item
  30.         #每一个人再请求自己的关注列表
  31.         yield Request(self.follows_url.format(user=result.get('url_token'),include=self.follows_query,limit=20,offset=0),\
  32.                       callback=self.parse_follows)

  33.     #解析关注列表的信息
  34.     def parse_follows(self,response):
  35.         results = json.loads(response.text)
  36.         #得到关注列表信息,利用parse_user解析每个关注人的信息
  37.         if 'data' in results.keys():
  38.             #分析网页后,用户关注列表data的值是一个列表
  39.             for result in results.get('data'):
  40.                 yield Request(self.user_url.format(user=result.get('url_token'),include=self.uesr_query),callback=self.parse_user)

  41.         #分页判断
  42.         if 'paging' in results.keys() and ( results.get('paging').get('is_end') == False):
  43.             next_page = results.get('paging').get('next')
  44.             #print('开始请求下一页',next_page)
  45.             yield Request(url=next_page,callback=self.parse_follows)


复制代码
最佳答案
2018-8-15 21:11:51
没有多层嵌套~~

就跟 return 一样,但 yield 是生成一个对象。如果是生成对象的话,可以当参数或其他的用。
函数用 return 就没办法
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-8-15 21:11:51 | 显示全部楼层    本楼为最佳答案   
没有多层嵌套~~

就跟 return 一样,但 yield 是生成一个对象。如果是生成对象的话,可以当参数或其他的用。
函数用 return 就没办法
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-19 07:23

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表