零基础写python爬虫之使用urllib2组件抓取网页内容


Posted in Python onNovember 04, 2014

版本号:Python2.7.5,Python3改动较大,各位另寻教程。

所谓网页抓取,就是把URL地址中指定的网络资源从网络流中读取出来,保存到本地。 
类似于使用程序模拟IE浏览器的功能,把URL作为HTTP请求的内容发送到服务器端, 然后读取服务器端的响应资源。

在Python中,我们使用urllib2这个组件来抓取网页。
urllib2是Python的一个获取URLs(Uniform Resource Locators)的组件。

它以urlopen函数的形式提供了一个非常简单的接口。

最简单的urllib2的应用代码只需要四行。

我们新建一个文件urllib2_test01.py来感受一下urllib2的作用:

import urllib2
response = urllib2.urlopen('http://www.baidu.com/')
html = response.read()
print html

按下F5可以看到运行的结果:

零基础写python爬虫之使用urllib2组件抓取网页内容

我们可以打开百度主页,右击,选择查看源代码(火狐OR谷歌浏览器均可),会发现也是完全一样的内容。

也就是说,上面这四行代码将我们访问百度时浏览器收到的代码们全部打印了出来。

这就是一个最简单的urllib2的例子。

除了"http:",URL同样可以使用"ftp:","file:"等等来替代。

HTTP是基于请求和应答机制的:

客户端提出请求,服务端提供应答。

urllib2用一个Request对象来映射你提出的HTTP请求。

在它最简单的使用形式中你将用你要请求的地址创建一个Request对象,

通过调用urlopen并传入Request对象,将返回一个相关请求response对象,

这个应答对象如同一个文件对象,所以你可以在Response中调用.read()。

我们新建一个文件urllib2_test02.py来感受一下:

import urllib2  
req = urllib2.Request('http://www.baidu.com')  
response = urllib2.urlopen(req)  
the_page = response.read()  
print the_page

可以看到输出的内容和test01是一样的。

urllib2使用相同的接口处理所有的URL头。例如你可以像下面那样创建一个ftp请求。

req = urllib2.Request('ftp://example.com/')

在HTTP请求时,允许你做额外的两件事。

1.发送data表单数据

这个内容相信做过Web端的都不会陌生,

有时候你希望发送一些数据到URL(通常URL与CGI[通用网关接口]脚本,或其他WEB应用程序挂接)。

在HTTP中,这个经常使用熟知的POST请求发送。

这个通常在你提交一个HTML表单时由你的浏览器来做。

并不是所有的POSTs都来源于表单,你能够使用POST提交任意的数据到你自己的程序。

一般的HTML表单,data需要编码成标准形式。然后做为data参数传到Request对象。

编码工作使用urllib的函数而非urllib2。

我们新建一个文件urllib2_test03.py来感受一下:

import urllib  
import urllib2  
url = 'http://www.someserver.com/register.cgi'  
values = {'name' : 'WHY',  
          'location' : 'SDU',  
          'language' : 'Python' }  
data = urllib.urlencode(values) # 编码工作
req = urllib2.Request(url, data)  # 发送请求同时传data表单
response = urllib2.urlopen(req)  #接受反馈的信息
the_page = response.read()  #读取反馈的内容

如果没有传送data参数,urllib2使用GET方式的请求。

GET和POST请求的不同之处是POST请求通常有"副作用",

它们会由于某种途径改变系统状态(例如提交成堆垃圾到你的门口)。

Data同样可以通过在Get请求的URL本身上面编码来传送。

import urllib2  
import urllib
data = {}
data['name'] = 'WHY'  
data['location'] = 'SDU'  
data['language'] = 'Python'
url_values = urllib.urlencode(data)  
print url_values
name=Somebody+Here&language=Python&location=Northampton  
url = 'http://www.example.com/example.cgi'  
full_url = url + '?' + url_values
data = urllib2.open(full_url)

这样就实现了Data数据的Get传送。

2.设置Headers到http请求

有一些站点不喜欢被程序(非人为访问)访问,或者发送不同版本的内容到不同的浏览器。

默认的urllib2把自己作为“Python-urllib/x.y”(x和y是Python主版本和次版本号,例如Python-urllib/2.7),

这个身份可能会让站点迷惑,或者干脆不工作。

浏览器确认自己身份是通过User-Agent头,当你创建了一个请求对象,你可以给他一个包含头数据的字典。

下面的例子发送跟上面一样的内容,但把自身模拟成Internet Explorer。

(多谢大家的提醒,现在这个Demo已经不可用了,不过原理还是那样的)。

import urllib  
import urllib2  
url = 'http://www.someserver.com/cgi-bin/register.cgi'
user_agent = 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)'  
values = {'name' : 'WHY',  
          'location' : 'SDU',  
          'language' : 'Python' }  
headers = { 'User-Agent' : user_agent }  
data = urllib.urlencode(values)  
req = urllib2.Request(url, data, headers)  
response = urllib2.urlopen(req)  
the_page = response.read() 

以上就是python利用urllib2通过指定的URL抓取网页内容的全部内容,非常简单吧,希望对大家能有所帮助

Python 相关文章推荐
Python基于回溯法子集树模板解决全排列问题示例
Sep 07 Python
django模板语法学习之include示例详解
Dec 17 Python
python中判断文件编码的chardet(实例讲解)
Dec 21 Python
运动检测ViBe算法python实现代码
Jan 09 Python
python3.5+tesseract+adb实现西瓜视频或头脑王者辅助答题
Jan 17 Python
对Python中小整数对象池和大整数对象池的使用详解
Jul 09 Python
用django设置session过期时间的方法解析
Aug 05 Python
python中下标和切片的使用方法解析
Aug 27 Python
pyqt5 QScrollArea设置在自定义侧(任何位置)
Sep 25 Python
python matplotlib 绘图 和 dpi对应关系详解
Mar 14 Python
用 Python 定义 Schema 并生成 Parquet 文件详情
Sep 25 Python
Python自动操作神器PyAutoGUI的使用教程
Jun 16 Python
零基础写python爬虫之爬虫的定义及URL构成
Nov 04 #Python
使用Python编写简单网络爬虫抓取视频下载资源
Nov 04 #Python
Python爬取Coursera课程资源的详细过程
Nov 04 #Python
使用python开发vim插件及心得分享
Nov 04 #Python
Python学习笔记之os模块使用总结
Nov 03 #Python
Python中获取网页状态码的两个方法
Nov 03 #Python
Python random模块常用方法
Nov 03 #Python
You might like
js 页面刷新location.reload和location.replace的区别小结
2009/12/24 Javascript
cnblogs中在闪存中屏蔽某人的实现代码
2010/11/14 Javascript
JS获得URL超链接的参数值实例代码
2013/06/21 Javascript
用jquery统计子菜单的条数示例代码
2013/10/18 Javascript
鼠标滚轴控制文本框值的JS代码
2013/11/19 Javascript
js中function()使用方法
2013/12/24 Javascript
JavaScript格式化日期时间的方法和自定义格式化函数示例
2014/04/04 Javascript
jquery ajax应用中iframe自适应高度问题解决方法
2014/04/12 Javascript
浅谈Javascript 数组与字典
2015/01/29 Javascript
JavaScript控制图片加载完成后调用回调函数的方法
2015/03/20 Javascript
Bootstrap布局组件教程之Bootstrap下拉菜单
2016/06/12 Javascript
Jquery-data的三种用法
2017/04/18 jQuery
微信小程序中button组件的边框设置的实例详解
2017/09/27 Javascript
vue 搭建后台系统模块化开发详解
2019/05/01 Javascript
JavaScript计算正方形面积
2019/11/26 Javascript
原生JS利用transform实现banner的无限滚动示例代码
2020/06/15 Javascript
JavaScript 常见的继承方式汇总
2020/09/17 Javascript
jQuery实现放大镜案例
2020/10/19 jQuery
Python写的创建文件夹自定义函数mkdir()
2014/08/25 Python
在Python中使用cookielib和urllib2配合PyQuery抓取网页信息
2015/04/25 Python
PyQt5每天必学之日历控件QCalendarWidget
2018/04/19 Python
Python Django view 两种return的实现方式
2020/03/16 Python
python爬虫学习笔记之Beautifulsoup模块用法详解
2020/04/09 Python
pymysql之cur.fetchall() 和cur.fetchone()用法详解
2020/05/15 Python
python BeautifulSoup库的安装与使用
2020/12/17 Python
Bose美国官网:购买Bose耳机和音箱
2019/03/10 全球购物
Doyoueven官网:澳大利亚健身服饰和配饰品牌
2019/03/24 全球购物
俄罗斯第一家多品牌在线奢侈品精品店:Aizel.ru
2020/09/06 全球购物
艺术设计专业个人求职信
2013/09/21 职场文书
我的网上商城创业计划书
2013/12/26 职场文书
数学系毕业生的自我评价
2014/01/10 职场文书
军训自我鉴定200字
2014/02/13 职场文书
授权委托书样本
2014/04/03 职场文书
群众路线自我剖析材料
2014/10/08 职场文书
2014年安全生产工作总结
2014/11/13 职场文书
Pytorch中使用ImageFolder读取数据集时忽略特定文件
2022/03/23 Python