希腊IP下用Python Requests爬取网站仍连美服获非希语内容的解决求助
问题描述
我身处希腊,持有希腊IP地址,尝试使用Python的requests库进行网页爬取,但发现请求连接的是美国服务器,且返回的内容并非希腊语。我已设置请求头(headers)和User-Agent以模拟希腊地区用户,但未产生效果。以下是我使用的Python脚本:
import requests from bs4 import BeautifulSoup from urllib.parse import urljoin import time import firebase_admin from firebase_admin import credentials, db import asyncio # Initialize Firebase with your credentials JSON file and database URL cred = credentials.Certificate("C:\Users\alexl\OneDrive\Desktop\Cook Group\Scripts\SNS\creds.json") firebase_admin.initialize_app(cred, { 'databaseURL': 'https://sns-database-default-rtdb.europe-west1.firebasedatabase.app/' }) # Function to load data from Firebase # (snipped for brevity) # Function to save data to Firebase # (snipped for brevity) # Your bot should be running inside an async function async def main(): while True: print("Refreshing data...") # Debug message # Specify the URL you want to scrape url = "https://www.sneakersnstuff.com/en/176/nike-dunk" headers = { 'accept-language': 'en-GR-0-0', "sns.state": "en-GR-0-0", "Cookie": "sns.state=en-GR-0-0", 'user-agent': "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/113.0.0.0 Safari/537.36" } # Load the previously scraped data from Firebase # (snipped for brevity) # Send an HTTP GET request to the URL response = requests.get(url, headers=headers) # Check if the request was successful (status code 200) # (snipped for brevity) print("Waiting for the next refresh...") # Debug message # Wait for 60 seconds before the next refresh await asyncio.sleep(60) # Ensure that the main function is run if __name__ == "__main__": asyncio.run(main())
网站Cookie截图:
解决方法
- 修正
accept-language格式:标准的语言头格式应为el-GR,el;q=0.9,en;q=0.8,你当前使用的en-GR-0-0不符合规范,替换后可让服务器优先返回希腊语内容。 - 补充完整Cookie信息:从截图看,网站Cookie包含
sns.state以外的多个字段(如currency、追踪类Cookie),建议用浏览器开发者工具复制完整的请求Cookie,替换代码中硬编码的Cookie值,确保与浏览器访问时的会话一致。 - 改用Session维持会话:静态Cookie容易过期,用
requests.Session()先获取初始会话Cookie,再更新headers和地区相关Cookie,模拟浏览器的完整访问流程:async def main(): while True: print("Refreshing data...") url = "https://www.sneakersnstuff.com/en/176/nike-dunk" session = requests.Session() # 先获取初始会话Cookie session.get("https://www.sneakersnstuff.com/") # 更新请求头和地区Cookie session.headers.update({ 'accept-language': 'el-GR,el;q=0.9,en;q=0.8', 'user-agent': "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/113.0.0.0 Safari/537.36" }) session.cookies.set('sns.state', 'en-GR-0-0') # 发送请求 response = session.get(url) # 后续处理逻辑... await asyncio.sleep(60) - 验证IP有效性:通过
requests.get("https://httpbin.org/ip")确认当前请求使用的IP确实是希腊地区的,排除代理或VPN失效的问题。 - 检查服务器响应标识:打印
response.headers查看是否有地区相关字段(如X-Server-Region),或解析返回HTML中的地区标签,确认服务器是否识别到你的地区设置。
内容的提问来源于stack exchange,提问作者Alex Leontaridis
相关产品推荐
相关产品推荐

