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的lambda匿名函数的简单介绍
Apr 25 Python
python批量生成本地ip地址的方法
Mar 23 Python
python实现查找excel里某一列重复数据并且剔除后打印的方法
May 26 Python
Python 实现购物商城,含有用户入口和商家入口的示例
Sep 15 Python
如何优雅地处理Django中的favicon.ico图标详解
Jul 05 Python
Python3.7实现中控考勤机自动连接
Aug 28 Python
使用Python机器学习降低静态日志噪声
Sep 29 Python
selenium设置proxy、headers的方法(phantomjs、Chrome、Firefox)
Nov 29 Python
Django 中自定义 Admin 样式与功能的实现方法
Jul 04 Python
如何利用Python开发一个简单的猜数字游戏
Sep 22 Python
Python常用模块os.path之文件及路径操作方法
Dec 03 Python
Python基于Hypothesis测试库生成测试数据
Apr 29 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
哪吒敖丙传:新人物二哥敖乙出场 小敖丙奶气十足
2020/03/08 国漫
PHP函数之error_reporting(E_ALL ^ E_NOTICE)详细说明
2011/07/01 PHP
PHP实现恶意DDOS攻击避免带宽占用问题方法
2015/05/27 PHP
PHP实现将textarea的值根据回车换行拆分至数组
2015/06/10 PHP
PHP遍历目录文件的常用方法小结
2017/02/03 PHP
PHP用continue跳过本次循环中剩余代码的注意点
2017/06/27 PHP
PHP实现Huffman编码/解码的示例代码
2018/04/20 PHP
通过DOM脚本去设置样式信息
2010/09/19 Javascript
js修改input的type属性问题探讨
2013/10/12 Javascript
刷新页面的几种方法小结(JS,ASP.NET)
2014/01/07 Javascript
浅析jQuery(function(){})与(function(){})(jQuery)之间的区别
2014/01/09 Javascript
详解JavaScript ES6中的模板字符串
2015/07/28 Javascript
javascript实现图片上传前台页面
2015/08/18 Javascript
jquery配合.NET实现点击指定绑定数据并且能够一键下载
2016/10/28 Javascript
easyui datebox 时间限制,datebox开始时间限制结束时间,datebox截止日期比起始日期大的实现代码
2017/01/12 Javascript
基于js粘贴事件paste简单解析以及遇到的坑
2017/09/07 Javascript
Angular4实现图片上传预览路径不安全的问题解决
2017/12/25 Javascript
详解Immutable及 React 中实践
2018/03/01 Javascript
Flutter 超实用简单菜单弹出框 PopupMenuButton功能
2019/08/06 Javascript
vue 实现 rem 布局或vw 布局的方法
2019/11/13 Javascript
html-webpack-plugin修改页面的title的方法
2020/06/18 Javascript
vue实现防抖的实例代码
2021/01/11 Vue.js
[03:58]兄弟们,回来开黑了!DOTA2昔日战友招募宣传视频
2016/07/17 DOTA
Python的time模块中的常用方法整理
2015/06/18 Python
什么是python的id函数
2020/06/11 Python
西班牙家用电器和电子产品购物网站:Mi Electro
2019/02/25 全球购物
杭州时比特电子有限公司SQL
2013/08/22 面试题
.net面试题
2015/12/22 面试题
电大物流学生的自我评价
2013/10/25 职场文书
城镇居民医疗保险工作总结
2015/08/10 职场文书
2016年心理学教育培训学习心得体会
2016/01/12 职场文书
如果用一句诗总结你的上半年,你会用哪句呢?
2019/07/16 职场文书
简单实现一个手持弹幕功能+文字抖动特效
2021/03/31 HTML / CSS
Filebeat 采集 Nginx 日志的方法
2021/03/31 Servers
mysql 带多个条件的查询方式
2021/06/05 MySQL
Python爬取用户观影数据并分析用户与电影之间的隐藏信息!
2021/06/29 Python