使用Scrapy爬取带安全验证的9anime.gs网站失败求助
爬取9anime.gs的反爬绕过方案
核心问题分析
网站的安全验证大概率基于浏览器环境检测(比如JS支持情况、Canvas/WebGL指纹、浏览器特征识别等),Scrapy默认是无JS渲染的纯HTTP请求,自然会被拦截。仅用fake-useragent和Cookies无效,是因为验证逻辑不局限于这两个维度,而是需要完整的浏览器运行上下文。
具体解决方案
1. 结合JS渲染引擎模拟真实浏览器
集成scrapy-playwright或scrapy-selenium,让请求在真实浏览器环境中执行,自动完成验证跳转:
- 安装依赖:
pip install scrapy-playwright - 在Scrapy项目的
settings.py中配置:DOWNLOAD_HANDLERS = { "http": "scrapy_playwright.handler.ScrapyPlaywrightDownloadHandler", "https": "scrapy_playwright.handler.ScrapyPlaywrightDownloadHandler", } PLAYWRIGHT_LAUNCH_OPTIONS = { "headless": True, # 调试时可设为False查看浏览器行为 "args": ["--no-sandbox", "--disable-setuid-sandbox"], } - 爬虫代码示例:
import scrapy from scrapy_playwright.page import PageCoroutine class OshiNoKoSpider(scrapy.Spider): name = "oshi_no_ko" start_urls = ["https://9anime.gs/filter?keyword=oshi+n+oko"] def start_requests(self): for url in self.start_urls: yield scrapy.Request( url, meta={ "playwright": True, "playwright_page_coroutines": [ PageCoroutine("wait_for_selector", "div.film_list-wrap"), # 等待目标内容加载完成 ], }, ) def parse(self, response): # 示例:提取影视条目信息 for item in response.css("div.flw-item"): yield { "title": item.css("div.film-name a::text").get(), "detail_url": item.css("div.film-name a::attr(href)").get(), }
2. 手动分析验证流程(维护成本高)
如果不想用渲染引擎,可通过浏览器DevTools抓包拆解验证逻辑:
- 记录从验证页到目标页的所有请求,包括加载的验证脚本、提交验证的API请求(通常是POST,携带指纹类参数)、跳转时设置的Cookie/Token
- 在Scrapy中模拟构造这些请求的参数(比如Canvas生成的指纹、完整浏览器UA、请求头特殊字段),但这种方法会因网站更新验证规则快速失效,仅适合临时需求。
3. 基础防封措施
- 设置合理下载延迟:在
settings.py中添加DOWNLOAD_DELAY = 3,避免高频请求触发IP封禁 - 搭配代理IP池,分散请求来源
- 避免固定请求模板,随机化部分请求头字段(除UA外,可调整Accept、Accept-Language等)
内容的提问来源于stack exchange,提问作者Inan Muhtasim
相关产品推荐
相关产品推荐

