如何解决爬取网站时返回的HTML表格为空的问题
问题分析
你当前拿到空表格的核心原因有3个:
- 硬编码的
token、Cookie都是单次会话临时有效的值,过期或者和当前请求会话不匹配时,服务端校验不通过就不会返回有效数据 - 表单参数中
caddesokak(对应街道字段)为空,若实际查询时该字段为必填项,空值提交本来就不会返回结果 - 站点有CSRF校验规则,要求
token必须和当前请求的会话Cookie绑定,你复制的旧token和Cookie和新请求的会话不匹配,会被服务端拦截
解决步骤
- 用
requests.Session()维持同一会话,自动管理Cookie,不要手动硬编码Cookie值 - 先发GET请求访问查询表单页,从返回的HTML里提取实时生成的有效
token值,替换你之前复制的过期token - 补全所有必填的表单参数,可通过浏览器F12网络面板查看正常提交查询时的所有POST参数,确保所有必填项都赋值
- 若以上步骤还是无法拿到数据,直接用无头浏览器方案(playwright/selenium)模拟真实用户操作:打开表单页→选择对应查询条件→点击查询按钮→直接提取渲染后的表格内容,可绕过大部分反爬校验
修正示例代码
import requests from bs4 import BeautifulSoup # 初始化会话,自动维护Cookie session = requests.Session() # 配置基础请求头,和你本地浏览器UA保持一致即可 session.headers.update({ 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36', 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8' }) # 第一步:访问表单页,获取实时token form_page_url = "https://www.turkiye.gov.tr/mersin-yenisehir-belediyesi-arsa-rayic-degeri-sorgulama" form_resp = session.get(form_page_url) soup = BeautifulSoup(form_resp.text, 'html.parser') # 根据页面实际token字段的属性调整选择器,一般为隐藏的input字段 token = soup.find('input', attrs={'name': 'token'})['value'] # 第二步:构造完整请求参数,补全必填的街道字段 post_url = "https://www.turkiye.gov.tr/mersin-yenisehir-belediyesi-arsa-rayic-degeri-sorgulama?submit" payload = { 'btn': 'Sorgula', 'caddesokak': '替换为你要查询的对应街道值', 'id': '', 'islem': '', 'mahalle': '27', 'token': token, 'yil': '2021' } # 提交查询请求 result_resp = session.post(post_url, data=payload) print(result_resp.text)
内容的提问来源于stack exchange,提问作者HHY
相关产品推荐
相关产品推荐

