手动构建后打开链接可以工作,但从代码中却不行

问题描述 投票:0回答:1

我有一个网站,它使用 2 个 API 调用来构建下载 gzip 文件的实际链接,问题是标头发生了很大变化,我认为 cookie 也发生了很大变化,我尝试找出哪些是那些保持不变,其他领域正在以何种方式发生变化,但到目前为止还没有运气。 网站是这个

我正在使用

urlib
库,如下所示:

request = urllib.request.Request(link, headers = headers)
response = urllib.request.urlopen(request)
web-scraping web-crawler python-requests-html
1个回答
0
投票

我使用以下网站来查找应包含在您将执行的请求中的正确标头。

通常,您不需要在请求中发送 Cookie,但由于某种原因,您的网站有时没有它们就无法工作(或者也可能是其他原因)。

我使用此代码来获取 cookie 的值:

import http.cookiejar

cookie_value = ""
cookie_jar = http.cookiejar.CookieJar()
cookie_processor = urllib.request.HTTPCookieProcessor(cookie_jar)
opener = urllib.request.build_opener(cookie_processor)
response = opener.open(base_url)
for cookie in cookie_jar:
    cookie_value += f"{cookie.name}={cookie.value},"
cookie_value = cookie_value[:-1]

然后我将其插入到从上述网站获得的标题中:

headers1 = {
    "Accept": "application/json, text/javascript, */*; q=0.01",
    "Accept-Encoding": "gzip, deflate",
    "Accept-Language": "en-US,en;q=0.9",
    "Connection": "keep-alive",
    "Cookie": f"{cookie_value}",
    "Host": "prices.super-pharm.co.il",
    "Referer": f"{base_url}/",
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36",
    "X-Requested-With": "XMLHttpRequest"
}
headers2 = {
    'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7',
    'Accept-Language': 'en-US,en;q=0.9',
    'Connection': 'keep-alive',
    'Referer': f'{base_url}/',
    'Upgrade-Insecure-Requests': '1',
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36',
    "Cookie": f"{cookie_value}",
}

然后我使用以下代码来获取 gzip 文件的最终 API URL:

link1 = f"{base_url}{href1}"
request = urllib.request.Request(link1, headers=headers1)
response = urllib.request.urlopen(request)
res = response.read()
_decode = ast.literal_eval(res.decode("utf-8"))
_decode = _decode['href']
link2 = f"http://prices.super-pharm.co.il{_decode}".replace('\/', '//')
request = urllib.request.Request(link2 , headers = headers2)
response = urllib.request.urlopen(request)

最后您可以使用

response
来获取您的文件。

© www.soinside.com 2019 - 2024. All rights reserved.