如何用Python爬取香港ITF政府网站表格?爬取失败求助
问题分析与解决方法
你的问题核心在于目标网站的表格数据是通过JavaScript动态渲染的,requests.get()只能获取页面的静态HTML骨架,实际表格内容还未被加载;另外也可能是请求时缺少必要的浏览器标识头,被服务器限制返回完整内容。以下是具体的解决思路和代码:
方法1:添加浏览器请求头,尝试获取静态内容
很多网站会校验请求中的User-Agent字段,模拟浏览器请求有可能拿到完整的页面内容:
from bs4 import BeautifulSoup import requests import pandas as pd url = 'https://www.itf.gov.hk/en/project-search/project-profile/index.html?ReferenceNo=TVP/2122/22' # 模拟Chrome浏览器的请求头 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' } page = requests.get(url, headers=headers) soup = BeautifulSoup(page.text, 'html.parser') table = soup.find('table', {'class': 'colorTbl projDetailTbl'}) if table: # 提取表头 headers = [th.text.strip() for th in table.find_all('th')] df = pd.DataFrame(columns=headers) # 提取表格行数据 for row in table.find_all('tr')[1:]: row_data = [td.text.strip() for td in row.find_all('td')] df.loc[len(df)] = row_data print(df) else: print("未找到目标表格,大概率是内容动态加载导致")
方法2:用Selenium处理动态渲染页面
如果添加请求头仍无效,说明内容完全由JavaScript生成,需要用Selenium模拟浏览器加载页面:
首先安装依赖:
pip install selenium
然后编写代码(需提前下载对应浏览器的驱动,比如ChromeDriver):
from bs4 import BeautifulSoup import pandas as pd from selenium import webdriver from selenium.webdriver.chrome.options import Options import time url = 'https://www.itf.gov.hk/en/project-search/project-profile/index.html?ReferenceNo=TVP/2122/22' # 配置Chrome无头模式(后台运行,不弹出浏览器窗口) chrome_options = Options() chrome_options.add_argument('--headless=new') chrome_options.add_argument('--disable-gpu') 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') driver = webdriver.Chrome(options=chrome_options) driver.get(url) # 等待页面加载完成(可根据实际情况调整等待时间) time.sleep(3) # 获取加载后的页面源码 page_source = driver.page_source soup = BeautifulSoup(page_source, 'html.parser') table = soup.find('table', {'class': 'colorTbl projDetailTbl'}) if table: headers = [th.text.strip() for th in table.find_all('th')] df = pd.DataFrame(columns=headers) for row in table.find_all('tr')[1:]: row_data = [td.text.strip() for td in row.find_all('td')] df.loc[len(df)] = row_data print(df) else: print("未找到目标表格") # 关闭浏览器驱动 driver.quit()
方法3:抓包获取API接口(高效进阶)
打开浏览器开发者工具(F12),切换到Network标签页,刷新页面后过滤XHR请求,找到返回项目数据的API接口。直接请求该接口获取JSON格式数据,比解析HTML更高效,也能避免动态渲染的问题。
内容的提问来源于stack exchange,提问作者Madd Kit
相关产品推荐
相关产品推荐

