Scrapy爬取路透社搜索结果仅返回5000条,如何提升爬取数量
解决路透社搜索结果Scrapy仅返回5000条的问题
老哥,我来帮你捋捋这个问题——你遇到的情况大概率是路透社后端接口的硬限制,跟你设置的numResultsToShow参数关系不大,下面给你拆解原因和解决方案:
为什么只能拿到5000条?
- 服务器端条数上限:很多网站的搜索接口都会对单请求返回的结果数做严格限制,不管你传多大的
numResultsToShow,后端最多只返回5000条(这是常见的接口限流策略,防止单次请求占用过多服务器资源)。你可以直接用curl/postman调用这个JSON接口,传numResultsToShow=9999,看看返回的实际结果数是不是刚好5000,一测就明白。 - 隐藏的分页逻辑:这个“加载更多”接口本质上还是分页的,只是前端用滚动加载代替了传统页码,你需要通过
offset(或者类似的start参数)来分段获取所有结果,而不是一次性请求所有45000条。
怎么修改代码爬取全部结果?
核心思路是分页递归请求,每次取5000条,然后偏移量累加,直到接口返回的结果不足5000条(说明已经爬完所有内容)。给你改下你的代码示例:
import json import scrapy class ReutersSpider(scrapy.Spider): name = "reuters" # 接口基础地址 base_api_url = "https://www.reuters.com/assets/searchArticleLoadMoreJson" # 固定请求参数(把你原来的参数补全) default_params = { 'blob': 'steel', 'bigOrSmall': 'big', 'articleWithBlog': 'true', # 其他你原来的参数,比如sortBy、dateRange之类的 'numResultsToShow': 5000, # 后端最多返回5000,就设成这个值 'offset': 0 # 初始偏移量 } def start_requests(self): # 发起第一个请求 yield scrapy.FormRequest( url=self.base_api_url, formdata=self.default_params, callback=self.parse_results, meta={'current_offset': self.default_params['offset']} ) def parse_results(self, response): # 解析JSON响应 try: data = json.loads(response.text) except json.JSONDecodeError: self.logger.error(f"解析失败,响应内容:{response.text[:500]}") return articles = data.get('articles', []) self.logger.info(f"本次获取{len(articles)}条文章,当前偏移量:{response.meta['current_offset']}") # 处理每条文章数据(这里改成你自己的Item逻辑) for article in articles: yield { 'title': article.get('title'), 'article_url': f"https://www.reuters.com{article.get('href')}", 'publish_date': article.get('date'), 'summary': article.get('description') } # 判断是否还有更多结果 if len(articles) == self.default_params['numResultsToShow']: # 计算下一个偏移量 next_offset = response.meta['current_offset'] + len(articles) # 更新参数,发起下一页请求 self.default_params['offset'] = str(next_offset) yield scrapy.FormRequest( url=self.base_api_url, formdata=self.default_params, callback=self.parse_results, meta={'current_offset': next_offset} ) else: self.logger.info("所有结果爬取完成!")
额外注意事项
- 反爬处理:路透社反爬不算弱,记得在
settings.py里设置合理的延迟和User-Agent:
如果遇到403或者空响应,可以加个User-Agent池,或者用代理IP。DOWNLOAD_DELAY = 2 # 每次请求间隔2秒 USER_AGENT = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36' - 接口字段验证:先手动调用接口,确认返回的JSON结构里
articles字段是正确的结果列表,避免解析出错。 - 异常处理:代码里加了JSON解析的异常捕获,防止接口返回非JSON内容导致爬虫崩溃。
内容的提问来源于stack exchange,提问作者Himanshu Sharma
相关产品推荐
相关产品推荐

