Python中使用urllib2模块编写爬虫的简单上手示例


Posted in Python onJanuary 20, 2016

提起python做网络爬虫就不得不说到强大的组件urllib2。在python中正是使用urllib2这个组件来抓取网页的。urllib2是Python的一个获取URLs(Uniform Resource Locators)的组件。它以urlopen函数的形式提供了一个非常简单的接口。通过下面的代码简单感受一下urllib2的功能;

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

运行结果如下;

Python中使用urllib2模块编写爬虫的简单上手示例

查看http://www.baidu.com/源代码发现跟以上运行结果完全一样。这里的URL除了http:还可以是ftp:或file:
urllib2用一个Request对象来映射提出的HTTP请求。你可以创建一个Request对象,通过调用urlopen并传入Request对象,将返回一个相关请求response对象,这个应答对象如同一个文件对象,所以你可以在Response中调用.read()。修改代码如下;

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

发现运行结果跟修改前一样。同时在http请求前你还需要做以下事1、发送表单数据。2、设置headers信息。
1、发送表单数据;常见于模拟登录时,一般的在登录操作时需要发送数据到服务器。这里主要用到post方法,一般的HTML表单,data需要编码成标准形式。然后做为data参数传到Request对象。编码工作使用urllib的函数而非urllib2。测试代码如下

import urllib 
import urllib2 
 
url = 'http://www.server.com/register.php' 
 
postData = {'useid' : 'user', 
   'pwd' : '***', 
   'language' : 'Python' } 
 
data = urllib.urlencode(postData) # 编码工作 
req = urllib2.Request(url, data) # 发送请求同时传data 
response = urllib2.urlopen(req) #接受反馈的信息 
page = response.read() #读取反馈的内容

同时urllib2还可以使用get方法传送数据。代码如下;

import urllib2 
import urllib 
 
data = {} 
 
data['useid'] = 'user' 
data['pwd'] = '***' 
data['language'] = 'Python' 
 
values = urllib.urlencode(data) 
print values 
 
name=Somebody+Here&language=Python&location=Northampton 
url = 'http://www.example.com/example.php' 
full_url = url + '?' + url_values 
 
data = urllib2.open(full_url)

2、设置headers信息;有些站点对访问来源做了限制,所以这里模拟User-Agent头,代码如下;

import urllib 
import urllib2 
 
url = 'http://www.server.com/register.php' 
 
user_agent = 'Mozilla/5.0 (Windows NT 6.1; rv:33.0) Gecko/20100101 Firefox/33.0' 
values = {'useid' : 'user', 
   'pwd' : '***', 
   'language' : 'Python' } 
 
headers = { 'User-Agent' : user_agent } 
data = urllib.urlencode(values) 
req = urllib2.Request(url, data, headers) 
response = urllib2.urlopen(req) 
page = response.read()

urllib2就介绍到这里啦!

异常处理
通常URLError在没有网络连接时或者服务器地址不可达时产生,在这种情况下异常会带有resaon属性包含了错误号和错误信息。如下代码测试效果;

import urllib 
import urllib2 
 
url = 'http://www.server.com/register.php' 
 
user_agent = 'Mozilla/5.0 (Windows NT 6.1; rv:33.0) Gecko/20100101 Firefox/33.0' 
values = {'useid' : 'user', 
   'pwd' : '***', 
   'language' : 'Python' } 
 
headers = { 'User-Agent' : user_agent } 
data = urllib.urlencode(values) 
req = urllib2.Request(url, data, headers) 
response = urllib2.urlopen(req) 
page = response.read()

Python中使用urllib2模块编写爬虫的简单上手示例

查阅相关资料后显示Errno 10061表示服务器端主动拒绝。
除此之外还有HTTPError,当客户端与服务器之间建立正常连接时,urllib2将开始处理相关数据。如果遇到不能处理的情况就会产生相应的HTTPError,如网站访问常见的错误码”404″(页面无法找到),”403″(请求禁止),和”401″(带验证请求)等……HTTP状态码表示HTTP协议的响应情况,常见的状态码见HTTP状态码详解。
HTTPError会带有一个'code'属性,是服务器发送的错误号。当一个HTTPError产生后服务器会返回一个相关的错误号和错误页面。如下代码验证;

import urllib2 
 
req = urllib2.Request('http://www.python.org/callmewhy') 
 
try: 
 urllib2.urlopen(req) 
 
except urllib2.URLError, e: 
 
 print e.code

Python中使用urllib2模块编写爬虫的简单上手示例

输出404代码,说明找不到页面。
捕捉异常并处理……实现代码如下;

#-*- coding:utf-8 -*-
from urllib2 import Request, urlopen, URLError, HTTPError
 
req = Request('http://www.python.org/callmewhy')
 
try: 
 
 response = urlopen(req) 
 
except URLError, e: 
 
 if hasattr(e, 'code'): 
 
  print '服务器不能正常响应这个请求!' 
 
  print 'Error code: ', e.code 
 
 elif hasattr(e, 'reason'): 
 
  print '无法与服务器建立连接' 
 
  print 'Reason: ', e.reason 
 
 
else: 
 
 print '没有出现异常'

Python中使用urllib2模块编写爬虫的简单上手示例

成功捕捉到异常!

Python 相关文章推荐
用Python计算三角函数之atan()方法的使用
May 15 Python
深入讲解Java编程中类的生命周期
Feb 05 Python
python 找出list中最大或者最小几个数的索引方法
Oct 30 Python
Django框架验证码用法实例分析
May 10 Python
利用selenium爬虫抓取数据的基础教程
Jun 10 Python
解决Atom安装Hydrogen无法运行python3的问题
Aug 28 Python
Python openpyxl读取单元格字体颜色过程解析
Sep 03 Python
python中get和post有什么区别
Jun 19 Python
使用Python实现NBA球员数据查询小程序功能
Nov 09 Python
PyChon中关于Jekins的详细安装(推荐)
Dec 28 Python
python3定位并识别图片验证码实现自动登录功能
Jan 29 Python
Python3中PyQt5简单实现文件打开及保存
Jun 10 Python
Python模拟百度登录实例详解
Jan 20 #Python
Python的Scrapy爬虫框架简单学习笔记
Jan 20 #Python
使用Python编写爬虫的基本模块及框架使用指南
Jan 20 #Python
Python中urllib+urllib2+cookielib模块编写爬虫实战
Jan 20 #Python
深入剖析Python的爬虫框架Scrapy的结构与运作流程
Jan 20 #Python
实践Python的爬虫框架Scrapy来抓取豆瓣电影TOP250
Jan 20 #Python
Python的爬虫包Beautiful Soup中用正则表达式来搜索
Jan 20 #Python
You might like
php的SimpleXML方法读写XML接口文件实例解析
2014/06/16 PHP
php常用数组函数实例小结
2016/12/29 PHP
Yii框架布局文件的动态切换操作示例
2019/11/11 PHP
基于Jquery插件开发之图片放大镜效果(仿淘宝)
2011/11/19 Javascript
javascript中的window.location.search方法简介
2013/09/02 Javascript
window.returnValue使用方法示例介绍
2014/07/03 Javascript
IE中JS跳转丢失referrer问题的2个解决方法
2014/07/18 Javascript
javascript+html5实现绘制圆环的方法
2015/07/28 Javascript
clipboard.js无需Flash无需依赖任何JS库实现文本复制与剪切
2015/10/10 Javascript
js使用cookie记录用户名的方法
2015/11/26 Javascript
nodejs修复ipa处理过的png图片
2016/02/17 NodeJs
微信小程序 框架详解及实例应用
2016/09/26 Javascript
jQuery序列化表单成对象的简单实现
2016/11/29 Javascript
JavaScript模拟文件拖选框样式v1.0的实例
2017/08/04 Javascript
vue 挂载路由到头部导航的方法
2017/11/13 Javascript
使用socket.io制做简易WEB聊天室
2018/01/02 Javascript
node跨域转发 express+http-proxy-middleware的使用
2018/05/31 Javascript
微信小程序自定义组件实现tabs选项卡功能
2018/07/14 Javascript
基于vue.js实现购物车
2020/01/15 Javascript
JavaScript实现网页计算器功能
2020/10/29 Javascript
Python __setattr__、 __getattr__、 __delattr__、__call__用法示例
2015/03/06 Python
Python(TensorFlow框架)实现手写数字识别系统的方法
2018/05/29 Python
pandas通过索引进行排序的示例
2018/11/16 Python
Python计算时间间隔(精确到微妙)的代码实例
2019/02/26 Python
PyQt4 treewidget 选择改变颜色,并设置可编辑的方法
2019/06/17 Python
10款最好的Python开发编辑器
2019/07/03 Python
Kears+Opencv实现简单人脸识别
2019/08/28 Python
基于TensorFlow的CNN实现Mnist手写数字识别
2020/06/17 Python
如何让python的运行速度得到提升
2020/07/08 Python
python进度条显示-tqmd模块的实现示例
2020/08/23 Python
Vince官网:全球著名设计师品牌,休闲而优雅的服饰
2017/01/15 全球购物
应届生会计求职信
2013/11/11 职场文书
优秀生推荐信范文
2013/11/28 职场文书
早读迟到检讨书
2014/01/24 职场文书
期末学生评语大全
2014/04/24 职场文书
2014年德育工作总结
2014/11/20 职场文书