如何调试Python编写的CCASS ASPX表单网页爬虫无返回无报错问题
无结果也不报错的核心原因是:POST请求未拿到预期的搜索结果页,返回的HTML中没有匹配
table tbody tr的元素,for循环未触发执行,因此既无输出也无报错。
调试步骤
- 修正请求URL并校验响应状态
原代码使用HTTP协议URL,目标站点已全站升级HTTPS,HTTP请求会触发301跳转导致POST参数丢失。先将URL替换为https://www.hkexnews.hk/sdw/search/searchsdw.aspx,同时打印POST请求的状态码和返回内容前缀,确认是否正常拿到结果页:
若状态码不是200,或返回内容包含验证、报错提示,优先解决请求层面的问题。# 加到POST请求之后 print(req.status_code) print(req.text[:1000]) - 补全必填请求头
ASPX站点通常会校验Referer请求头,缺少的话会直接拒绝搜索请求,在POST请求的headers中添加Referer字段:req = s.post(URL,data=payload,headers={ "User-Agent":"Mozilla/5.0", "Referer": URL }) - 校验提交的payload参数
打印提取到的payload,确认__VIEWSTATE、__EVENTVALIDATION等ASPX必备动态参数是否正确提取,有没有遗漏其他隐藏字段。同时确认搜索参数的键名是否有变动,比如部分站点更新后txtStockCode可能改为其他命名。 - 修正结果选择器
站点更新后表格结构、类名可能发生变化,不要使用table tbody tr这类模糊选择器,先查看返回HTML中结果表格的id或类名,替换为更精准的选择器,比如该站点的结果选择器可改为:for items in soup_obj.select("div#pnlResult table tbody tr"):
修正后参考代码
import requests from bs4 import BeautifulSoup URL = "https://www.hkexnews.hk/sdw/search/searchsdw.aspx" with requests.Session() as s: s.headers={"User-Agent":"Mozilla/5.0"} res = s.get(URL) soup = BeautifulSoup(res.text,"lxml") payload = {item['name']:item.get('value','') for item in soup.select("input[name]")} payload['__EVENTTARGET'] = 'btnSearch' payload['txtStockCode'] = '00001' req = s.post(URL,data=payload,headers={ "User-Agent":"Mozilla/5.0", "Referer": URL }) soup_obj = BeautifulSoup(req.text,"lxml") # 改用精准选择器 for items in soup_obj.select("div#pnlResult table tbody tr"): data = [item.get_text(strip=True) for item in items.select("td")] print(data)
内容的提问来源于stack exchange,提问作者MrTrees
相关产品推荐
相关产品推荐

