如何将 Python 抓取的 Bing 网页内容转换为人类可读的内容?

How do I convert Python crawled Bing web page content to human-readable?

我正在尝试使用 python 抓取 Bing 网络搜索页面。 我发现收到的原始内容看起来像字节类型,但尝试解压缩它失败了。 有人知道这是什么类型的数据吗?我应该如何从这些原始内容中提取可读性?谢谢!

我的代码显示了原始内容,然后尝试执行 gunzip,因此您可以看到原始内容以及解压错误。 由于原始内容太长,我只在下面粘贴前几行。

代码:

import urllib.request as Request
import gzip

req = Request.Request('www.bing.com')
req.add_header('upgrade-insecure-requests', 1)
res = Request.urlopen(req).read()
print("RAW Content: %s" %ResPage) # show raw content of web
print("Try decompression:")
print(gzip.decompress(ResPage))   # try decompression

结果:

RAW Content: b'+p\xe70\x0bi{)\xee!\xea\x88\x9c\xd4z\x00Tgb\x8c\x1b\xfa\xe3\xd7\x9f\x7f\x7f\x1d8\xb8\xfeaZ\xb6\xe3z\xbe\'\x7fj\xfd\xff+\x1f\xff\x1a\xbc\xc5N\x00\xab\x00\xa6l\xb2\xc5N\xb2\xdek\xb9V5\x02\t\xd0D \x1d\x92m%\x0c#\xb9>\xfbN\xd7\xa7\x9d\xa5\xa8\x926\xf0\xcc\'\x13\x97\x01/-\x03... ...

Try decompression:
Traceback (most recent call last):
OSError: Not a gzipped file (b'+p')


Process finished with exit code 1

使用请求库更容易上手。另外,这也是现在最常用的http请求库

在您的 python 环境中安装请求:

pip install requests

在您的 .py 文件中:

import requests

r = requests.get("http://www.bing.com")

print(r.text)
OSError: Not a gzipped file (b'+p')

您需要添加 "accept-encoding: "gzip" or "br" 来请求 headers 或从响应中读取内容编码并选择正确的,或者使用 requests 库来代替你.

第二个可能出现的问题,需要通过一个user-agent请求headers作为“真实”用户访问。

如果在使用 requests 库时没有将 user-agent 传递到请求 headers 中,则默认为 python-requests so Bing or other search engine understands that it's a bot/script, and blocks a request. Check what's your user-agent

使用 requests 库传递 user-agent

headers = {
    'User-agent':
    'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36 Edge/18.19582'
}

requests.get('URL', headers=headers)

How to reduce the chance of being blocked while web scraping search engines.


或者,您可以使用 SerpApi 中的 Bing Organic Results API 来实现相同的目的。这是付费 API 和免费计划。

不同之处在于,您不必花时间尝试绕过 Bing 或其他搜索引擎的阻止,也不必解决不同的繁琐问题,例如选择正确的 CSS 选择器,如果HTML 布局不是最好的。

相反,关注需要从结构化中提取的数据 JSON。查看 playground.

Disclaimer, I work for SerpApi.