我正在解析一个新闻网站,起点main-url是新闻列表的网页。 我想解析出新闻的每个子url,并请求这些子url来获取相应的html。然后如果 main-url 仍然有下一页,我将请求下一页。这是我的代码:
def parse(self, response):
res_json = json.loads(response.text)
if res_json['code'] == 200:
news_list = page_info['list']
next_page_num = page_info['nextPageNum']
has_next = page_info['hasNext']
for news in news_list:
news_url = page_info['shareUrl']
item['url'] = news_url
yield response.follow(news_url, headers=self.headers, callback=self.parse_news_html, cb_kwargs=dict(item=item))
if has_next is True:
self.body = ('"pageNum":{}').format(next_page_num)
url = 'https://api.abcd.com/www/newsList/channelNewsList'
yield scrapy.Request(url=url,
method='POST',
body=self.body,
callback=self.parse)
def parse_news_html(self, response, item):
item['page_html'] = response.text
return item
但是这样,pipeline无法获取到item,main-url也无法切换到下一页。据我所知,解析方法可以返回一个项目,和/或可迭代的请求。但无法返回两个可迭代的请求。那么我应该如何组织我的代码,以便我可以将项目返回到管道并请求下一页。
实际上,我使用requests.get()查询子url并返回item就可以解决问题。我不想依赖requests lib,因为我认为使用scrapy request本身来解决问题更“正式”。这是正确的吗?
感谢 wRAR 和 Alexander 的帮助。 实际上我没有在settings.py 中配置我的管道。 谢谢你的时间。 最好的, 泾川