零基础写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实现搜索指定目录下文件及文件内搜索指定关键词的方法
Jun 28 Python
Python2与python3中 for 循环语句基础与实例分析
Nov 20 Python
python的Tqdm模块的使用
Jan 10 Python
python最小生成树kruskal与prim算法详解
Jan 17 Python
Python Flask 搭建微信小程序后台详解
May 06 Python
Atom Python 配置Python3 解释器的方法
Aug 28 Python
Python基于paramunittest模块实现excl参数化
Apr 26 Python
Python使用socketServer包搭建简易服务器过程详解
Jun 12 Python
Virtualenv 搭建 Py项目运行环境的教程详解
Jun 22 Python
Python3爬虫mitmproxy的安装步骤
Jul 29 Python
python自动化测试三部曲之request+django实现接口测试
Oct 07 Python
详解java调用python的几种用法(看这篇就够了)
Dec 10 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
php的一些小问题
2010/07/03 PHP
php学习笔记 类的声明与对象实例化
2011/06/13 PHP
php pdo操作数据库示例
2017/03/10 PHP
PHP中的输出echo、print、printf、sprintf、print_r和var_dump的示例代码
2020/12/01 PHP
jquery中prop()方法和attr()方法的区别浅析
2013/09/06 Javascript
巧用局部变量提升javascript性能
2014/02/24 Javascript
javascript写的一个模拟阅读小说的程序
2014/04/04 Javascript
jquery 操作css样式、位置、尺寸方法汇总
2014/11/28 Javascript
JavaScript插件化开发教程 (一)
2015/01/27 Javascript
JSONP之我见
2015/03/24 Javascript
Bootstrap每天必学之级联下拉菜单
2016/03/27 Javascript
js中json处理总结之JSON.parse
2016/10/14 Javascript
12306 刷票脚本及稳固刷票脚本(防挂)
2017/01/04 Javascript
原生js实现放大镜
2017/02/20 Javascript
微信小程序 下拉列表的实现实例代码
2017/03/08 Javascript
vue组件传递对象中实现单向绑定的示例
2018/02/28 Javascript
vue favicon设置以及动态修改favicon的方法
2018/12/21 Javascript
浅谈Vue的响应式原理
2019/05/30 Javascript
浅谈Vue项目骨架屏注入实践
2019/08/05 Javascript
[09:37]DOTA2卡尔工作室 英雄介绍圣堂刺客篇
2013/06/13 DOTA
[01:02:06]LGD vs Mineski Supermajor 胜者组 BO3 第二场 6.5
2018/06/06 DOTA
python标准日志模块logging的使用方法
2013/11/01 Python
python基于mysql实现的简单队列以及跨进程锁实例详解
2014/07/07 Python
Python中pygame的mouse鼠标事件用法实例
2015/11/11 Python
使用python进行文本预处理和提取特征的实例
2018/06/05 Python
python矩阵的转置和逆转实例
2018/12/12 Python
Django 权限认证(根据不同的用户,设置不同的显示和访问权限)
2019/07/24 Python
对Django 中request.get和request.post的区别详解
2019/08/12 Python
Python文件夹批处理操作代码实例
2020/07/21 Python
Fresh馥蕾诗英国官网:法国LVMH集团旗下高端天然护肤品牌
2018/11/01 全球购物
新浪网技术部笔试题
2016/08/26 面试题
党支部班子“四风”问题自我剖析材料
2014/09/28 职场文书
宾馆卫生管理制度
2015/08/06 职场文书
2016公务员年度考核评语
2015/12/01 职场文书
有关保护环境的宣传标语100条
2019/08/07 职场文书
Python利用zhdate模块实现农历日期处理
2022/03/31 Python