You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python中Urllib2爬取网页为何仅返回格式而非实际数据?

网页爬取无法获取目标数据的问题解决指南

我来帮你拆解下这两个爬取场景里的问题,以及对应的解决办法:

第一个场景:爬取aps.unmc.edu的AP数据库数据

你最开始用urllib2爬取时只拿到了HTML框架,没获取到净电荷、长度这些实际数据,大概率是因为网站识别出了爬虫请求,没有返回完整内容。很多网站会检查请求头里的User-Agent字段,拒绝非浏览器发起的请求。

给你调整后的代码,改用更易用的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/114.0.0.0 Safari/537.36'
}

for i in range(1, 2):
    id_name = f'AP{i:05d}'
    web_page = f"http://aps.unmc.edu/AP/database/query_output.php?ID={id_name}"
    # 带上请求头发起请求,避免被识别为爬虫
    response = requests.get(web_page, headers=headers)
    # 解析返回的HTML内容
    soup = BeautifulSoup(response.text, 'html.parser')
    
    # 这里需要根据页面实际的HTML结构调整定位逻辑
    # 举个例子,假设净电荷在class为'net-charge'的标签中,长度在class为'peptide-length'的标签中
    net_charge = soup.find(class_='net-charge').text.strip() if soup.find(class_='net-charge') else '未找到数据'
    peptide_length = soup.find(class_='peptide-length').text.strip() if soup.find(class_='peptide-length') else '未找到数据'
    
    print(f"ID: {id_name}, 净电荷: {net_charge}, 肽链长度: {peptide_length}")

小提示:你可以用浏览器的开发者工具(按F12)查看目标数据对应的HTML元素,比如class、id属性,再调整find或find_all的参数来精准定位数据。

第二个场景:爬取dbaasp.org的肽序列数据

你用requests+BeautifulSoup没拿到肽序列,核心原因是这些数据是通过JavaScript动态加载的——页面初始的HTML里只有框架结构,实际的肽序列等数据是浏览器加载页面后执行JS才渲染出来的,而BeautifulSoup只能解析初始的静态HTML,自然拿不到动态加载的内容。

这里给你两种可行的解决思路:

  • 思路1:抓包找API接口(推荐,效率更高):用浏览器开发者工具的“网络”面板,过滤XHR请求,找到加载肽序列的API接口,直接请求这个接口获取结构化数据(比如JSON格式)。
  • 思路2:用Selenium模拟浏览器(更直观):模拟真实浏览器打开页面,等待JS加载完成后再提取数据。

下面是思路2的示例代码:

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

# 初始化Chrome浏览器(需要提前下载对应版本的chromedriver,和浏览器版本匹配)
driver = webdriver.Chrome()

for i in range(8, 9):
    webpage = f"https://dbaasp.org/peptide-card?type=39&id={i}"
    driver.get(webpage)
    
    # 等待肽序列元素加载完成,最多等待10秒
    try:
        # 假设肽序列在id为'peptide-sequence'的标签中,需要根据实际页面调整定位方式
        peptide_sequence = WebDriverWait(driver, 10).until(
            EC.presence_of_element_located((By.ID, 'peptide-sequence'))
        ).text.strip()
        print(f"ID: {i}, 肽序列: {peptide_sequence}")
    except Exception as e:
        print(f"获取ID {i} 的肽序列失败: {str(e)}")

# 爬取完成后关闭浏览器
driver.quit()

注意:使用Selenium时,要确保下载的浏览器驱动(比如chromedriver)和你的浏览器版本一致,也可以开启headless模式让浏览器在后台运行,避免弹出窗口。

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 06:55:13