能实现,但需用selenium模拟浏览器或调用合规API;因多数招标网站采用JS动态渲染、请求头校验、IP频控等反爬机制,requests常返回无表格的HTML,导致BeautifulSoup无法解析。

能实现,但必须明确:公开招标信息网站反爬机制普遍较强,直接用 requests + BeautifulSoup 大概率返回空数据或验证码页面;真正可用的方案往往依赖 selenium 模拟浏览器,或调用有合规接口的政府采购平台(如中国政府采购网 API)。
为什么 requests 常常抓不到数据?
多数招标网站(如省级公共资源交易中心)已启用动态渲染、请求头校验、JavaScript 生成 DOM、IP 频控甚至滑块验证。你用 requests.get(url) 拿到的 HTML 里经常没有 table 或 tr 标签——因为真实列表是 JS 运行后才插入的。
- 常见错误现象:
BeautifulSoup(html, 'lxml').find_all('tr')返回空列表,但浏览器 F12 看得到表格 - 检查方法:用
requests获取的原始响应中搜索关键词(如“招标公告”),若搜不到,基本确认是 JS 渲染 - 绕过思路:换
selenium启动真实浏览器,或找网站是否提供/api/xxx?keyword=...类型的接口(推荐优先查)
用 selenium 抓中国政府采购网(示例站)的关键步骤
以 中国政府采购网 为例,它允许简单查询且无强验证,适合入门实践。注意:需配合显式等待,否则元素找不到。
- 安装驱动:
pip install selenium,再下载匹配 Chrome 版本的chromedriver(放入PATH或指定路径) - 关键代码片段(不封装,直击痛点):
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
from openpyxl import Workbook
<p>driver = webdriver.Chrome()
driver.get("<a href="https://www.php.cn/link/e7b2a4d2faed120c6835a47ad7ac0e8d/cggg/zygg/">https://www.php.cn/link/e7b2a4d2faed120c6835a47ad7ac0e8d/cggg/zygg/</a>")</p><h1>等待列表容器出现(不能只等页面加载完)</h1><p>wait = WebDriverWait(driver, 10)
wait.until(EC.presence_of_element_located((By.CLASS_NAME, "vF_detail_list")))</p><p>items = driver.find_elements(By.CSS_SELECTOR, ".vF_detail_list ul li")
data = []
for item in items[:5]: # 先取前5条测试
title = item.find_element(By.TAG_NAME, "a").text.strip()
link = item.find_element(By.TAG_NAME, "a").get_attribute("href")
date = item.find_element(By.TAG_NAME, "em").text.strip()
data.append([title, link, date])</p><h1>写入 Excel</h1><p>wb = Workbook()
ws = wb.active
ws.append(["标题", "链接", "日期"])
for row in data:
ws.append(row)
wb.save("zfcg.xlsx")
driver.quit()
- 易踩坑:
find_element报NoSuchElementException?大概率 selector 写错或没加wait;get_attribute("href")比.text更可靠,避免拿错文本 - 性能提示:每页抓完后建议
time.sleep(1),避免被当刷量;翻页时用driver.find_element(By.LINK_TEXT, "下一页")而非拼 URL
存 Excel 时别忽略这三点
openpyxl 是目前最稳妥的选择,pandas.DataFrame.to_excel() 在处理超长文本、特殊字符、中文列名时容易出编码或格式错乱。
立即学习“Python免费学习笔记(深入)”;
- 列宽自适应?
openpyxl不自带,得手动循环ws.column_dimensions['A'].width = 50 - 超链接失效?写入时用
ws.cell(row=i, column=j).hyperlink = link,不能只写字符串 - 日期格式错乱?Excel 默认把“2024年3月15日”当普通文本;建议统一转成
datetime.date(2024, 3, 15)再写入,单元格格式自动识别
实际落地时,最大的复杂点不在代码本身,而在于目标网站结构是否稳定——今天好用的 .vF_detail_list 类名,下周改版可能就变成 .list-container。务必把选择器和字段提取逻辑单独抽成配置项,别硬编码进主流程。


















