搜索引擎如何抓取网页(Python抓取的搜索结果页面源码(url)(组图))
优采云 发布时间: 2022-04-18 20:25搜索引擎如何抓取网页(Python抓取的搜索结果页面源码(url)(组图))
我前段时间一直在研究如何使用python爬取搜索引擎结果。我在执行的过程中遇到了很多问题。我记录了我遇到的所有问题。希望遇到同样问题的童鞋们不要走弯路。
1. 搜索引擎选择
选择一个好的搜索引擎意味着您可以获得更准确的搜索结果。我用过四个搜索引擎:谷歌、必应、百度、雅虎!作为程序员,我的第一选择是谷歌。但是当我看到我最喜欢的 Google 给我返回了一堆 js 代码时,根本没有我想要的搜索结果。于是切换到Bing阵营,用了一段时间后发现Bing返回的搜索结果对我的问题不太理想。就在我快要绝望的时候,谷歌来救我了。原来谷歌为了照顾那些禁止浏览器使用js的用户还有另一种搜索方式,请看如下搜索网址:
hl 指定要搜索的语言,q 是要搜索的关键字。好吧,多亏了 Google,搜索结果页面收录了我想要抓取的内容。
PS:使用python爬取网上Google搜索结果的方法有很多。请注意,Google 不再推荐此方法,请参阅 。 Google 现在提供了自定义搜索 API,但是该 API 限制为每天 100 个请求,如果需要更多,只能购买。
2.Python 抓取和分析网页,
使用Python urllib2爬取网页非常方便,不多说,看代码:defsearch(self, queryStr):
queryStr =urllib2.quote(queryStr)
url='%s'%queryStr
请求=urllib2.请求(url)
响应=urllib2.urlopen(请求)
html=response.read()
results=self.extractSearchResults(html)
第6行的html是我们爬取的搜索结果页面的源码。用过Python的同学会发现Python同时提供了urllib和urllib2两个模块,这两个模块都与URL请求相关,只是提供的功能不同。 urllib 只能接收 URL,而 urllib2 可以接受 Request 类的实例来设置 URL 请求的标头,这意味着您可以伪装您的用户代理等(在下面使用)。
现在我们可以使用 Python 抓取网页并保存它,我们可以从源页面中提取我们想要的搜索结果。 Python提供了htmlparser模块,但是使用起来比较麻烦。在这里,我们推荐一个非常有用的网页分析包 BeautifulSoup。评委网站上对 BeautifulSoup 的使用有详细的介绍。这里就不多说了。
使用上面的代码,少量查询是可以的,但是如果你想查询几千次,上面的方法就不再有效了,谷歌会检测你请求的来源,如果我们使用机器的话经常抓取谷歌的搜索结果,很快谷歌就会屏蔽你的IP,并返回一个503错误页面。这不是我们想要的结果,所以我们会继续探索
如前所述,使用 urllib2 我们可以设置 URL 请求的标头来伪装我们的用户代理。简而言之,用户代理是客户端浏览器等应用程序使用的一种特殊网络协议。每次浏览器(邮件客户端/搜索引擎蜘蛛)发出 HTTP 请求时,都会发送到服务器,服务器就知道用户了。使用什么浏览器(邮件客户端/搜索引擎蜘蛛)访问。有时候为了达到一些目的,我们不得不去善意地欺骗服务器告诉它我没有使用机器访问你。
所以,我们的代码如下所示: user_agents =['Mozilla/5.0 (Windows NT 6.1; WOW64; rv:23.0) Gecko/ 20130406 火狐/23.0', \
'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:18.0) Gecko/20100101 Firefox/18.0' , \
'Mozilla/5.0(Windows; U; Windows NT 6.1; en-US) AppleWebKit/533+\
(KHTML,如 Gecko)元素浏览器 5.0', \
'IBM WebExplorer /v0.94', 'Galaxy/1.0 [en] (Mac OS X 10.5.6; U; en)' , \
'Mozilla/5.0(兼容;MSIE 10.0;Windows NT 6.1;WOW64;三叉戟/6.0)',\
'Opera/9.80 (Windows NT 6.0) Presto/2.12.388 版本/12.14', \
'Mozilla/5.0(iPad; CPU OS 6_0like Mac OS X) AppleWebKit/536.26(KHTML, like Gecko) \
版本/6.0Mobile/10A5355dSafari/8536.25', \
'Mozilla/5.0(Windows NT 6.1) AppleWebKit/537.36(KHTML,像壁虎) \
Chrome/28.0.1468.0Safari/537.36', \
'Mozilla/5.0(兼容;MSIE 9.0;Windows NT 6.0;Trident/5.0;TheWorld)']
defsearch(self, queryStr):
queryStr =urllib2.quote(queryStr)
url='%s'%queryStr
请求=urllib2.请求(url)
index =random.randint(0, 9)
user_agent=user_agents[索引]
request.add_header('User-agent', user_agent)
响应=urllib2.urlopen(请求)
html=response.read()
results=self.extractSearchResults(html)
不要被 user_agents 列表吓到,它实际上是 10 个用户代理字符串。这是为了让我们假装更好。如果您需要更多用户代理,请在此处查看 UserAgentString。
第17-19行表示随机选择一个用户代理字符串,然后通过请求的add_header方法伪装一个用户代理。
通过伪装用户代理,我们可以继续爬取搜索引擎结果。如果这不起作用,那么我建议在每次查询之间随机休眠一段时间。这会影响爬取速度,但是会让你继续爬取爬取结果,如果你有多个IP,爬取速度也会增加。