You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

使用Python Beautiful Soup爬取服装网站仅获下半部分内容的问题求助

解决Beautiful Soup抓取服装网站时HTML内容被随机截断的问题

嘿,我之前也碰到过类似的棘手情况!结合你说的“其他网站正常、仅目标服装站出现随机截断”,大概率是目标网站的反爬机制或者HTTP响应传输特性导致的,给你几个针对性的解决方案,一步步排查:


1. 先模拟真实浏览器的请求头

很多电商网站会通过校验请求头来识别爬虫,默认的requests请求头太“机器化”,很容易被拦截或截断响应。你可以给请求加上完整的浏览器头信息:

import requests
from bs4 import BeautifulSoup

# 模拟Chrome浏览器的请求头
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36',
    'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
    'Accept-Language': 'zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3',
    'Connection': 'keep-alive',
    'Upgrade-Insecure-Requests': '1'
}

target_url = "你的目标服装网站URL"
response = requests.get(target_url, headers=headers)
# 先确认请求是否成功,避免因为4xx/5xx错误导致的内容异常
response.raise_for_status()

soup = BeautifulSoup(response.text, 'html.parser')

2. 强制读取完整的响应内容

有些网站会用**分块传输(Transfer-Encoding: chunked)**返回内容,requests默认会自动拼接,但偶尔会因为网络波动或网站限制导致拼接不完全。你可以用流模式手动读取所有响应块:

response = requests.get(target_url, headers=headers, stream=True)
response.raw.decode_content = True  # 自动处理gzip/deflate压缩的内容

full_html = b""
# 逐块读取响应内容
for chunk in response.iter_content(chunk_size=4096):
    if chunk:
        full_html += chunk

# 转成字符串再交给BeautifulSoup处理
soup = BeautifulSoup(full_html.decode('utf-8'), 'html.parser')

3. 排查是否是动态加载的内容

如果上面两种方法都没用,那大概率是目标网站的产品信息是通过JavaScript异步加载的——Beautiful Soup只能抓取静态HTML,动态渲染的内容它看不到。这时候得用浏览器自动化工具来模拟页面渲染:

比如用Selenium(需要先安装ChromeDriver):

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from bs4 import BeautifulSoup

# 配置无头模式(不弹出浏览器窗口)
chrome_options = Options()
chrome_options.add_argument('--headless=new')
chrome_options.add_argument('--user-agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36"')

driver = webdriver.Chrome(options=chrome_options)
driver.get(target_url)
# 等待页面完全加载(可以根据产品元素的选择器调整等待逻辑)
driver.implicitly_wait(10)

# 获取渲染后的完整页面源码
page_source = driver.page_source
soup = BeautifulSoup(page_source, 'html.parser')

driver.quit()  # 记得关闭浏览器

4. 最后检查反爬限流

如果还是出现随机截断,可能是网站对你的IP做了请求频率限制。可以尝试:

  • 在请求之间添加随机延迟(比如time.sleep(random.uniform(1,3))
  • 切换代理IP(避免单一IP被识别)

内容的提问来源于stack exchange,提问作者Danilo Galjak

火山引擎 最新活动