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

使用ScraperAPI+Scrapy爬取IMDb电影链接异常求助

解决ScraperAPI结合Scrapy爬取IMDb电影链接的问题

问题现象

使用ScraperAPI代理结合Scrapy的CrawlSpider爬取IMDb Drama类Top250电影数据时,仅能获取到ScraperAPI的代理链接,无法得到预期的IMDb电影详情页链接,且CrawlSpider的链接跟进规则未生效。

问题原因

  1. 直接通过client.scrapyGet()生成代理URL发起请求,导致response.url返回ScraperAPI的代理地址,而非原始IMDb页面地址。
  2. 自定义start_requests并指定callback=self.parse_item,跳过了CrawlSpider内置的规则处理逻辑,导致rules中的LinkExtractor无法提取页面内的电影链接并跟进请求。

修正方案

改用Scrapy下载中间件集成ScraperAPI,让所有请求自动走代理,同时保留CrawlSpider的规则逻辑,确保链接正常提取和跟进。

1. 配置ScraperAPI下载中间件

在项目的settings.py中添加以下配置:

DOWNLOADER_MIDDLEWARES = {
    'scrapy.downloadermiddlewares.httpproxy.HttpProxyMiddleware': None,
    'your_project_name.middlewares.ScraperAPIMiddleware': 543,
}

SCRAPER_API_KEY = 'your_api_key_here'

然后在项目的middlewares.py中添加中间件类:

from scrapy import signals
from scraper_api import ScraperAPIClient
from scrapy.http import Request

class ScraperAPIMiddleware:
    def __init__(self, api_key):
        self.client = ScraperAPIClient(api_key)

    @classmethod
    def from_crawler(cls, crawler):
        return cls(api_key=crawler.settings.get('SCRAPER_API_KEY'))

    def process_request(self, request, spider):
        # 将原始URL转换为ScraperAPI代理URL
        proxy_url = self.client.scrapyGet(url=request.url, render=True)
        return Request(proxy_url, headers=request.headers, meta=request.meta, dont_filter=True)

2. 修正CrawlSpider代码

去掉自定义的start_requests,改用start_urls,让CrawlSpider的规则自动生效:

import scrapy
from scrapy.linkextractors import LinkExtractor
from scrapy.spiders import CrawlSpider, Rule

class MoviesSpider(CrawlSpider):
    name = "movies"
    start_urls = ["https://www.imdb.com/search/title/?genres=drama&groups=top_250&sort=user_rating,desc"]

    rules = (
        # 提取电影详情页链接,跟进并解析
        Rule(LinkExtractor(restrict_xpaths='//h3[@class="lister-item-header"]/a'), 
             callback="parse_item", 
             follow=True),
    )

    def parse_item(self, response):
        # 此时response.url为原始IMDb电影详情页地址
        yield {'link': response.url}

说明

  • 中间件会自动将所有请求转换为ScraperAPI的代理请求,无需手动处理URL转换。
  • response.url会保留原始的IMDb地址,Scrapy会根据响应的X-ScraperAPI-Original-Url头自动修正地址映射。
  • CrawlSpider的rules会正常处理start_urls中的初始请求,提取页面内的电影链接并生成新的代理请求,最终解析得到电影详情页的原始链接。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 11:05:19