返回介绍

11.6 项目:I’m Feeling Lucky Google 查找

发布于 2024-01-22 21:44:06 字数 3851 浏览 0 评论 0 收藏 0

每次我在 Google 上搜索一个主题时,都不会一次只看一个搜索结果。通过鼠标中键点击搜索结果链接,或在点击时按住CTRL键,我会在一些新的选项卡中打开前几个链接,稍后再来查看。我经常搜索Google,所以这个工作流程(开浏览器,查找一个主题,依次用中键点击几个链接)变得很乏味。如果我只要在命令行中输入查找主题,就能让计算机自动打开浏览器,并在新的选项卡中显示前面几项查询结果,那就太好了。让我们写一个脚本来完成这件事。

下面是程序要做的事:

· 从命令行参数中获取查询关键字。

· 取得查询结果页面。

· 为每个结果打开一个浏览器选项卡。

这意味着代码需要完成以下工作:

· 从sys.argv中读取命令行参数。

· 用requests模块取得查询结果页面。

· 找到每个查询结果的链接。

· 调用webbrowser.open()函数打开Web浏览器。

打开一个新的文件编辑器窗口,并保存为lucky.py。

第1步:获取命令行参数,并请求查找页面

开始编码之前,你首先要知道查找结果页面的URL。在进行Google查找后,你看浏览器地址栏,就会发现结果页面的URL类似于https://www.google.com/ search?q=SEARCH_TERM_HERE。requests模块可以下载这个页面,然后可以用Beautiful Soup,找到HTML中的查询结果的链接。最后,用webbrowser模块,在浏览器选项卡中打开这些链接。

让你的代码看起来像这样:

#! python3
# lucky.py - Opens several Google search results.

import requests, sys, webbrowser, bs4

print('Googling...')     # display text while downloading the Google page
res = requests.get('http://google.com/search?q=' + ' '.join(sys.argv[1:]))
res.raise_for_status()

# TODO: Retrieve top search result links.

# TODO: Open a browser tab for each result.

用户运行该程序时,将通过命令行参数指定查找的主题。这些参数将作为字符串,保存在sys.argv列表中。

第2步:找到所有的结果

现在你需要使用Beautiful Soup,从下载的HTML中,提取排名靠前的查找结果链接。但如何知道完成这项工作需要怎样的选择器?例如,你不能只查找所有的< a>标签,因为在这个HTML中,有许多链接你是不关心的。因此,必须用浏览器的开发者工具来检查这个查找结果页面,尝试寻找一个选择器,它将挑选出你想要的链接。

在针对Beautiful Soup进行Google查询后,你可以打开浏览器的开发者工具,查看该页面上的一些链接元素。它们看起来复杂得难以置信,大概像这样:< a href="/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1& cad=rja&uact=8&ved=0CCgQFjAA&url=http%3A%2F%2Fwww.crummy.com%2Fsoftware %2FBeautifulSoup%2F& amp;ei=LHBVU_XDD9KVyAShmYDwCw&usg=AFQjCNHAxwplurFOBqg5cehWQEVKi-TuLQ&sig2=sdZu6WVlBlVSDrwhtworMA" onmousedown="return rwt(this,'','','','1','AFQjCNH AxwplurFOBqg5cehWQEVKi- TuLQ','sdZu6WVlBlVSDrwhtworMA','0CCgQFjAA','','',event)" data-href="http://www. crummy.com/software/BeautifulSoup/">< em> BeautifulSoup< /em>: We called him Tortoise because he taught us.< /a>

该元素看起来复杂得难以置信,但这没有关系。只需要找到查询结果链接都具有的模式。但这个< a>元素没有什么特殊,难以和该页面上非查询结果的< a>元素区分开来。

确保你的代码看起来像这样:

#! python3
# lucky.py - Opens several google search results.

import requests, sys, webbrowser, bs4

--snip--

# Retrieve top search result links.
soup = bs4.BeautifulSoup(res.text)

# Open a browser tab for each result.
linkElems = soup.select('.r a')

但是,如果从< a>元素向上看一点,就会发现这样一个元素:< h3 class="r">。查看余下的HTML源代码,看起来r类仅用于查询结果链接。你不需要知道CSS类r是什么,或者它会做什么。只需要利用它作为一个标记,查找需要的< a>元素。可以通过下载页面的HTML文本,创建一个BeautifulSoup对象,然后用选择符'.r a',找到所有具有CSS类r的元素中的< a>元素。

第3步:针对每个结果打开Web浏览器

最后,我们将告诉程序,针对结果打开Web浏览器选项卡。将下面的内容添加到程序的末尾:

#! python3
# lucky.py - Opens several google search results.

import requests, sys, webbrowser, bs4

--snip--

# Open a browser tab for each result.
linkElems = soup.select('.r a')
numOpen = min(5, len(linkElems))
for i in range(numOpen):
    webbrowser.open('http://google.com' + linkElems[i].get('href'))

默认情况下,你会使用webbrowser模块,在新的选项卡中打开前5个查询结果。但是,用户查询的主题可能少于5个查询结果。soup.select()调用返回一个列表,包含匹配'.r a'选择器的所有元素,所以打开选项卡的数目要么是5,要么是这个列表的长度(取决于哪一个更小)。

内建的Python函数min()返回传入的整型或浮点型参数中最小的一个(也有内建的max()函数,返回传入的参数中最大的一个)。你可以使用min()弄清楚该列表中是否少于5个链接,并且将要打开的链接数保存在变量numOpen中。然后可以调用range(numOpen),执行一个for循环。

在该循环的每次迭代中,你使用webbrowser.open(),在Web浏览器中打开一个新的选项卡。请注意,返回的< a>元素的href属性中,不包含初始的http://google.com部分,所以必须连接它和href属性的字符串。

现在可以马上打开前5个Google查找结果,比如说,要查找Python programming tutorials,你只要在命令行中运行lucky python programming tutorials(如何在你的操作系统中方便地运行程序,请参看附录B)。

第4步:类似程序的想法

分选项卡浏览的好处在于,很容易在新选项卡中打开一些链接,稍后再来查看。一个自动打开几个链接的程序,很适合快捷地完成下列任务:

· 查找亚马逊这样的电商网站后,打开所有的产品页面;

· 打开针对一个产品的所有评论的链接;

· 查找Flickr或Imgur这样的照片网站后,打开查找结果中的所有照片的链接。

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

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

发布评论

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