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
相关产品推荐
相关产品推荐

