返回介绍

9.1 Google 搜索引擎

发布于 2024-02-05 23:37:18 字数 3883 浏览 0 评论 0 收藏 0

根据第4章中Alexa的数据,google.com是全世界最流行的网站之一,而且非常方便的是,该网站结构简单,易于抓取。

图9.1所示为Google搜索主页使用Firebug加载查看表单元素时的 界面。

Google国际化版本
Google可能会根据你的地理位置跳转到指定国家的版本。要想无论处于世界任何地方,都能使用一致的Google搜索,那么可以使用Google的国际化英文版本,其网址为`http://www.google.com/ncr`。其中,ncr表示没有国家跳转(no country redirect )。

图9.1

可以看到,搜索查询存储在输入参数q 当中,然后表单提交到action 属性设定的/search 路径。我们可以通过将test作为搜索条件提交给表单对其进行测试,此时会跳转到类似https://www.google.com/search ?q=test&oq=test&es_sm=93&ie=UTF-8 的URL中。确切的URL取决于你的浏览器和地理位置。此外,还需要注意的是,如果开启了Google实时,那么搜索结果会使用AJAX执行动态加载,而不再需要提交表单。虽然URL中包含了很多参数,但是只有用于查询的参数q 是必需的。当URL为https://www.google.com/search?q=test 时,也能产生相同的结果,如图9.2所示。

图9.2

搜索结果的结构可以使用Firebug来检查,如图9.3所示。

图9.3

从图9.3中可以看出,搜索结果是以链接的形式出现的,并且其父元素是class为 "r " 的<h3> 标签。想要抓取搜索结果,我们可以使用第2章中介绍的CSS选择器。

>>> import lxml.html
>>> from downloader import Downloader
>>> D = Downloader()
>>> html = D('https://www.google.com/search?q=test')
>>> tree = lxml.html.fromstring(html)
>>> results = tree.cssselect('h3.r a')
>>> results
[<Element a at 0x7f3d9affeaf8>,
  <Element a at 0x7f3d9affe890>,
  <Element a at 0x7f3d9affe8e8>,
  <Element a at 0x7f3d9affeaa0>,
  <Element a at 0x7f3d9b1a9e68>,
  <Element a at 0x7f3d9b1a9c58>,
  <Element a at 0x7f3d9b1a9ec0>,
  <Element a at 0x7f3d9b1a9f18>,
  <Element a at 0x7f3d9b1a9f70>,
  <Element a at 0x7f3d9b1a9fc8>]

到目前为止,我们已经下载得到了Google的搜索结果,并且使用lxml 抽取出其中的链接。在图9.3中,我们发现链接中的真实网站URL之后还包含了一串附加参数,这些参数将用于跟踪点击。下面是第一个链接。

>>> link = results[0].get('href')
>>> link
'/url?q=http://www.speedtest.net/
    &sa=U&ei=nmgqVbgCw&ved=0CB&usg=ACA_cA'

这里我们需要的内容是http://www.speedtest.net/ ,可以使用urlparse 模块从查询字符串中将其解析出来。

>>> import urlparse
>>> qs = urlparse.urlparse(link).query
>>> urlparse.parse_qs(qs)
{'q': ['http://www.speedtest.net/'],
  'ei': ['nmgqVbgCw'],
  'sa': ['U'],
  'usg': ['ACA_cA'],
  'ved': ['0CB']}
>>> urlparse.parse_qs(qs).get('q', [])
['http://www.speedtest.net/']

该查询字符串解析方法可以用于抽取所有链接。

>>> links = []
>>> for result in results:
...    link = result.get('href')
...    qs = urlparse.urlparse(link).query
...    links.extend(urlparse.parse_qs(qs).get('q', []))
...
>>> links
 ['http://www.speedtest.net/',
  'https://www.test.com/',
  'http://www.tested.com/',
  'http://www.speakeasy.net/speedtest/',
  'http://www.humanmetrics.com/cgi-win/jtypes2.asp',
  'http://en.wikipedia.org/wiki/Test_cricket',
  'https://html5test.com/',
  'http://www.16personalities.com/free-personality-test',
  'https://www.google.com/webmasters/tools/mobile-friendly/',
  'http://speedtest.comcast.net/']

成功了!从Google搜索中得到的链接已经被成功抓取出来了。该示例的完整源码可以从https://bitbucket.org/wswp/code/src/tip/ chapter09/google.py 获取。

抓取Google搜索结果时会碰到的一个难点是,如果你的IP出现可疑行为,比如下载速度过快,则会出现验证码图像,如图9.4所示。

图9.4

我们可以使用第7章中介绍的技术来解决验证码图像这一问题,不过更好的方法是降低下载速度,或者在必须高速下载时使用代理,以避免被Google怀疑。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文