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 相关文章推荐
python3模拟百度登录并实现百度贴吧签到示例分享(百度贴吧自动签到)
Feb 24 Python
Python 分析Nginx访问日志并保存到MySQL数据库实例
Mar 13 Python
Python中装饰器的一个妙用
Feb 08 Python
Django Admin实现上传图片校验功能
Mar 06 Python
python实现给微信公众号发送消息的方法
Jun 30 Python
python基础之入门必看操作
Jul 26 Python
Python实现通讯录功能
Feb 22 Python
解决python opencv无法显示图片的问题
Oct 28 Python
python3 爬取图片的实例代码
Nov 06 Python
详解Python中namedtuple的使用
Apr 27 Python
使用Python实现微信拍一拍功能的思路代码
Jul 09 Python
python实现扫雷游戏的示例
Oct 20 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
让你的PHP7更快之Hugepage用法分析
2016/05/31 PHP
javascript 函数及作用域总结介绍
2013/11/12 Javascript
iframe实用操作锦集
2014/04/22 Javascript
关于Javascript加载执行优化的研究报告
2014/12/16 Javascript
在JS中操作时间之getUTCMilliseconds()方法的使用
2015/06/10 Javascript
分享两款带遮罩的jQuery弹出框
2015/12/30 Javascript
jQuery div拖拽用法实例
2016/01/14 Javascript
JS定时检测任务任务完成后执行下一步的解决办法
2016/12/22 Javascript
BootStrap Tooltip插件源码解析
2016/12/27 Javascript
MUI 解决动态列表页图片懒加载再次加载不成功的bug问题
2017/04/13 Javascript
vue双向数据绑定知识点总结
2018/04/18 Javascript
JS/HTML5游戏常用算法之碰撞检测 地图格子算法实例详解
2018/12/12 Javascript
谈谈为什么你的 JavaScript 代码如此冗长
2019/01/30 Javascript
开源一个微信小程序仪表盘组件过程解析
2019/07/30 Javascript
Js on及addEventListener原理用法区别解析
2020/07/11 Javascript
vue项目接口管理,所有接口都在apis文件夹中统一管理操作
2020/08/13 Javascript
Taro小程序自定义顶部导航栏功能的实现
2020/12/17 Javascript
[57:47]Fnatic vs Winstrike 2018国际邀请赛小组赛BO2 第二场 8.18
2018/08/19 DOTA
[15:07]lgd_OG_m2_BP
2019/09/10 DOTA
python xml解析实例详解
2016/11/14 Python
python计算列表内各元素的个数实例
2018/06/29 Python
pandas DataFrame 删除重复的行的实现方法
2019/01/29 Python
Python图像处理库PIL的ImageFilter模块使用介绍
2020/02/26 Python
python使用梯度下降算法实现一个多线性回归
2020/03/24 Python
django 解决扩展自带User表遇到的问题
2020/05/14 Python
Python如何实现定时器功能
2020/05/28 Python
浅析关于Keras的安装(pycharm)和初步理解
2020/10/23 Python
阿里健康官方海外旗舰店:阿里健康国际自营
2017/11/24 全球购物
拉飞逸官网:Lafayette 148 New York
2020/07/15 全球购物
幼儿园老师寄语
2014/04/03 职场文书
材料化学专业求职信
2014/07/15 职场文书
拾金不昧感谢信范文
2015/01/21 职场文书
入党申请书格式
2019/06/20 职场文书
Redis集群的关闭与重启操作
2021/07/07 Redis
Netty分布式客户端处理接入事件handle源码解析
2022/03/25 Java/Android
JavaScript parseInt0.0000005打印5原理解析
2022/07/23 Javascript