+
+
Posts List
  1. 程序描述
  2. 涉及知识点
  3. 几个要点
    1. BeautifulSoup4 Warning
    2. 伪造请求头
  4. 代码

Python编程快速上手(五)百度搜索+

程序描述

输入关键字,打开百度搜索前五个搜索结果,当无关键字输入时,搜索剪贴板中内容

涉及知识点

  • HTTP headers
  • requests
  • webbrowser
  • bs4

几个要点

这个小程序对应书上p202页码的 「11.6 项目:”I’m Feeling Lucky” Google 查找」 ,不过我将其中的🔍搜索引擎从谷歌换成了百度。

BeautifulSoup4 Warning

书中给的代码soup = bs4.BeautifulSoup(res.text)会引发下面👇的警告。

UserWarning: No parser was explicitly specified, so I’m using the best available HTML parser for this system (“html5lib”). This usually isn’t a problem, but if you run this code on another system, or in a different virtual environment, it may use a different parser and behave differently.

To get rid of this warning, change this:

BeautifulSoup([your markup])

to this:

BeautifulSoup([your markup], “html.parser”)

markup_type=markup_type))

根据提示,修改此行代码为:
soup = bs4.BeautifulSoup(res.text,"html.parser")

伪造请求头

本部分参考了Python利用requests和re模块爬取百度图片

直接照搬源代码之后发现无论如何修改Select,linkElems中都没有元素。在网上查了一下,才发现是百度屏蔽了Python的请求,所以需要伪造一个请求头才能得到正确的响应。

以Firefox为例,F12打开Toggle Tools,切换到Network选项卡,点击XHR子选项,刷新页面后得到请求项,单击就能看到请求头。

代码

#! python3

import webbrowser, requests, sys, bs4, pyperclip

if len(sys.argv) < 2:
url = 'http://www.baidu.com/s?ie=utf-8&wd='+' '.join(pyperclip.paste())
else:
url = 'http://www.baidu.com/s?ie=utf-8&wd='+' '.join(sys.argv[1:])

headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:61.0) Gecko/20100101 Firefox/61.0', 'Referer':'http://image.baidu.com/search/index?tn=baiduimage&ps=1&ct=201326592&lm=-1&cl=2&nc=1&ie=utf-8&word=%E8%9C%A1%E7%AC%94%E5%B0%8F%E6%96%B0',}

res = requests.get((url),headers = headers)
res.raise_for_status()

soup = bs4.BeautifulSoup(res.text,"html.parser")
linkElems = soup.select('h3 a')
numOpen = min(5, len(linkElems))

for i in range(numOpen):
webbrowser.open(linkElems[i].get('href'))

本文作者: rhinoc

本文链接: http://rhinoc.top/post/python_5.html

版权声明: 本博客所有文章除特别声明外,均采用BY-NC-SA 4.0国际许可协议,转载请注明。

Support
Support Me
  • Through WeChat
  • Through Alipay