首页 > 编程问答 >服务器和本地主机上对相同请求(curl、python aiohttp)的不同响应

服务器和本地主机上对相同请求(curl、python aiohttp)的不同响应

时间:2024-07-21 15:35:32浏览次数:16  
标签:python docker curl aiohttp wine

我有一个用 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

相关文章