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找出9个连续的空闲端口
Feb 01 Python
NumPy.npy与pandas DataFrame的实例讲解
Jul 09 Python
Windows下Anaconda2安装NLTK教程
Sep 19 Python
Python中修改字符串的四种方法
Nov 02 Python
python使用pipeline批量读写redis的方法
Feb 18 Python
如何通过50行Python代码获取公众号全部文章
Jul 12 Python
python pip源配置,pip配置文件存放位置的方法
Jul 12 Python
Python使用matplotlib 画矩形的三种方式分析
Oct 31 Python
Django xadmin开启搜索功能的实现
Nov 15 Python
python中with语句结合上下文管理器操作详解
Dec 19 Python
python如何进行矩阵运算
Jun 05 Python
浅析python实现动态规划背包问题
Dec 31 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多态的实现详解
2013/06/09 PHP
php根据命令行参数生成配置文件详解
2019/03/15 PHP
基于laravel缓冲cache的用法详解
2019/10/23 PHP
PHP code 验证码生成类定义和简单使用示例
2020/05/27 PHP
php远程请求CURL实例教程(爬虫、保存登录状态)
2020/12/10 PHP
js截取函数(indexOf,join等)
2010/09/01 Javascript
IE网页js语法错误2行字符1、FF中正常的解决方法
2013/09/09 Javascript
Jquery ajaxStart()与ajaxStop()方法(实例讲解)
2013/12/18 Javascript
JS JQUERY实现滚动条自动滚到底的方法
2015/01/09 Javascript
JQuery中层次选择器用法实例详解
2015/05/18 Javascript
jQuery实现从身份证号中获取出生日期和性别的方法分析
2016/02/25 Javascript
使用jquery datatable和bootsrap创建表格实例代码
2017/03/17 Javascript
vue.js单页面应用实例的简单实现
2017/04/10 Javascript
详解AngularJs HTTP响应拦截器实现登陆、权限校验
2017/04/11 Javascript
vue将时间戳转换成自定义时间格式的方法
2018/03/02 Javascript
小程序组件之仿微信通讯录的实现代码
2018/09/12 Javascript
微信开发之企业付款到银行卡接口开发的示例代码
2018/09/18 Javascript
解决Vue在Tomcat8下部署页面不加载的问题
2019/11/12 Javascript
压缩Vue.js打包后的体积方法总结(Vue.js打包后体积过大问题)
2020/02/03 Javascript
如何搜索查找并解决Django相关的问题
2014/06/30 Python
编写Python脚本把sqlAlchemy对象转换成dict的教程
2015/05/29 Python
浅谈Python处理PDF的方法
2017/11/10 Python
通过python改变图片特定区域的颜色详解
2019/07/15 Python
python爬虫基础知识点整理
2020/06/02 Python
计算机网络毕业生自荐信
2013/10/01 职场文书
公司市场部岗位职责
2013/12/02 职场文书
学生党员思想汇报
2013/12/28 职场文书
毕业自我鉴定总结
2014/03/24 职场文书
投资协议书范本
2014/04/21 职场文书
关于祖国的演讲稿
2014/05/04 职场文书
劳动竞赛活动总结
2014/05/05 职场文书
名人演讲稿范文
2014/09/16 职场文书
2014学生会工作总结报告
2014/12/02 职场文书
实习单位鉴定意见
2015/06/04 职场文书
教你快速构建一个基于nginx的web集群项目
2021/11/27 Servers
Go并发4种方法简明讲解
2022/04/06 Golang