Python爬取Zoro.to流媒体站点时遭遇元素检查器跳转限制的求助
Python爬取Zoro.to流媒体站点时遭遇元素检查器跳转限制的求助
嘿,我刚看到你的问题,作为曾经踩过类似反爬坑的人,太懂这种挫败感了😅!首先得说,你遇到的“打开元素检查器就跳回首页”是Zoro.to这类流媒体站点常用的反调试/反爬机制——它们会检测浏览器的开发者工具是否激活,一旦发现就强制跳转,防止用户查看核心DOM结构或者爬取内容。
不过好在爬取的时候我们不需要手动开检查器,真正影响你代码的是另一个问题:Zoro.to的很多页面内容是通过JavaScript动态渲染的,而你用的requests+BeautifulSoup只能获取页面的初始静态HTML,根本拿不到动态加载的剧集、下载链接这些核心内容。加上站点可能还会验证请求的User-Agent、Cookie等信息,直接用requests很容易被识别为爬虫。
下面给你几个针对性的解决思路和代码修改建议:
1. 先搞懂为什么你的当前代码拿不到内容
你的getWebpage函数用requests.get请求页面,但存在两个核心问题:
- 没有设置模拟浏览器的User-Agent,站点可能直接拒绝你的请求或者返回空内容
- 页面的剧集列表、下载链接都是JS动态生成的,静态HTML里根本没有这些元素,所以
findAll自然找不到目标内容
2. 改用可以模拟浏览器的工具(推荐Playwright)
这类工具能完全模拟真实浏览器的行为,执行JavaScript,绕过大部分反爬和动态渲染的问题。这里给你举个Playwright的例子(比Selenium更轻量,反爬绕过效果更好):
首先安装Playwright:
pip install playwright playwright install chromium
然后修改你的代码,用Playwright来获取动态渲染后的页面:
from playwright.sync_api import sync_playwright from bs4 import BeautifulSoup # 模拟浏览器获取动态渲染后的页面 def get_dynamic_webpage(url): with sync_playwright() as p: # 启动无头浏览器(headless=False可以看到浏览器窗口,方便调试) browser = p.chromium.launch(headless=True) page = browser.new_page( user_agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36" ) # 绕过站点的反调试检测 page.add_init_script(""" Object.defineProperty(navigator, 'webdriver', {get: () => undefined}); """) page.goto(url, wait_until="networkidle") html = page.content() browser.close() return html # 修改后的搜索剧集链接函数 def getWatchUrl(titleName): keyword = "+".join(titleName.split()) SearchURL = f'https://zoro.to/search?keyword={keyword}' try: html = get_dynamic_webpage(SearchURL) soup = BeautifulSoup(html, 'html5lib') except Exception as e: print(f"Unexpected Error {e}. Please try again!") return None try: titles = soup.findAll('div', {'class' : 'film-poster'}) except Exception as e: print(e) print("Couldn't Find title. Check spellings and please try again!") return None for title in titles: content = title.find('a') if not content: continue try: if titleName in content.get('title').lower(): path = content.get('href').replace('?ref=search', '') watchURL = f'https://zoro.to/watch{path}' return watchURL except: continue print("Couldn't Find title. Check spellings and please try again!") return None # 修改后的获取下载链接函数 def getDownloadUrl(watchUrl): try: html = get_dynamic_webpage(watchUrl) soup = BeautifulSoup(html, 'html5lib') print(soup.prettify()) # 这里可以继续解析下载链接,比如查找页面中对应的下载按钮标签 except Exception as e: print(f"Unexpected Error {e}. Please try again!") return None def main(): animeName = input("Enter Anime Name: ").lower() watchURL = getWatchUrl(animeName) if watchURL is not None: getDownloadUrl(watchURL) if __name__ == "__main__": main()
3. 关于手动查看元素的小技巧
如果你确实需要手动查看页面DOM,可以试试:
- 用Firefox浏览器,它的开发者工具反检测能力比Chrome好一些
- 打开开发者工具后,在控制台执行
debugger语句,临时暂停页面的反调试逻辑 - 临时禁用站点的JavaScript(Chrome设置→隐私和安全→站点设置→JavaScript),不过这样站点可能无法正常显示内容,仅供临时查看静态结构
最后提醒一句:爬取流媒体站点可能涉及版权问题,一定要确保你的行为符合当地法律和站点的使用条款哦!
备注:内容来源于stack exchange,提问作者Mythical Phantom
相关产品推荐
相关产品推荐

