【问题标题】:python scraping google, getting requests.Response obj with unknown encoding, can't read anything everything is encryptedpython抓取谷歌,获取requests.Response obj未知编码,无法读取任何内容所有内容都已加密
【发布时间】: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


    【解决方案1】:

    我的理论是,谷歌能够以某种方式找出我是否在使用 firefox。

    那是因为你的 url 表明你使用的是 firefox 浏览器url = 'https://www.google.com/search?client=firefox-b-d&q=awd'

    您可以尝试将网址更改为https://www.google.com/search?q=awd 吗? client=firefox-b-d 用于 Mozilla 从 Google 获得报酬,可能是导致问题的原因。

    【讨论】:

    • 我已经尝试了没有client=firefox参数的请求,问题是一样的。这只是我尝试添加的新内容。
    • '那是因为你的 url 表明你使用的是 firefox 浏览器' - 这不是重点吗?让谷歌相信我在使用 Firefox?
    【解决方案2】:

    要让 Google 相信您使用的是 Firefox,您需要添加 Firefox user-agent 来请求 headers如果您不想这样做,则不需要 Session() 对象):

    headers = {
        "User-Agent":
        "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:54.0) Gecko/20100101 Firefox/54.0"
    }
    
    requests.get("URL", headers=headers)
    

    查看list of user-agents,并检查what's your user-agent


    或者,您可以使用来自 SerpApi 的 Google Organic Results API 来忘记考虑它。这是一个带有免费计划的付费 API。

    不同之处在于,您不必考虑如何绕过 Google 或其他搜索引擎的阻止、如何解析 HTML 或 JavaScript 中的某些元素,或者为什么某些事情无法正常工作。

    要集成的示例代码:

    from serpapi import GoogleSearch
    
    params = { 
      "q": "Dovahkiin",          # query
      "hl": "en",                # language
      "gl": "us",                # country to search from
      "api_key": "YOUR_API_KEY"
    }
    
    search = GoogleSearch(params)
    results = search.get_dict()
    
    for result in results["organic_results"]:
       title = result["title"]
       link = result["link"]
       
       print(title, link, sep="\n")
    

    免责声明,我为 SerpApi 工作。

    【讨论】:

      猜你喜欢
      • 2016-06-16
      • 1970-01-01
      • 1970-01-01
      • 2019-10-09
      • 1970-01-01
      • 2021-10-26
      • 1970-01-01
      • 2015-09-01
      • 2011-09-10
      相关资源
      最近更新 更多