使用Beautiful Soup爬取网页时返回脚本代码而非HTML的问题求助
解决购物网站爬取返回脚本内容的问题
问题说明
- 爬取URL1(https://www.auchan.pt/pt/alimentacao/alimentacao-bebe-e-crianca/papa-e-farinha-lactea/farinha-cerelac-lactea-500g/70511.html)时,能正常获取页面完整HTML并解析
- 爬取URL2(https://www.continente.pt/produto/papa-infantil-farinha-lactea-6m-cerelac-2004388.html)时,返回内容为脚本代码,导致后续解析元素失败,但浏览器打开该网页显示正常
你的基础爬取代码:
import requests from bs4 import BeautifulSoup response = requests.get(url) soup = BeautifulSoup(response.content, "html.parser") # ... 后续解析代码 ...
解决方法
1. 添加请求头模拟浏览器访问
多数网站会通过User-Agent识别请求来源,直接用requests.get发起的请求会被判定为非浏览器请求。添加浏览器请求头即可绕过基础验证:
headers = { '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' } response = requests.get(url, headers=headers)
可以从自己浏览器的开发者工具中复制真实的User-Agent,匹配当前使用的浏览器版本,效果更好。
2. 处理JavaScript动态渲染
如果网站内容是通过JavaScript动态生成的,requests只能获取页面初始的静态HTML,无法拿到JS加载后的内容。这种情况需要用工具模拟浏览器加载页面:
使用Selenium示例:
from selenium import webdriver from selenium.webdriver.chrome.options import Options from bs4 import BeautifulSoup # 配置无头模式,不弹出浏览器窗口 options = Options() options.add_argument('--headless=new') driver = webdriver.Chrome(options=options) driver.get(url) # 获取浏览器渲染完成后的页面源码 soup = BeautifulSoup(driver.page_source, "html.parser") # 执行你的解析逻辑... driver.quit() # 关闭浏览器实例
使用前需要安装Selenium库,以及对应浏览器的驱动(比如ChromeDriver)。
3. 保持会话携带Cookie
部分网站会通过Cookie验证用户会话,第一次请求会设置Cookie,后续请求需要携带才能获取完整内容。用requests.Session()可以自动管理会话Cookie:
import requests from bs4 import BeautifulSoup session = requests.Session() session.headers.update(headers) # 复用之前的headers response = session.get(url) soup = BeautifulSoup(response.content, "html.parser")
4. 控制请求频率
短时间内频繁请求会触发网站的反爬限制,添加请求间隔可以降低被封禁的概率:
import time # 每次请求前等待2秒 time.sleep(2) response = requests.get(url, headers=headers)
注意事项
- 遵守目标网站的
robots.txt规则,避免过度爬取给服务器造成压力 - 若遇到验证码、IP封禁等更严格的反爬机制,优先考虑使用网站提供的官方API(如果有),或调整爬取策略
内容的提问来源于stack exchange,提问作者Rodrigo Monteiro
相关产品推荐
相关产品推荐

