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

因为基本上用不到解析网页的东西,所以暂时不记录这一部分内容,有需要可以网上找爬虫教程!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值