【发布时间】:2021-09-20 21:19:47
【问题描述】:
我不确定为什么会发生这种情况,我到处查找这个问题,但由于某种原因,我觉得只有我有这个问题。
def initSess(url):
headersDt, cookiesDt = getdts('requirements/headers.txt'); Req = Request('GET', url, headers=headersDt, cookies=cookiesDt)
Sess = Session(); Preq = Sess.prepare_request(Req)
return Sess, Preq
def getsource():
url = 'https://www.google.com/search?client=firefox-b-d&q=awd'
Sess, Preq = initSess(url)
Resp = getResp(Sess, Preq)
print()
正如您所见,当我在 google 上搜索单词“awd”时,我将请求发送到 google 并获得响应 obj。
由于某种原因,Resp.text 包含加密数据(在任何其他网站上从未出现过此问题),例如:
��Z�}��AkR�F����g������������}WH�;��P�20L�9y,5��,O��� ��4dvr
如您所见,这很恶心,我尝试使用所有可能的编码类型从响应 obj 中解码字节,但没有任何效果。我也试过chardet,它无法识别使用的编码。
headers.txt 包含以下数据:
Host: www.google.com
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64;x64; rv:92.0) Gecko/20100101 Firefox/92.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate, br
Connection: keep-alive
Upgrade-Insecure-Requests: 1
Sec-Fetch-Dest: document
Sec-Fetch-Mode: navigate
Sec-Fetch-Site: none
Sec-Fetch-User: ?1
txt 的内容被正确格式化,然后被读取并用作字典。我已经检查了好几次了。如果我在这篇文章中复制粘贴 txt 有错误,那是由于我可能没有注意到的格式,但在程序中正确导入了。
我尝试在标头中使用 Cookie,因此在 Request 对象中使用,但问题是一样的 -> 我得到了未知编码的字节。
感觉是故意找bot的,因为我在使用firefox浏览器的时候在response header里发现了一个小东西:
X-Firefox-Spdy: h2
我上次检查时,python 中收到的响应对象中的所有内容都相同,除了这一行。据我所知,这是 google 用于 firefox 的一个重要协议。
我的理论是,谷歌能够以某种方式找出我是否在使用 firefox。即使我使用了正确的标头、用户代理等等。此外,从我读到的内容来看,谷歌删除了大部分请求标头(服务器正在接收),因此他们方面正在进行大量的数据操作,通过这些操作他们能够准确地确定我的“浏览器”。
我觉得有趣的是,没有人抱怨这个问题。对面。人们成功地抓取了谷歌链接。这让我怀疑我的理论,我可能在某个地方搞砸了。
我不确定这是否相关,但我想提一下我也在使用 VPN。
有什么想法吗?
【问题讨论】:
标签: web-scraping firefox python-requests vpn python-3.8