本文主要是介绍Python编程让繁琐的工作自动化(6)-从web抓取信息,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
webbrowser:python自带的模块,打开浏览器获取指定页面
requests:从因特网上下载文件和网页
BeautifulSoup:解析HTML,即网页编写的格式
selenium:启动并控制一个Web浏览器,能够填写表单,并模拟鼠标在这个浏览器汇中点击
项目:利用 webbrowser 模块的 mapIt.py
webbrowser 模块的 open()函数可以启动一个新浏览器,打开指定的 URL。在交
互式环境中输入以下代码:
>>> import webbrowser
>>> webbrowser.open('http://inventwithpython.com/')
Web 浏览器的选项卡将打开 URL http://inventwithpython.com/。这大概就是
webbrowser 模块能做的唯一的事情。既使如此,open()函数确实让一些有趣的事情成为可
能。例如,将一条街道的地址拷贝到剪贴板,并在 Google 地图上打开它的地图,这是很
繁琐的事。你可以让这个任务减少几步,写一个简单的脚本,利用剪贴板中的内容在浏
览器中自动加载地图。这样,你只要将地址拷贝到剪贴板,运行该脚本,地图就会加载。
你的程序需要做到:
• 从命令行参数或剪贴板中取得街道地址。
• 打开 Web 浏览器,指向该地址的 Google 地图页面。
这意味着代码需要做下列事情:
• 从 sys.argv 读取命令行参数。
• 读取剪贴板内容。
• 调用 webbrowser.open()函数打开外部浏览器。
打开一个新的文件编辑器窗口,将它保存为 mapIt.py。
#你的目的是创建mapIt.py,然后使用命令行运行它时,如
C:\> mapit 870 Valencia St, San Francisco, CA 94110
#该脚本将使用命令行参数,而不是剪贴板,如果没有命令行参数,程序就知道使用剪贴板的内容# 第1步:在mapIt.py中处理命令行参数
#! python3
# mapIt.py - Launches a map in the browser using an address from the
# command line or clipboard. import webbrowser, sys, pyperclip
if len(sys.argv) > 1: # Get address from command line. address = ' '.join(sys.argv[1:]) # 第2步:处理剪贴板,加载浏览器else: # Get address from clipboard. address = pyperclip.paste() webbrowser.open('https://www.google.com/maps/place/' + address)
类似程序的想法
只要你有一个 URL,webbrowser 模块就让用户不必打开浏览器,而直接加载一
个网站。其他程序可以利用这项功能完成以下任务:
• 在独立的浏览器标签中,打开一个页面中的所有链接。
• 用浏览器打开本地天气的 URL。
• 打开你经常查看的几个社交网站。
利用requests模块从Web下载文件
requests 模块让你很容易从 Web 下载文件,不必担心一些复杂的问题,诸如网
络错误、连接问题和数据压缩。编写 requests 模块是因为 Python 的 urllib2 模块用起来太复杂。
常用函数:
# 下载一个网页
import requests
# 返回一个response对象
>>> res = requests.get('http://www.gutenberg.org/cache/epub/1112/pg1112.txt')
>>> type(res)
<class 'requests.models.Response'>
# 检查状态码判断是否成功,ok的状态码是200,404代表没找到
>>> res.status_code == requests.codes.ok
True
>>> len(res.text)
178981
>>> print(res.text[:250])
The Project Gutenberg EBook of Romeo and Juliet, by William Shakespeare This eBook is for the use of anyone anywhere at no cost and with
almost no restrictions whatsoever. You may copy it, give it away or
re-use it under the terms of the Proje # 检查错误
# 检查成功有一种简单的方法,就是在 Response对象上调用 raise_for_status()方法。如果下载文件出错,这将抛出异常。如果下载成功,就什么也不做
>>> res = requests.get('http://inventwithpython.com/page_that_does_not_exist')
>>> res.raise_for_status()
Traceback (most recent call last): File "<pyshell#138>", line 1, in <module> res.raise_for_status() File "C:\Python34\lib\site-packages\requests\models.py", line 773, in raise_for_status raise HTTPError(http_error_msg, response=self)
requests.exceptions.HTTPError: 404 Client Error: Not Found
# 利用try和except语句将raise_for_status代码行包裹起来,处理这一错误,不让程序崩溃
import requests
res = requests.get('http://inventwithpython.com/page_that_does_not_exist')
try: res.raise_for_status()
except Exception as exc: print('There was a problem: %s' % (exc))
# 将下载的文件保存到硬盘
# 使用标准的open和write函数将web页面保存到硬盘的一个文件,但是必须用写二进制模式打开文件,即使页面是纯文本的,目的是保存该文本的unicode编码。
# 使用for循环和response对象iter_content方法
>>> import requests
>>> res = requests.get('http://www.gutenberg.org/cache/epub/1112/pg1112.txt')
>>> res.raise_for_status()
>>> playFile = open('RomeoAndJuliet.txt', 'wb')
# iter_content()方法在循环的每次迭代中,返回一段内容。每一段都是 bytes 数据类型,你需要指定一段包含多少字节。
# 10 万字节通常是不错的选择,所以将 100000作为参数传递给 iter_content()。
>>> for chunk in res.iter_content(100000): playFile.write(chunk) # write()方法返回一个数字,表示写入文件的字节数。在前面的例子中,第一段包含 100000 个字节,文件剩下的部分只需要 78981 个字节。 100000
78981
>>> playFile.close()
HTML
因为基本上用不到解析网页的东西,所以暂时不记录这一部分内容,有需要可以网上找爬虫教程!
这篇关于Python编程让繁琐的工作自动化(6)-从web抓取信息的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!