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

每次我在 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&amp;rct=j&amp;q=&amp;esrc=s&amp;source=web&amp;cd=1&amp;


cad=rja&amp;uact=8&amp;ved=0CCgQFjAA&amp;url=http%3A%2F%2Fwww.crumm 
y.com%2Fsoftware%2FBeautifulSoup%2F&amp;ei=LHBVU_XDD9KVyAShmYDwCw 
&amp;usg=AFQjCNHAxwplurFOBqg5cehWQEVKi-TuLQ&amp;sig2=sdZu6WVlBlV SDrwhtworMA" οnmοusedοwn="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 这样的照片网站后,打开查找结果中的所有照片的链接。
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大飞哥软件自习室

希望支持

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值