已解决:
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()结果并继续执行下面的语句吗?感谢!感谢!
已解决: