Python爬虫:本地与服务器调用数据不一致问题求助
服务器(Debian Bullseye)运行Python爬虫爬取homegate.ch的沃州租房列表时,一周前起返回的价格数据与网页显示不符,但本地Windows 11运行相同代码能获取正确数据。已尝试更换服务器IP(VPN)、修改请求Header,均未解决问题。核心代码如下:
from bs4 import BeautifulSoup import requests header = { "User-Agent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.75 Safari/537.36", "X-Requested-With": "XMLHttpRequest" } url = "https://www.homegate.ch/louer/biens-immobiliers/canton-vaud/liste-annonces?ep=1&o=dateCreated-desc" response = requests.get(url, headers=header) soup = BeautifulSoup(response.text, features='lxml')
关键异常:response.text中的价格字段已与网页显示不一致,数据处理环节无问题。
完全复用本地浏览器的请求Header
打开本地浏览器开发者工具,复制目标页面请求的完整Header(包含Accept、Accept-Language、Cookie、Referer等所有字段),服务器端请求时直接使用该Header。重点关注Accept-Language(网站可能根据语言/地区返回不同价格)和Cookie(关联会话状态,本地浏览器的会话Cookie可能让网站返回真实数据)。模拟浏览器渲染获取动态内容
homegate.ch可能通过JavaScript动态渲染价格,requests仅能获取静态HTML,无法执行JS。改用playwright模拟真实浏览器行为:from playwright.sync_api import sync_playwright from bs4 import BeautifulSoup with sync_playwright() as p: browser = p.chromium.launch(headless=True) page = browser.new_page() page.goto("https://www.homegate.ch/louer/biens-immobiliers/canton-vaud/liste-annonces?ep=1&o=dateCreated-desc") soup = BeautifulSoup(page.content(), features='lxml') browser.close()修正TLS指纹与IP类型
网站可能通过TLS指纹识别非浏览器请求(requests的TLS指纹与浏览器差异明显),改用curl-cffi模拟浏览器指纹:from curl_cffi import requests from bs4 import BeautifulSoup header = { "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" } response = requests.get(url, headers=header, impersonate="chrome118") soup = BeautifulSoup(response.text, features='lxml')另外,VPN的IP可能属于数据中心段,容易被标记为爬虫,尝试使用住宅代理IP替代。
验证请求参数一致性
在服务器和本地分别请求https://httpbin.org/headers和https://httpbin.org/ip,对比返回的IP、Header信息,确认两者是否完全一致,排除隐藏的参数差异。
内容的提问来源于stack exchange,提问作者Darko MACORITTO

