scrapy 在一个parse()中,如何多次发起http.Request()请求并获得结果。

已解决:

request = Request(sec_text_url, callback=self.parse_sec_text)
yield request

————————————————————————————————————

在抓一个书评页,每个一级书评下面都可能有二级书评。
遍历一级书评的同时判断二级书评数量是否为空,不为空则抓取这个一级书评的二级书评json数据。
怎么实现执行Request(sec_text_url, callback=self.parse_sec_text)获得二级书评数据后,继续执行下面的语句呢?代码如下:

import scrapy
from scrapy.http import Request
from ysw.items import YswItem
import re
import json
from scrapy.selector import Selector

class ShupingSpider(scrapy.Spider):
    name = 'shuping'
    #allowed_domains = ['www.yousuu.com']
    start_urls = ['http://www.yousuu.com/book/xxxx']

    #此方法解析评论第一页的书评
    def parse(self, response):
        
        #遍历第一页的一级书评
        for r in response.xpath('//*[@id="content"]/div'):
            item = YswItem()    #对象

            #发贴时间
            item['time'] = r.xpath('string(./div/div/div[1]/div/span[2])').extract_first().strip()

            #有些一级评论可能没有赞同,需要判断一下
            agree = r.xpath('string(./div/div/div[2]/button[1]/span)').extract_first().strip()
            if agree:
                item['agree'] = agree
            else:
                item['agree'] = '0'

            '''判断二级评论数量,二级评论不为空时需要获取二级评论的信息,
            因为二级评论没有赞同和三级评论,所以只获得二级评论的文本text就行'''
            sec_num = r.xpath('string(./div/div/div[2]/button[2]/span)').extract_first().strip()
            if sec_num:
                item['sec_num'] = sec_num

                #获取二级评论url的组成部分cid
                cid = r.xpath('./@cid').extract_first().strip()

                #补全二级评论页面的url
                sec_text_url = "http://www.yousuu.com/ajax/getonecomment?render=true&cid={}".format(cid)
                
                #在这里!!获得二级书评内容???
                Request(sec_text_url, callback=self.parse_sec_text)
                
        #包含第二页js链接信息的标签
        nextcom = response.xpath('//a[text()="下一页"]/@onclick').extract_first().strip()
        if nextcom:
            print('next: '+nextcom)
            #获得bid
            bid = re.search(r"(.*?)'(.*?)',(.*)", nextcom).group(2)
            #获得nexttime
            nexttime = re.search(r"(.*),'(.*?)'(.*)", nextcom).group(2)
            #获得第二页的url
            second_url = "http://www.yousuu.com/ajax/nextcomment?bid={}&nexttime={}".format(bid, nexttime)
            print(second_url)
            #将第二页和之后书评页的json格式数据交给shuping_2解析
            return Request(second_url, callback=self.parse_2)
        else:
            print('没有下一页了!')                

我试过先将二级书评的请求放在列表中,最后和下一页的请求一起return,如下:

sec_text_url = "http://www.yousuu.com/ajax/getonecomment?render=true&cid={}".format(cid)

request = []
request.append(Request(sec_text_url, callback=self.parse_sec_text))
requests = ','.join(request)

##################################
return requests, Request(second_url, callback=self.parse_2)

报错如下:

图片描述

请前辈们指点错误在哪,或者有其他方法实现在遍历一级书评时就能获得http.Request()结果并继续执行下面的语句吗?感谢!感谢!

阅读 9.5k
2 个回答

已解决:

request = Request(sec_text_url, callback=self.parse_sec_text)
yield request
新手上路,请多包涵

yield Request(sec_text_url, callback=self.parse_sec_text)

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题