使用BeautifulSoup爬取网页异常:返回大量随机字符串而非预期HTML
解决BeautifulSoup返回内容与浏览器不符的问题
你遇到的情况是网站反爬机制导致的:requests 默认发送的请求头带有明显爬虫标识(比如User-Agent: python-requests/xxx),网站会返回混淆后的内容或验证页面,而非真实的页面HTML。另外,该网站内容大概率通过JavaScript动态渲染,requests 只能获取初始静态HTML,无法执行JS加载后续内容。
下面是具体解决步骤:
1. 先尝试添加浏览器请求头伪装
给requests.get添加模拟浏览器的请求头,核心是设置User-Agent:
import requests from bs4 import BeautifulSoup URL = "https://www.mediaexpert.pl/" 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).text soup = BeautifulSoup(response, "html.parser") print(soup.prettify())
如果添加后仍得到混淆内容,说明网站有更严格的反爬(比如Cloudflare验证),需要用能执行JavaScript的工具。
2. 使用Selenium模拟浏览器渲染
Selenium可以模拟真实浏览器行为,执行JS并获取渲染后的完整HTML:
先安装依赖:
pip install selenium
下载对应浏览器的驱动(比如Chrome的chromedriver,需与浏览器版本匹配),再编写代码:
from selenium import webdriver from selenium.webdriver.chrome.options import Options from bs4 import BeautifulSoup URL = "https://www.mediaexpert.pl/" # 配置Chrome选项,模拟正常浏览器 chrome_options = Options() chrome_options.add_argument("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") chrome_options.add_argument("--headless=new") # 无头模式,不显示浏览器窗口 driver = webdriver.Chrome(options=chrome_options) driver.get(URL) # 获取渲染后的HTML page_source = driver.page_source soup = BeautifulSoup(page_source, "html.parser") print(soup.prettify()) driver.quit()
如果遇到Cloudflare人机验证,可使用undetected-chromedriver替代标准chromedriver,它专门用于绕过这类验证:
pip install undetected-chromedriver
代码示例:
import undetected_chromedriver as uc from bs4 import BeautifulSoup URL = "https://www.mediaexpert.pl/" driver = uc.Chrome() driver.get(URL) page_source = driver.page_source soup = BeautifulSoup(page_source, "html.parser") print(soup.prettify()) driver.quit()
注意事项
- 爬取前务必查看网站的
robots.txt文件(https://www.mediaexpert.pl/robots.txt),确认允许爬取的内容,遵守网站规则。 - 不要频繁发送请求,避免给服务器造成压力,建议添加请求间隔(比如
time.sleep(2))。
内容的提问来源于stack exchange,提问作者keepgoin
相关产品推荐
相关产品推荐

