python抓取google查找成果

前一段时间一直在研讨如何用python抓取查找引擎成果,在完成的过程中遇到了许多的问题,我把我遇到的问题都记录下来,期望今后遇到相同问题的童鞋不要再走弯路。

1. 查找引擎的选取

  挑选一个好的查找引擎意味着你可以得到更精确的查找成果。我用过的查找引擎有四种:Google、Bing、Baidu、Yahoo!。 作为程序员,我首选Google。但当我看见我独爱的Google回来给我的满是一堆的js代码,底子没我想要的查找成果。所以我转而投向了Bing的阵营,在用过一段时间后我发现Bing回来的查找成果关于我的问题来说不太抱负。合理我要失望时,Google拯救了我。本来Google为了照料那些制止浏览器运用js的用户,还有别的一种查找办法,请看下面的查找URL:

https://www.google.com.hk/search?hl=en&q=hello

  hl指定要查找的言语,q便是你要查找的关键字。 好了,感谢Google,查找成果页面包括我要抓取的内容。

  PS: 网上许多运用python抓取Google查找成果仍是运用 https://ajax.googleapis.com/ajax/services/search/web... 的办法。需求留意的是这个办法Google现已不再引荐运用了,见 https://developers.google.com/web-search/docs/ 。Google现在供给了Custom Search API, 不过API约束每天100次恳求,假如需求更多则只能花钱买。

2. Python抓取并剖析网页

  运用Python抓取网页很便利,不多说,见代码:

def search(self, queryStr):
     queryStr = urllib2.quote(queryStr)
     url = 'https://www.google.com.hk/search?hl=en&q=%s' % queryStr
     request = urllib2.Request(url)
     response = urllib2.urlopen(request)
     html = response.read()
     results = self.extractSearchResults(html)


  第6行的 html 便是咱们抓取的查找成果页面源码。运用过Python的同学会发现,Python一起供给了urllib 和 urllib2两个模块,都是和URL恳求相关的模块,不过供给了不同的功用,urllib只可以接纳URL,而urllib2可以承受一个Request类的实例来设置URL恳求的headers,这意味着你可以假装你的user agent 等(下面会用到)。

  现在咱们现已可以用Python抓取网页并保存下来,接下来咱们就可以从源码页面中抽取咱们想要的查找成果。Python供给了htmlparser模块,不过用起来相比照较费事,这儿引荐一个很好用的网页剖析包BeautifulSoup,关于BeautifulSoup的用法官网有具体的介绍,这儿我不再多说。

  运用上面的代码,关于少数的查询还比较OK,但假如要进行上千上万次的查询,上面的办法就不再有用了, Google会检测你恳求的来历,假如咱们运用机器频频爬取Google的查找成果,不多久就Google会block你的IP,并给你回来503 Error页面。这不是咱们想要的成果,所以咱们还要继续探究

  前面说到运用urllib2咱们可以设置URL恳求的headers,  假装咱们的user agent。简略的说,user agent便是客户端浏览器等应用程序运用的一种特别的网络协议, 在每次浏览器(邮件客户端/查找引擎蜘蛛)进行 HTTP 恳求时发送到服务器,服务器就知道了用户是运用什么浏览器(邮件客户端/查找引擎蜘蛛)来拜访的。 有时候为了到达一些意图,咱们不得不去好心的诈骗服务器告知它我不是在用机器拜访你。

  所以,咱们的代码就成了下面这个姿态:

user_agents = ['Mozilla/5.0 (Windows NT 6.1; WOW64; rv:23.0) Gecko/20130406 Firefox/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, like Gecko) Element Browser 5.0', \
         'IBM WebExplorer /v0.94', 'Galaxy/1.0 [en] (Mac OS X 10.5.6; U; en)', \
         'Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0)', \
         'Opera/9.80 (Windows NT 6.0) Presto/2.12.388 Version/12.14', \
         'Mozilla/5.0 (iPad; CPU OS 6_0 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) \
         Version/6.0 Mobile/10A5355d Safari/8536.25', \
         'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) \
         Chrome/28.0.1468.0 Safari/537.36', \
         'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.0; Trident/5.0; TheWorld)']
 def search(self, queryStr):
     queryStr = urllib2.quote(queryStr)
     url = 'https://www.google.com.hk/search?hl=en&q=%s' % queryStr
     request = urllib2.Request(url)
     index = random.randint(0, 9)
     user_agent = user_agents[index]
     request.add_header('User-agent', user_agent)
     response = urllib2.urlopen(request)
     html = response.read()
     results = self.extractSearchResults(html)


  不要被user_agents那个list吓到,那其实便是10个user agent 字符串,这么做是让咱们假装的更好一些,假如你需求更多的user agent 请看这儿 UserAgentString。

17-19行表明随机挑选一个user agent 字符串,然后用request 的add_header办法假装一个user agent。

  经过假装user agent可以让咱们继续抓取查找引擎成果,假如这样还不可,那我主张在每两次查询间随机休眠一段时间,这样会影响抓取速度,可是可以让你更继续的抓取成果,假如你有多个IP,那抓取的速度也就上来了。

  github上有本文一切源代码,需求的同学可从下面的网址下载:

https://github.com/meibenjin/GoogleSearchCrawler


上一篇:运用python办理Cisco设备
下一篇:Python 主动备份SVN版别库并复制到长途主机脚本

PythonTab微信大众号:

Python技能交流合作群 ( 请勿加多个群 ):

群1: 87464755

群2: 333646237

群3: 318130924

群4: 385100854