使用ScraperAPI+Scrapy爬取IMDb电影链接异常求助
解决ScraperAPI结合Scrapy爬取IMDb电影链接的问题
问题现象
使用ScraperAPI代理结合Scrapy的CrawlSpider爬取IMDb Drama类Top250电影数据时,仅能获取到ScraperAPI的代理链接,无法得到预期的IMDb电影详情页链接,且CrawlSpider的链接跟进规则未生效。
问题原因
- 直接通过
client.scrapyGet()生成代理URL发起请求,导致response.url返回ScraperAPI的代理地址,而非原始IMDb页面地址。 - 自定义
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
相关产品推荐
相关产品推荐

