[当尝试解析亚马逊产品时,我的请求有时会重定向到其他页面
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[当尝试解析亚马逊产品时,我的请求有时会重定向到其他页面相关的知识,希望对你有一定的参考价值。
我正在尝试解析亚马逊产品。我运行代码的一半时间运行良好,并返回信息,另一半将我的请求重定向到一个亚马逊页面,该页面似乎旨在抵御恶意请求。当我尝试返回页面的URL时,它将返回我的原始输入URL,而不是亚马逊页面之一。从我阅读过的使用标头的内容应该可以解决此问题,但是同样,它仅处理大约一半的请求,这确实很奇怪。无论如何,有没有办法确保我总是得到真实的回应?
下面是代码:
import requests
from bs4 import BeautifulSoup as soup
#constants
url = "https://www.amazon.com/Zephyrus-GeForce-i7-9750H-Windows-GX531GW-
AB76/dp/B07QN3683G/ref=sr_1_12?dchild=1&keywords=zephyrus+g15&qid=1586732721&sr=8-12"
#Amazon data class
class items:
def __init__(self, url):
self.url = url
#parses page and returns info
def data(self):
headers = {"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (Khtml, like Gecko) Chrome/80.0.3987.163 Safari/537.36"}
#get html response
try:
html = requests.get(self.url, headers=headers).content
except Exception:
print("Could not retrieve page")
else:
#parse the page
pagesoup = soup(html, "html5lib")
#get price, name
try:
price = pagesoup.find("span", id="priceblock_ourprice").get_text().strip()
except Exception:
print("Price could not be extracted")
price = None
try:
name = pagesoup.find("span", id="productTitle").get_text().strip()
except Exception:
print("Product name could not be extracted")
name = None
return price, name
#test
item_1 = items(url)
print(item_1.data())
根据我的爬网经验,通常最好假设您不能保证与不受控制的一方(在本例中为Amazon服务器)的行为有关。
我反而建议---似乎已经是您要去的方向-设计代码,以便在发生所需行为时不会做出适当反应。例如,如果此特定故障案例的性质至少具有一致且可识别的形式,则可以让它等待指定的时间段然后重试(如果它工作了一半时间,则可能是计时问题)。抓取工具等有时会失败;只要他们期望失败,就可以了。
话虽如此,如果您想做更彻底的欺骗服务器的工作,则可以使用wireshark或tshark之类的东西来捕获常规Web浏览器发送的实际标头,以便可以匹配所有标头(相对于到用户代理)。
您可以使用selenium,这是一个能够操纵浏览器的python模块。即使不是全部,它也可以大部分时间通过这些“机器人测试”,并且可以选择使用无头浏览器。
以上是关于[当尝试解析亚马逊产品时,我的请求有时会重定向到其他页面的主要内容,如果未能解决你的问题,请参考以下文章
为啥从亚马逊弹性负载均衡器后面发送重定向时收到 502 错误网关?
当请求 url 包含“!”时,亚马逊产品广告 API 返回“SignatureDoesNotMatch”