Python爬虫 urllib2的使用方法详解


Posted in Python onSeptember 23, 2019

所谓网页抓取,就是把URL地址中指定的网络资源从网络流中读取出来,保存到本地。在Python中有很多库可以用来抓取网页,我们先学习urllib2。

urllib2是Python2.x自带的模块(不需要下载,导入即可使用)

urllib2官网文档:https://docs.python.org/2/library/urllib2.html

urllib2源码

urllib2在python3.x中被改为urllib.request

urlopen

我们先来段代码:

#-*- coding:utf-8 -*-
#01.urllib2_urlopen.py
#导入urllib2库
import urllib2
#向指定的url发送请求,并返回服务器的类文件对象
response = urllib2.urlopen("http://www.baidu.com")
#类文件对象支持文件对象的操作方法,如read()方法读取文件
html = response.read()
#打印字符串
print(html)

执行写好的python代码,将打印结果:

python2 01.urllib2_urlopen.py

实际上,如果我们在浏览器打上百度主页,右键选择"查看源代码",你会发现,跟我们刚才打印出来的是一模一样的。也就是说,上面的4行代码就已经帮我们把百度的首页的全部代码爬了下来。
一个基本的url请求对应的python代码真的非常简单。

Request

查看官方文档url的用法如下:

urllib2.urlopen(url[, data[, timeout[, cafile[, capath[, cadefault[, context]]]]])
Open the URL url, which can be either a string or a Request object.

在我们第一个例子里,urlopen()的参数就是一个url地址;

但是如果需要执行更复杂的操作,比如增加http报头,则必须创建一个Request实例来作为urlopen()的参数;而需要访问的url地址则作为Request实例的参数。

#-*- coding:utf-8 -*-
#02.urllib2_request.py

import urllib2

#url作为Request()方法的参数,构造并返回一个Request对象
request = urllib2.Request("http://www.baidu.com")

#Request对象作为一个urlopen()方法的参数,发送给服务器并接收响应
response = urllib2.urlopen(request)

html = response.read()

print(html)

运行结果是完全一样的:

新建Request实例,除了必须要有url参数之外,还可以设置另外两个参数:

data(默认空):是伴随url提交的数据(比如要post的数据),同时HTTP请求将从"GET"方式改为"POST"方式。
headers(默认空):是一个字典,包含了需要发送的HTTP报头的键值对。
这两个参数下面会说到。

User-Agent

但是这样直接用urllib2给一个网站发送请求的话,确实略有些唐突了,就好比,人家每家都有门,你以一个路人的身份直接闯进去显然不是很礼貌。而且有一些站点不喜欢被程序(非人为访问)访问,有可能会拒绝你的访问请求。

但是如果我们用一个合法的身份去请求别人网站,显然人家就是欢迎的,所以我们就应该给我们的这个代码加上一个身份,就是所谓的User-Agent头。

浏览器就是互联网世界公认被允许的身份,如果我们希望我们的爬虫程序更像一个真实用户,那我们第一步,就是需要伪装成一个被公认的浏览器。用不同的浏览器在发送请求的时候,会有不同的User-Agent头。urllib2默认的User-Agent头为:Python-urllib/x.y(x和y是Python主版本和次版本号,例如Python-urllib/2.7)

#-*- coding:utf-8 -*-
#03.urllib2_useragent.py

import urllib2

url = "http://www.itcast.cn"

#IE 9.0的User-Agent,包含ua-header里
ua_header = {"User-Agent":"Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0;"}

# url连同headers,一起构造Request请求,这个请求将附带IE9.0浏览器的User-Agent
request = urllib2.Request(url, headers = ua_header)

#向服务器发送这个请求
response = urllib2.urlopen(request)

html = response.read()

print(html)

添加更多的Header信息

在HTTP Request中加入特定的Header,来构造一个完整的HTTP请求。

可以通过调用Request.add_header()添加/修改一个特定的header也可以通过调用Request.get_header()来查看已有的header。

添加一个特定的header

#-*- coding:utf-8 -*-
#04.urllib2_headers.py

import urllib2

url = "http://www.itcast.cn"

#IE 9.0的User-Agent
header = {"User-Agent":"Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0;"}
request =urllib2.Request(url, headers = header)

#也可以通过调用Request.add_header()添加/修改一个特定的header
request.add_header("Connection","keep-alive")

#也可以通过调用Request.get_header()来查看header信息
request.get_header(header_name = "Connection")

response = urllib2.urlopen(request)
print(response.code)  #可以查看响应状态码

html = response.read()
print(html)

  随机添加/修改User-Agent

#-*- coding:utf-8 -*-
#05.urllib2_add_headers.py

import urllib2
import random

url = "http://www.itcast.cn"

ua_list = [
  "Mozilla/5.0 (Windows NT 6.1; ) Apple.... ",
  "Mozilla/5.0 (X11; CrOS i686 2268.111.0)... ",
  "Mozilla/5.0 (Macintosh; U; PPC Mac OS X.... ",
  "Mozilla/5.0 (Macintosh; Intel Mac OS... "
]

user_agent = random.choice(ua_list)

request = urllib2.Request(url)

#也可以通过调用Request.add_header()添加/修改一个特定的header
request.add_header("User-Agent", user_agent)

#第一个字母大写,后面的全部小写
request.add_header("User-agent")

response = urllib2.urlopen(req)

html = response.read()

print(html)

注意

The urllib2 module has been split across several modules in Python 3 named urllib.request and urllib.error

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python实现list元素按关键字相加减的方法示例
Jun 09 Python
Python 读取图片文件为矩阵和保存矩阵为图片的方法
Apr 27 Python
符合语言习惯的 Python 优雅编程技巧【推荐】
Sep 25 Python
值得收藏,Python 开发中的高级技巧
Nov 23 Python
Python Pandas实现数据分组求平均值并填充nan的示例
Jul 04 Python
python实现微信自动回复机器人功能
Jul 11 Python
python线程安全及多进程多线程实现方法详解
Sep 27 Python
Python实现字符串中某个字母的替代功能
Oct 21 Python
Python实现大数据收集至excel的思路详解
Jan 03 Python
Python实现七个基本算法的实例代码
Oct 08 Python
Python实现滑雪小游戏
Sep 25 Python
Python多线程实用方法以及共享变量资源竞争问题
Apr 12 Python
Python 正则表达式爬虫使用案例解析
Sep 23 #Python
python处理document文档保留原样式
Sep 23 #Python
python 进程间数据共享multiProcess.Manger实现解析
Sep 23 #Python
python程序 线程队列queue使用方法解析
Sep 23 #Python
python程序 创建多线程过程详解
Sep 23 #Python
详解python播放音频的三种方法
Sep 23 #Python
Python进程间通信 multiProcessing Queue队列实现详解
Sep 23 #Python
You might like
对PHP新手的一些建议(PHP学习经验总结)
2014/08/20 PHP
thinkPHP模板中函数的使用方法示例
2016/11/30 PHP
CI框架(CodeIgniter)公共模型类定义与用法示例
2017/08/10 PHP
利用PHP获取汉字首字母并且分组排序详解
2017/10/22 PHP
js 覆盖和重载 函数
2009/09/25 Javascript
关于firefox的ElementTraversal 接口 使用说明
2010/11/11 Javascript
用jquery实现的一个超级简单的下拉菜单
2014/05/18 Javascript
基于BootStrap Metronic开发框架经验小结【三】下拉列表Select2插件的使用
2016/05/12 Javascript
微信小程序 获取当前地理位置和经纬度实例代码
2016/12/05 Javascript
jQuery简单实现MD5加密的方法
2017/03/03 Javascript
vue的toast弹窗组件实例详解
2018/05/14 Javascript
js常用正则表达式集锦
2019/05/17 Javascript
基于vue3.0.1beta搭建仿京东的电商H5项目
2020/05/06 Javascript
Vue-cli3生成的Vue项目加载Mxgraph方法示例
2020/05/31 Javascript
Vue生命周期activated之返回上一页不重新请求数据操作
2020/07/26 Javascript
原生JavaScript实现弹幕组件的示例代码
2020/10/12 Javascript
javascript实现随机抽奖功能
2020/12/30 Javascript
基于python select.select模块通信的实例讲解
2017/09/21 Python
如何使用VSCode愉快的写Python于调试配置步骤
2018/04/06 Python
Python使用add_subplot与subplot画子图操作示例
2018/06/01 Python
Python求解任意闭区间的所有素数
2018/06/10 Python
基于python历史天气采集的分析
2019/02/14 Python
Pandas透视表(pivot_table)详解
2019/07/22 Python
python 控制Asterisk AMI接口外呼电话的例子
2019/08/08 Python
使用django和vue进行数据交互的方法步骤
2019/11/11 Python
解决Python3.7.0 SSL低版本导致Pip无法使用问题
2020/09/03 Python
详解使用HTML5 Canvas创建动态粒子网格动画
2016/12/14 HTML / CSS
生产现场工艺工程师岗位职责
2013/11/28 职场文书
四好少年事迹材料
2014/01/12 职场文书
解除劳动关系协议书范文
2014/09/11 职场文书
学生考试舞弊检讨书
2015/01/01 职场文书
2015年会计年终工作总结
2015/05/26 职场文书
2015年中学总务处工作总结
2015/07/22 职场文书
维护民族团结心得体会2016
2016/01/15 职场文书
十大最强火系宝可梦,喷火龙上榜,第一名有双火属性
2022/03/18 日漫
python装饰器代码解析
2022/03/23 Python