我有一个用 Python 编写的解析器(aiohttp、bs4)。解析器的功能之一是通过链接访问文件(例如: https://modsfire.com/d/Mwv01aESgj73zx7 )。
import aiohttp
import yarl
import asyncio
from pprint import pprint
MODSFIRE_URL = "https://modsfire.com/"
COOKIES = {
'_ga_JXQKZFEW04': 'GS1.1.1718453797.5.1.1718456834.0.0.0',
'_ga': 'GA1.1.733263822.1718378970',
'old_date': 'eyJpdiI6IlA0NXg3aDV6QVBzazFMVHRibjR3NWc9PSIsInZhbHVlIjoiXC80RWt3ZHNNdEFQMks0SGhjdEltNEE9PSIsIm1hYyI6ImM3Mzg4NzkyZTA5YjI5YjRiZDc2YjdkODIyMDEwNDE4MzBmZWJlYWU0MTc0ZmMxZGQxNTc0MjQyN2NlMGE1YzYifQ%3D%3D',
'fid': 'eyJpdiI6IjFKSjJ1VDVaSHVpdmh4ZWdJcjBiZ2c9PSIsInZhbHVlIjoicTArdExGeDdPRFpua0dVWm1vZ1pRZz09IiwibWFjIjoiNjJjZDZjZDg1NzgxODk1NmJkNmNmMDBiOTg1OWUzMTM0MmU1MjI3ODExZjkzMGRkOTBhMWVmM2RkOTJhMGM3YSJ9',
'XSRF-TOKEN': 'eyJpdiI6ImNNM20wcjhLMnBBMW9sRG5VZm9rK1E9PSIsInZhbHVlIjoiRU9MRUVcLzExN0RiU1d2VXlXY0ExQ0tpbVwveGlDbDdiTFNpbURWSlZEZE4reEM0VlRxc1JWVFYyR3NLOTVwaGIyIiwibWFjIjoiMmUwOTNlYTIyYTkxMDZkNDJiNzY0NDE5ODY4ZDU1NGEwODMwNmIyYjZjZjliYzUxNTc3ZDZjNzA0ZGI5MTQwYiJ9',
'modsfire_session': 'eyJpdiI6Ikxia0dmMVwvMGtSQ3VyWWJBWHRadUZ3PT0iLCJ2YWx1ZSI6IjNmeFBkcmtWZ0I4S3l1WDB6eGhTT2JyTnBlajlcL3pxMGlubWNRR1NvUlZHQlI5eWMxVmpPelNhTzBjYUoyVXBzIiwibWFjIjoiODg5YTE2N2UzZGI1NDRhN2QwNGFlNjk3NDEwMDNkZTY5MThkZjJiZjE5ZDIyZGNlYjNhZWM1NDY2ODg4ZWU4NyJ9',
'referer_domain': 'eyJpdiI6ImdVM2lZYWRQdm1iNEkycXRJNGpRM3c9PSIsInZhbHVlIjoid1NmU0F5b2NiS0JpWk4yR051YVN2QT09IiwibWFjIjoiODExMDllOGQ4ZmU1Y2RjMWVkZTIxNmFhNzhiYzNmMTFkZWNmODVmZDc5NDFlMWJhNDhlMmNmNjE2MWQzZTIwYyJ9',
'cf_clearance': 'UFEt8KWYJuVxadyvHEgHGOcRxIzVrFYvF2h.KHdSeD8-1718456567-1.0.1.1-CmNj9kZt85DTea1QAvCxuIwwb3KzNJ96jRBsoM7r1oOOeMcNeLa3XS4osEElROQq0oely9xLAIj_U05z2sCiZg',
'a644b2a3a3018e5f62e31f82c6db5ae0': 'eyJpdiI6Ijl6eFwvWXp3UkpUWUhYcWVqYzlDb3R3PT0iLCJ2YWx1ZSI6IlI2YW1FZ2JkQmIyZm9wY0FUNkVEdGc9PSIsIm1hYyI6ImY5OGJlN2FkZjljZWYzNTM1ZjM5OGZjMmU1OGY0MWE2NTFiYjYyNTcwNDUzYzg1ZTJlNGNkMjc0ZmZiZjJiMTMifQ%3D%3D',
}
HEADERS = {
'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64; rv:127.0) Gecko/20100101 Firefox/127.0',
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8',
'Accept-Language': 'ru-RU,ru;q=0.8,en-US;q=0.5,en;q=0.3',
# 'Accept-Encoding': 'gzip, deflate, br, zstd',
'Referer': MODSFIRE_URL,
'Connection': 'keep-alive',
# 'Cookie': '_ga_JXQKZFEW04=GS1.1.1718453797.5.1.1718458248.0.0.0; _ga=GA1.1.733263822.1718378970; cf_clearance=UFEt8KWYJuVxadyvHEgHGOcRxIzVrFYvF2h.KHdSeD8-1718456567-1.0.1.1-CmNj9kZt85DTea1QAvCxuIwwb3KzNJ96jRBsoM7r1oOOeMcNeLa3XS4osEElROQq0oely9xLAIj_U05z2sCiZg',
'Upgrade-Insecure-Requests': '1',
'Sec-Fetch-Dest': 'document',
'Sec-Fetch-Mode': 'navigate',
'Sec-Fetch-Site': 'same-site',
'Sec-Fetch-User': '?1',
'Priority': 'u=1',
# Requests doesn't support trailers
# 'TE': 'trailers',
}
async def get_response_file(url):
session = aiohttp.ClientSession(headers=HEADERS, cookies=COOKIES)
response = await session.get(url, allow_redirects=True)
pprint(dict(response.request_info.headers))
print("===============")
pprint(dict(response.headers))
if response.status != 200:
return "Error"
filename = yarl.URL(response.url).name
response_headers = dict(response.headers)
if filename != "d.php":
response_headers["Content-Disposition"] = "attachment; filename=" + filename
response_headers["Content-Type"] = "application/octet-stream"
return response, response_headers
asyncio.run(get_response_file("https://modsfire.com/d/Mwv01aESgj73zx7"))
在我的机器上一切正常 - 我得到 200回复。但是,一旦我在 docker、wine 或我的服务器上运行此脚本,我就会收到响应 403。
在我的机器上,输出为: 在此处输入图像描述 在服务器上、在 docker 中和在 wine 中: 在此处输入图像描述
我的机器:
OS: Arch Linux x86_64
WM: bspwm
Kernel: 6.9.10-zen1-1-zen
Python 3.12.4
aiohttp==3.9.5
curl 8.8.0 (x86_64-pc-linux-gnu) libcurl/8.8.0 OpenSSL/3.3.1 zlib/1.3.1 brotli/1.1.0 zstd/1.5.6 libidn2/2.3.7 libpsl/0.21.5 libssh2/1.11.0 nghttp2/1.62.1 nghttp3/1.4.0
Release-Date: 2024-05-22
Docker version 27.0.3, build 7d4bcd863a
wine-9.13
我的服务器的特征: 在此处输入图像描述
- 我能够在 wine 中运行脚本,使用我的计算机作为代理(使用mitmproxy)。
- 我也尝试过使用公共代理-没有帮助
- 对url的curl请求在我的机器和我的服务器上有效,但在docker中却不起作用:|| |为什么curl请求可以工作,但aiohttp上的python脚本却不能?
curl '<url>' -H 'User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:127.0) Gecko/20100101 Firefox/127.0' -H 'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8' -H 'Accept-Language: ru-RU,ru;q=0.8,en-US;q=0.5,en;q=0.3' -H 'Accept-Encoding: gzip, deflate, br, zstd' -H 'Referer: https://modsfire.com/' -L -v
Why does the curl request work but the python script on aiohttp does not?
可能原因及解决方法
你遇到的问题是,在你的本地机器上可以正常工作的Python爬虫,在服务器、Docker和Wine环境下却返回403 Forbidden错误。这通常表明服务器端存在某种机制来阻止非浏览器请求。
以下是可能的原因及解决方法:
1. 用户代理和请求头
- 问题 : Modsfire网站可能根据请求头信息(例如用户代理)来识别和阻止非浏览器请求。
-
解决方法
:
-
更详细的请求头
: 尝试使用更完整、更像真实浏览器的请求头。可以使用浏览器开发者工具查看真实浏览器发送的请求头信息,并将它们添加到你的代码中。例如,添加
Accept-Encoding
、Sec-Ch-*
等头信息。 -
随机用户代理
: 每次请求时随机切换用户代理,模拟不同的浏览器访问。可以使用一些Python库,例如
fake_useragent
,来生成随机的用户代理字符串。
-
更详细的请求头
: 尝试使用更完整、更像真实浏览器的请求头。可以使用浏览器开发者工具查看真实浏览器发送的请求头信息,并将它们添加到你的代码中。例如,添加
2. Cookies和会话管理
- 问题 : Modsfire网站可能使用了Cookies或其他会话管理机制来验证请求是否来自合法的浏览器会话。
-
解决方法
:
-
会话保持
: 使用同一个
aiohttp.ClientSession
对象发送所有请求,以便在请求之间保持Cookies和其他会话信息。 - Cookies更新 : 确保你的代码能够正确处理和更新Cookies。可以使用浏览器开发者工具查看网站设置了哪些Cookies,并在你的代码中进行相应的处理。
-
会话保持
: 使用同一个
3. IP地址和地理位置
- 问题 : Modsfire网站可能限制了某些IP地址或地理位置的访问。
-
解决方法
:
- 检查IP封锁 : 确认你的服务器IP地址没有被Modsfire网站封锁。
- 使用代理 : 如果你的服务器IP地址被封锁,可以尝试使用代理服务器来访问网站。
4. JavaScript执行
- 问题 : Modsfire网站可能使用了JavaScript来生成下载链接或进行其他验证,而你的Python爬虫无法执行JavaScript代码。
-
解决方法
:
- 分析JavaScript代码 : 使用浏览器开发者工具分析网站的JavaScript代码,找出生成下载链接或进行验证的逻辑。
- 使用Headless浏览器 : 如果网站的逻辑过于复杂,无法通过分析JavaScript代码来解决,可以考虑使用Headless浏览器,例如Puppeteer或Playwright,来完全模拟浏览器行为。
5. 网站更新
- 问题 : Modsfire网站可能更新了其反爬虫机制,导致你的爬虫失效。
-
解决方法
:
- 更新爬虫 : 重新分析网站结构和行为,并相应地更新你的爬虫代码。
关于Curl请求可以工作的问题 :
Curl发送的请求可能与你的Python代码略有不同,例如请求头、Cookies等。这可能是Curl请求可以成功,而你的Python代码却失败的原因。
建议 :
- 使用浏览器开发者工具仔细比较Curl请求和你的Python代码发送的请求,找出差异。
- 尝试逐步调整你的Python代码,使其更接近Curl请求,例如添加缺少的请求头、处理Cookies等。
- 打印出详细的错误信息,例如服务器返回的完整HTTP响应,以便更好地排查问题。
希望以上信息能帮助你解决问题!
标签:python,docker,curl,aiohttp,wine From: 78774623