9.1 Google 搜索引擎
根据第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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论