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中设置变量作为默认值时容易遇到的错误
Apr 03 Python
Python 使用SMTP发送邮件的代码小结
Sep 21 Python
Python进程间通信之共享内存详解
Oct 30 Python
python3结合openpyxl库实现excel操作的实例代码
Sep 11 Python
pygame游戏之旅 按钮上添加文字的方法
Nov 21 Python
Python功能点实现:函数级/代码块级计时器
Jan 02 Python
python PrettyTable模块的安装与简单应用
Jan 11 Python
学习python的前途 python挣钱
Feb 27 Python
Python中单线程、多线程和多进程的效率对比实验实例
May 14 Python
python实现基于朴素贝叶斯的垃圾分类算法
Jul 09 Python
python打印异常信息的两种实现方式
Dec 24 Python
在python里使用await关键字来等另外一个协程的实例
May 04 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字符串截取问题
2006/11/28 PHP
php设计模式 Mediator (中介者模式)
2011/06/26 PHP
使用php语句将数据库*.sql文件导入数据库
2014/05/05 PHP
PHP base64编码后解码乱码的解决办法
2014/06/19 PHP
推荐几个开源的微信开发项目
2014/12/28 PHP
PHP使用PDO连接ACCESS数据库
2015/03/05 PHP
php封装的连接Mysql类及用法分析
2015/12/10 PHP
PHP socket 模拟POST 请求实例代码
2016/07/18 PHP
Laravel框架用户登陆身份验证实现方法详解
2017/09/14 PHP
Docker 安装 PHP并与Nginx的部署实例讲解
2021/02/27 PHP
encode脚本和normal脚本混用的问题与解决方法
2007/03/08 Javascript
使用Jquery打造最佳用户体验的登录页面的实现代码
2011/07/08 Javascript
jquery.tmpl JQuery模板插件
2011/10/10 Javascript
用函数模板,写一个简单高效的 JSON 查询器的方法介绍
2013/04/17 Javascript
checkbox设置复选框的只读效果不让用户勾选
2013/08/12 Javascript
判定是否原生方法的JS代码
2013/11/12 Javascript
JS按回车键实现登录的方法
2014/08/25 Javascript
javascript背景时钟实现方法
2015/06/18 Javascript
JavaScript函数的调用以及参数传递
2015/10/21 Javascript
解决jQuery ajax请求在IE6中莫名中断的问题
2016/06/20 Javascript
Vue监听数据对象变化源码
2017/03/09 Javascript
VUE页面中通过双击实现复制表格中内容的示例代码
2020/06/11 Javascript
js实现从右往左匀速显示图片(无缝轮播)
2020/06/29 Javascript
Python实现向服务器请求压缩数据及解压缩数据的方法示例
2017/06/09 Python
matplotlib subplots 调整子图间矩的实例
2018/05/25 Python
OpenCV里的imshow()和Matplotlib.pyplot的imshow()的实现
2019/11/25 Python
python对文件的操作方法汇总
2020/02/28 Python
详解python with 上下文管理器
2020/09/02 Python
css3针对移动端卡顿问题的解决(动画性能优化)
2020/02/14 HTML / CSS
后勤自我鉴定
2013/10/13 职场文书
《守株待兔》教学反思
2014/03/01 职场文书
党支部三严三实对照检查材料思想汇报
2014/09/29 职场文书
上帝也疯狂观后感
2015/06/09 职场文书
中学音乐课教学反思
2016/02/18 职场文书
python lambda 表达式形式分析
2022/04/03 Python
mysql查看表结构的三种方法总结
2022/07/07 MySQL