使用pywebcopy下载skroutz.gr网页无法获取完整内容该如何解决
问题原因
下载内容不全主要来自两个核心原因:
- 目标站点有反爬校验,pywebcopy默认的请求特征会被识别为爬虫,仅返回部分内容
- 页面大量内容依赖JavaScript动态渲染加载,pywebcopy默认不执行JS代码,无法抓取异步加载的商品参数、评价、相关推荐等内容
解决方案
方案1:调整pywebcopy配置(无需额外依赖,适合静态内容为主的场景)
pywebcopy底层已经封装了requests请求逻辑,优先补充自定义请求头伪装正常浏览器,调整后代码如下:
from pywebcopy import save_webpage # 伪装Chrome浏览器的请求头,避免被反爬拦截 custom_headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36", "Accept-Language": "el-GR,el;q=0.9,en;q=0.8", "Referer": "https://www.skroutz.gr/" } url = 'https://www.skroutz.gr/s/23283554/Asus-Prime-Z490-P-Motherboard-ATX-%CE%BC%CE%B5-Intel-1200-Socket.html' download_folder = '/path/to/downloads/' kwargs = { 'bypass_robots': True, 'project_name': 'recognisable-name2', 'headers': custom_headers, 'timeout': 30, # 延长超时时间避免加载中断 'load_css': True, 'load_js': True, 'load_images': True } save_webpage(url, download_folder, **kwargs)
如果调整后仍无法拿到完整内容,说明页面动态加载占比高,需要换支持JS渲染的工具。
方案2:用Playwright模拟浏览器加载(适合动态内容场景,可拿到完整渲染后页面)
Playwright会启动真实浏览器内核执行所有JS代码,等待页面完全加载后再抓取内容,操作步骤如下:
- 安装依赖:
pip install playwright && playwright install chromium - 示例代码:
from playwright.sync_api import sync_playwright target_url = 'https://www.skroutz.gr/s/23283554/Asus-Prime-Z490-P-Motherboard-ATX-%CE%BC%CE%B5-Intel-1200-Socket.html' save_path = '/path/to/downloads/full_skroutz_page.html' with sync_playwright() as p: # 启动无头Chrome浏览器 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/120.0.0.0 Safari/537.36" ) # 等待页面所有网络请求结束后再操作 page.goto(target_url, wait_until="networkidle", timeout=60000) # 获取完整渲染后的HTML源码 full_page_content = page.content() # 保存到本地 with open(save_path, "w", encoding="utf-8") as f: f.write(full_page_content) # 如需同时下载CSS、图片等附属资源,可以将拿到的HTML传给pywebcopy做后续解析下载 browser.close()
关于是否需要结合requests的说明
pywebcopy底层已经封装了requests的请求逻辑,常规场景不需要额外编写requests相关代码。如果需要提前手动处理Cookie、过站点校验,可以先调用requests拿到有效凭证后再传给pywebcopy使用。如果是动态内容场景,额外加requests也无法解决问题,因为requests本身也不支持JS执行,无法拿到异步加载的内容。
内容的提问来源于stack exchange,提问作者Ας Μαθουμε
相关产品推荐
相关产品推荐

