You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Scrapy爬取路透社搜索结果仅返回5000条,如何提升爬取数量

解决路透社搜索结果Scrapy仅返回5000条的问题

老哥,我来帮你捋捋这个问题——你遇到的情况大概率是路透社后端接口的硬限制,跟你设置的numResultsToShow参数关系不大,下面给你拆解原因和解决方案:

为什么只能拿到5000条?

  1. 服务器端条数上限:很多网站的搜索接口都会对单请求返回的结果数做严格限制,不管你传多大的numResultsToShow,后端最多只返回5000条(这是常见的接口限流策略,防止单次请求占用过多服务器资源)。你可以直接用curl/postman调用这个JSON接口,传numResultsToShow=9999,看看返回的实际结果数是不是刚好5000,一测就明白。
  2. 隐藏的分页逻辑:这个“加载更多”接口本质上还是分页的,只是前端用滚动加载代替了传统页码,你需要通过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:
    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'
    
    如果遇到403或者空响应,可以加个User-Agent池,或者用代理IP。
  • 接口字段验证:先手动调用接口,确认返回的JSON结构里articles字段是正确的结果列表,避免解析出错。
  • 异常处理:代码里加了JSON解析的异常捕获,防止接口返回非JSON内容导致爬虫崩溃。

内容的提问来源于stack exchange,提问作者Himanshu Sharma

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 07:54:45