在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 問答/人工智能  Python  網(wǎng)絡(luò)安全/ scrapy 在一個parse()中,如何多次發(fā)起http.Request()請

scrapy 在一個parse()中,如何多次發(fā)起http.Request()請求并獲得結(jié)果。

已解決:

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

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

在抓一個書評頁,每個一級書評下面都可能有二級書評。
遍歷一級書評的同時判斷二級書評數(shù)量是否為空,不為空則抓取這個一級書評的二級書評json數(shù)據(jù)。
怎么實現(xiàn)執(zhí)行Request(sec_text_url, callback=self.parse_sec_text)獲得二級書評數(shù)據(jù)后,繼續(xù)執(zhí)行下面的語句呢?代碼如下:

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()    #對象

            #發(fā)貼時間
            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'

            '''判斷二級評論數(shù)量,二級評論不為空時需要獲取二級評論的信息,
            因為二級評論沒有贊同和三級評論,所以只獲得二級評論的文本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)
                
                #在這里?。~@得二級書評內(nèi)容???
                Request(sec_text_url, callback=self.parse_sec_text)
                
        #包含第二頁js鏈接信息的標(biāo)簽
        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格式數(shù)據(jù)交給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)

報錯如下:

圖片描述

請前輩們指點錯誤在哪,或者有其他方法實現(xiàn)在遍歷一級書評時就能獲得http.Request()結(jié)果并繼續(xù)執(zhí)行下面的語句嗎?感謝!感謝!

回答
編輯回答
瞄小懶

已解決:

request = Request(sec_text_url, callback=self.parse_sec_text)
yield request
2018年1月4日 05:29