实例讲解Python爬取网页数据


Posted in Python onJuly 08, 2018

一、利用webbrowser.open()打开一个网站:

>>> import webbrowser 
>>> webbrowser.open('http://i.firefoxchina.cn/?from=worldindex') 
True

实例:使用脚本打开一个网页。

所有Python程序的第一行都应以#!python开头,它告诉计算机想让Python来执行这个程序。(我没带这行试了试,也可以,可能这是一种规范吧)

1.从sys.argv读取命令行参数:打开一个新的文件编辑器窗口,输入下面的代码,将其保存为map.py。

2.读取剪贴板内容:

3.调用webbrowser.open()函数打开外部浏览:

#! python3 
import webbrowser, sys, pyperclip 
if len(sys.argv) > 1: 
 mapAddress = ''.join(sys.argv[1:]) 
else: 
 mapAddress = pyperclip.paste() 
webbrowser.open('http://map.baidu.com/?newmap=1&ie=utf-8&s=s%26wd%3D' + mapAddress

注:不清楚sys.argv用法的,请参考这里;不清楚.join()用法的,请参考这里。sys.argv是字符串的列表,所以将它传递给join()方法返回一个字符串。

好了,现在选中'天安门广场'这几个字并复制,然后到桌面双击你的程序。当然你也可以在命令行找到你的程序,然后输入地点。

二、用requests模块从Web下载文件:requests模块不是Python自带的,通过命令行运行pip install request安装。没翻墙是很难安装成功的,手动安装可以参考这里。

>>> import requests 
>>> res = requests.get('http://i.firefoxchina.cn/?from=worldindex') #向get中传入一个网址 
>>> type(res) #响应对象 
<class 'requests.models.Response'> 
>>> print(res.status_code) #响应码 
200 
>>> res.text #返回的文本

requests中查看网上下载的文件内容的方法还有很多,如果以后的博客用的到,会做说明,在此不再一一介绍。在下载文件的过程中,用raise_for_status()方法可以确保下载确实成功,然后再让程序继续做其他事情。

import requests 
res = requests.get('http://i.firefoxchina.cn/?from=worldindex') 
try: 
 res.raise_for_status() 
except Exception as exc: 
 print('There was a problem: %s' % (exc))

三、将下载的文件保存到本地:

>>> import requests 
>>> res = requests.get('http://tech.firefox.sina.com/17/0820/10/6DKQALVRW5JHGE1I.html##0-tsina-1-13074-397232819ff9a47a7b7e80a40613cfe1') 
>>> res.raise_for_status() 
>>> file = open('1.txt', 'wb') #以写二进制模式打开文件,目的是保存文本中的“Unicode编码” 
>>> for word in res.iter_content(100000): #<span class="fontstyle0"><span class="fontstyle0">iter_content()</span><span class="fontstyle1">方法在循环的每次迭代中返回一段</span><span class="fontstyle0">bytes</span><span class="fontstyle1">数据</span><span class="fontstyle1">类型的内容,你需要指定其包含的字节数</span></span> 
 file.write(word) 
 
 
16997 
>>> file.close()

四、用BeautifulSoup模块解析HTML:在命令行中用pip install beautifulsoup4安装它。
1.bs4.BeautifulSoup()函数可以解析HTML网站链接requests.get(),也可以解析本地保存的HTML文件,直接open()一个本地HTML页面。

>>> import requests, bs4 
>>> res = requests.get('http://i.firefoxchina.cn/?from=worldindex') 
>>> res.raise_for_status() 
>>> soup = bs4.BeautifulSoup(res.text) 
 
Warning (from warnings module): 
 File "C:\Users\King\AppData\Local\Programs\Python\Python36-32\lib\site-packages\beautifulsoup4-4.6.0-py3.6.egg\bs4\__init__.py", line 181 
 markup_type=markup_type)) 
UserWarning: No parser was explicitly specified, so I'm using the best available HTML parser for this system ("html.parser"). 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. 
 
The code that caused this warning is on line 1 of the file <string>. To get rid of this warning, change code that looks like this: 
 
 BeautifulSoup(YOUR_MARKUP}) 
 
to this: 
 
 BeautifulSoup(YOUR_MARKUP, "html.parser") 
 
>>> soup = bs4.BeautifulSoup(res.text, 'html.parser') 
>>> type(soup) 
<class 'bs4.BeautifulSoup'>

我这里有错误提示,所以加了第二个参数。

>>> import bs4 
>>> html = open('C:\\Users\\King\\Desktop\\1.htm') 
>>> exampleSoup = bs4.BeautifulSoup(html) 
>>> exampleSoup = bs4.BeautifulSoup(html, 'html.parser') 
>>> type(exampleSoup) 
<class 'bs4.BeautifulSoup'>

2.用select()方法寻找元素:需传入一个字符串作为CSS“选择器”来取得Web页面相应元素,例如:
soup.select('div'):所有名为<div>的元素;

soup.select('#author'):带有id属性为author的元素;

soup.select('.notice'):所有使用CSS class属性名为notice的元素;

soup.select('div span'):所有在<div>元素之内的<span>元素;

soup.select('input[name]'):所有名为<input>并有一个name属性,其值无所谓的元素;

soup.select('input[type="button"]'):所有名为<input>并有一个type属性,其值为button的元素。

想查看更多的解析器,请参看这里。

>>> import requests, bs4 
>>> res = requests.get('http://i.firefoxchina.cn/?from=worldindex') 
>>> res.raise_for_status() 
>>> soup = bs4.BeautifulSoup(res.text, 'html.parser') 
>>> author = soup.select('#author') 
>>> print(author) 
[] 
>>> type(author) 
<class 'list'> 
>>> link = soup.select('link ') 
>>> print(link) 
[<link href="css/mozMainStyle-min.css?v=20170705" rel="external nofollow" rel="external nofollow" rel="stylesheet" type="text/css"/>, <link href="" id=" rel="external nofollow" rel="external nofollow" rel="external nofollow" moz-skin" rel="stylesheet" type="text/css"/>, <link href="" id=" rel="external nofollow" rel="external nofollow" rel="external nofollow" moz-dir" rel="stylesheet" type="text/css"/>, <link href="" id=" rel="external nofollow" rel="external nofollow" rel="external nofollow" moz-ver" rel="stylesheet" type="text/css"/>] 
>>> type(link) 
<class 'list'> 
>>> len(link) 
4 
>>> type(link[0]) 
<class 'bs4.element.Tag'> 
>>> link[0] 
<link href="css/mozMainStyle-min.css?v=20170705" rel="external nofollow" rel="external nofollow" rel="stylesheet" type="text/css"/> 
>>> link[0].attrs 
{'rel': ['stylesheet'], 'type': 'text/css', 'href': 'css/mozMainStyle-min.css?v=20170705'}

 3.通过元素的属性获取数据:接着上面的代码写。

>>> link[0].get('href') 
'css/mozMainStyle-min.css?v=20170705

上面这些方法也算是对“网络爬虫”的一些初探。

Python 相关文章推荐
Python常用随机数与随机字符串方法实例
Apr 09 Python
使用Python编写一个简单的tic-tac-toe游戏的教程
Apr 16 Python
Python的Django框架中的URL配置与松耦合
Jul 15 Python
Python编程中装饰器的使用示例解析
Jun 20 Python
python爬取w3shcool的JQuery课程并且保存到本地
Apr 06 Python
python 使用poster模块进行http方式的文件传输到服务器的方法
Jan 15 Python
我们为什么要减少Python中循环的使用
Jul 10 Python
Python中zip()函数的简单用法举例
Sep 02 Python
Python 50行爬虫抓取并处理图灵书目过程详解
Sep 20 Python
jupyter notebook实现显示行号
Apr 13 Python
python基于win32api实现键盘输入
Dec 09 Python
Pandas之缺失数据的实现
Jan 06 Python
python十进制和二进制的转换方法(含浮点数)
Jul 07 #Python
Python3+django2.0+apache2+ubuntu14部署网站上线的方法
Jul 07 #Python
python3实现字符串的全排列的方法(无重复字符)
Jul 07 #Python
python3 kmp 字符串匹配的方法
Jul 07 #Python
vue.js实现输入框输入值内容实时响应变化示例
Jul 07 #Python
详解Python最长公共子串和最长公共子序列的实现
Jul 07 #Python
python求最大连续子数组的和
Jul 07 #Python
You might like
php中sprintf与printf函数用法区别解析
2014/02/17 PHP
分享十款最出色的PHP安全开发库中文详细介绍
2015/03/22 PHP
PHP利用超级全局变量$_GET来接收表单数据的实例
2016/11/05 PHP
表单填写时用回车代替TAB的实现方法
2007/10/09 Javascript
jQuery UI Datepicker length为空或不是对象错误的解决方法
2010/12/19 Javascript
jquery实现带二级菜单的导航示例
2014/04/28 Javascript
JavaScript数值数组排序示例分享
2014/05/27 Javascript
JavaScript bold方法入门实例(把指定文字显示为粗体)
2014/10/17 Javascript
悬浮广告方法日常收集整理
2016/03/18 Javascript
AngularJS入门教程之Cookies读写操作示例
2016/11/02 Javascript
JS异步文件上传(兼容IE8+)
2017/04/02 Javascript
Angularjs 实现移动端在线测评效果(推荐)
2017/04/05 Javascript
electron踩坑之remote of undefined的解决
2020/10/06 Javascript
Python中的Numeric包和Numarray包使用教程
2015/04/13 Python
Python找出文件中使用率最高的汉字实例详解
2015/06/03 Python
深入浅析python继承问题
2016/05/29 Python
python实现百万答题自动百度搜索答案
2018/01/16 Python
pyqt 实现为长内容添加滑轮 scrollArea
2019/06/19 Python
Python IDE Pycharm中的快捷键列表用法
2019/08/08 Python
python框架Django实战商城项目之工程搭建过程图文详解
2020/03/09 Python
BeautifulSoup获取指定class样式的div的实现
2020/12/07 Python
CSS3实现歌词进度文字颜色填充变化动态效果的思路详解
2020/06/02 HTML / CSS
html5触摸事件判断滑动方向的实现
2018/06/05 HTML / CSS
新奥尔良珠宝:Mignon Faget
2020/11/23 全球购物
Bloomingdale’s阿联酋:选购奢华时尚、美容及更多
2020/09/22 全球购物
数据库的约束含义
2012/09/09 面试题
体育教育个人自荐信范文
2013/12/01 职场文书
前台接待岗位职责
2013/12/03 职场文书
2014年组织部工作总结
2014/11/14 职场文书
企业财务经理岗位职责
2015/04/08 职场文书
婚宴致辞
2015/07/28 职场文书
安全教育的主题班会
2015/08/13 职场文书
如何用PHP实现分布算法之一致性哈希算法
2021/05/26 PHP
html输入两个数实现加减乘除功能
2021/07/01 HTML / CSS
JavaScript 原型与原型链详情
2021/11/02 Javascript
springboot创建的web项目整合Quartz框架的项目实践
2022/06/21 Java/Android