python爬虫基础之urllib的使用


Posted in Python onDecember 31, 2020

一、urllib 和 urllib2的关系

在python2中,主要使用urllib和urllib2,而python3对urllib和urllib2进行了重构,拆分成了urllib.request, urllib.parse, urllib.error,urllib.robotparser等几个子模块,这样的架构从逻辑和结构上说更加合理。urllib库无需安装,python3自带。python 3.x中将urllib库和urilib2库合并成了urllib库。

    urllib2.urlopen() 变成了 urllib.request.urlopen()
    urllib2.Request() 变成了 urllib.request.Request()
    python2中的 cookielib 改为 http.cookiejar.
    import http.cookiejar 代替  import cookielib
    urljoin 现在对应的函数是 urllib.parse.urljoin

二、python3下的urllib库

  • request,它是最基本的 HTTP 请求模块,我们可以用它来模拟发送一请求,只需要给库方法传入 URL 还有额外的参数,就可以模拟实现这个过程了。
  • error ,即异常处理模块,如果出现请求错误,我们可以捕获这些异常,然后进行重试或其他操作保证程序不会意外终止。
  • parse ,是一个工具模块,提供了许多 URL 处理方法,比如拆分、解析、合并等等的方法。
  • robotparser,主要是用来识别网站的 robots.txt 文件,然后判断哪些网站可以爬,哪些网站不可以爬的,其实用的比较少。

三、request的基础类

(一)request.urlopen

urlopen方法最主要的参数就是目标网站的url地址,可以使str类型,也可以是一个request对象。

get方法请求如下:

from urllib import request,parse
respones = request.urlopen(http://www.baidu.com/)

post方法请求,需要添加data参数(字典格式),它要是字节流编码格式的内容,即 bytes 类型,通过 bytes() 方法可以进行转化,另外如果传递了这个 data 参数,不添加data参数就默认为 GET 方式请求。

from urllib import request,parse
url = "http://www.baidu.com/"
wd = {'wd':'哇哈哈哈'}
data = bytes(parse.urlencode(wd),'utf-8')
respones = request.urlopen(url,data=data)

(二)request.Request

由于单独使用urlopen() 方法的不能添加User-Agent、Cookie等headers信息,需要构建一个 Request 类型的对象,通过构造这个这个数据结构,一方面我们可以将请求独立成一个对象,另一方面可配置参数更加丰富和灵活。主要参数有:

  • url 参数是请求 URL,这个是必传参数,其他的都是可选参数。
  • data 参数如果要传必须传 bytes(字节流)类型的,如果是一个字典,可以先用 urllib.parse 模块里的 urlencode() 编码。
  • headers 参数是一个字典,这个就是 Request Headers 了,你可以在构造 Request 时通过 headers 参数直接构造,也可以通过调用 Request 实例的 add_header() 方法来添加, Request Headers 最常用的用法就是通过修改 User-Agent 来伪装浏览器,默认的 User-Agent 是 Python-urllib,我们可以通过修改它来伪装浏览器。
  • origin_req_host 参数指的是请求方的 host 名称或者 IP 地址。
  • unverifiable 参数指的是这个请求是否是无法验证的,默认是False。意思就是说用户没有足够权限来选择接收这个请求的结果。例如我们请求一个 HTML 文档中的图片,但是我们没有自动抓取图像的权限,这时 unverifiable 的值就是 True。
  • method 参数是一个字符串,它用来指示请求使用的方法,比如GET,POST,PUT等等。

通过随机的方法,选择user-agent:

import randomUA_LIST = [
  'Mozilla/5.0 (compatible; U; ABrowse 0.6; Syllable) AppleWebKit/420+ (KHTML, like Gecko)',
  'Mozilla/5.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0; Acoo Browser 1.98.744; .NET CLR 3.5.30729)',
  'Mozilla/5.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0; Acoo Browser 1.98.744; .NET CLR 3.5.30729)',
  'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0; Acoo Browser; GTB5; Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1) ; InfoPath.1; .NET CLR 3.5.30729; .NET CLR 3.0.30618)',
  'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; SV1; Acoo Browser; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; Avant Browser)',
  'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; Acoo Browser; SLCC1; .NET CLR 2.0.50727; Media Center PC 5.0; .NET CLR 3.0.04506)',
  'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; Acoo Browser; GTB5; Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1) ; Maxthon; InfoPath.1; .NET CLR 3.5.30729; .NET CLR 3.0.30618)',
  'Mozilla/4.0 (compatible; Mozilla/5.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0; Acoo Browser 1.98.744; .NET CLR 3.5.30729); Windows NT 5.1; Trident/4.0)',
  'Mozilla/4.0 (compatible; Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; GTB6; Acoo Browser; .NET CLR 1.1.4322; .NET CLR 2.0.50727); Windows NT 5.1; Trident/4.0; Maxthon; .NET CLR 2.0.50727; .NET CLR 1.1.4322; InfoPath.2)',
  'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0; Acoo Browser; GTB6; Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1) ; InfoPath.1; .NET CLR 3.5.30729; .NET CLR 3.0.30618)'
]

#随机获取一个user-agent
user_agent = random.choice(UA_LIST)

添加headers头部信息的方法1:

url='http://www.baidu.com/'user_agent = random.choice(UA_LIST)
headers = {
  'User-Agent': user_agent
}
req = request.Request(url=url,headers=headers)
respones = request.urlopen(req)

添加headers头部信息的方法2:

url='http://www.baidu.com'
headers = {
  'User-Agent': user_agent
}
#添加user-agent的方法2
req = request.Request(url)
#请求添加user-agent
req.add_header("User-Agent",user_agent)
#获取请求的user-agent agent的a要小写
print(req.get_header("User-agent"))
response = request.urlopen(req)print(respones.read().decode('utf-8'))

三、request的高级类

在urllib.request模块里的BaseHandler类,他是所有其他Handler的父类,他是一个处理器,比如用它来处理登录验证,处理cookies,代理设置,重定向等。它提供了直接使用和派生类使用的方法:

  • add_parent(director):添加director作为父类
  • close():关闭它的父类
  • parent():打开使用不同的协议或处理错误
  • defautl_open(req):捕获所有的URL及子类,在协议打开之前调用

Handler的子类包括:

HTTPDefaultErrorHandler:用来处理http响应错误,错误会抛出HTTPError类的异常
HTTPRedirectHandler:用于处理重定向
HTTPCookieProcessor:用于处理cookies
ProxyHandler:用于设置代理,默认代理为空
HTTPPasswordMgr:永远管理密码,它维护用户名和密码表
HTTPBasicAuthHandler:用户管理认证,如果一个链接打开时需要认证,可以使用它来实现验证功能

(一)ProxyHandler

如果爬虫需要大量爬取网站数据,为了避免被封号,需要使用代理,通过request.build_opener()方法生成一个opener对象,添加代理的方法如下:

from urllib import request

#代理开关,表示是否开启代理
proxyswitch =True

#构建一个handler处理器对象,参数是一个字典类型,包括代理类型和代理服务器IP+PORT
proxyhandler = request.ProxyHandler({"http":"191.96.42.80:3128"})
#如果是带用户名和密码的代理,格式为{"http":"username:passwd@191.96.42.80:3128"}

#不加代理的handler处理器对象
nullproxyhandler = request.ProxyHandler()

if proxyswitch:
  opener = request.build_opener(proxyhandler)
else:
  opener = request.build_opener(nullproxyhandler)

req = request.Request("http://www.baidu.com/")

response = opener.open(req)

print(response.read().decode("utf-8"))

(二)ProxyBasicAuthHandler

通过密码管理器的方法实现代理服务器功能

from urllib import request
#代理密码管理,也可以管理服务器账户密码

#账户密码
user = "username"
passwd = "passwd"

#代理服务器
proxyserver = "1.1.1.1:9999"

#构建密码管理对象,保存需要处理的用户名和密码
passmgr = request.HTTPPasswordMgrWithDefaultRealm()

#添加账户信息,第一个参数realm是与远程服务器相关的域信息
passmgr.add_password(None,proxyserver,user,passwd)

#构建基础ProxyBasicAuthHandler处理器对象
proxyauth_handler = request.ProxyBasicAuthHandler(passmgr)

opener = request.build_opener(proxyauth_handler)

req = request.Request("http://www.baidu.com/")

response = opener.open(req)

(三)ProxyBasicAuthHandler

通过密码管理器的方法实现web认证登陆功能

#web验证
from urllib import request

test = "test"
passwd = "123456"

webserver = "1.1.1.1"

#构建密码管理器handler
passwdmgr = request.HTTPPasswordMgrWithDefaultRealm()
#添加密码信息
passwdmgr.add_password(None,webserver,test,passwd)

#HTTP基础验证处理器类
http_authhandler = request.HTTPBasicAuthHandler(passwdmgr)

opener = request.build_opener(http_authhandler)

req = request.Request("http://"+webserver)

response = opener.open(req)

四、Cookie处理

 通过http.cookiejar中的HTTPCookieProcessor构建cookie处理器对象,处理cookie信息

import http.cookiejar
from urllib import request,parse
#模拟登陆先post账户密码
#然后保存生成的cookie

#通过CookieJar类构件一个coociejar对象,从来保存cookie值
cookie = http.cookiejar.CookieJar()

#构件cookie处理器对象,用来处理cookie
cookie_handler = request.HTTPCookieProcessor(cookie)

#构件一个自定义的opener
opener = request.build_opener(cookie_handler)

#通过自定义的opener的addheaders参数,可以添加HTTP报头参数
opener.addheaders = [("User-Agent","Mozilla/5.0 (compatible; U; ABrowse 0.6; Syllable) AppleWebKit/420+ (KHTML, like Gecko)"),]

#需要登陆的接口
url = 'http://www.renren.com/PLogin.do'

#需要登陆的账户密码
data = {
  "email":"renren账号",
  "password":"密码"
}
#数据处理
data = bytes(parse.urlencode(data),'utf-8')
#第一次是POST请求,通过登陆账户密码,得到cookie
req = request.Request(url,data=data)
#发送第一次POST请求,生成登陆后的cookie
response = opener.open(req)

print(response.read().decode("utf-8"))

#此时的opener已经包含了该链接下的cookie,此时使用该opener就可以直接访问该站点下其他的网页而不需要再登陆了
opener.open(http://www.renren.com/PLogin.doxxxxxxxxxxxxx)

以上就是python爬虫基础之urllib的使用的详细内容,更多关于python 爬虫urllib的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
基于Django的python验证码(实例讲解)
Oct 23 Python
Python方法的延迟加载的示例代码
Dec 18 Python
python实现微信跳一跳辅助工具步骤详解
Jan 04 Python
python版本五子棋的实现代码
Dec 11 Python
python实现多层感知器
Jan 18 Python
Pycharm保存不能自动同步到远程服务器的解决方法
Jun 27 Python
在Python中COM口的调用方法
Jul 03 Python
讲解Python3中NumPy数组寻找特定元素下标的两种方法
Aug 04 Python
python 实现多线程下载m3u8格式视频并使用fmmpeg合并
Nov 15 Python
python框架Django实战商城项目之工程搭建过程图文详解
Mar 09 Python
Python字符串格式化f-string多种功能实现
May 07 Python
在Mac中配置Python虚拟环境过程解析
Jun 22 Python
python opencv实现直线检测并测出倾斜角度(附源码+注释)
Dec 31 #Python
Python实现Appium端口检测与释放的实现
Dec 31 #Python
python 基于selectors库实现文件上传与下载
Dec 31 #Python
python中Mako库实例用法
Dec 31 #Python
Python调用系统命令os.system()和os.popen()的实现
Dec 31 #Python
Python使用Opencv实现边缘检测以及轮廓检测的实现
Dec 31 #Python
python 检测nginx服务邮件报警的脚本
Dec 31 #Python
You might like
是否存在第一台收音机的说法
2021/03/01 无线电
解析php中mysql_connect与mysql_pconncet的区别详解
2013/05/15 PHP
PHP实现的下载远程图片自定义函数分享
2015/01/28 PHP
thinkPHP5 tablib标签库自定义方法详解
2017/05/10 PHP
PHP编程获取图片的主色调的方法【基于Imagick扩展】
2017/08/02 PHP
laravel ORM 只开启created_at的几种方法总结
2018/01/29 PHP
实现复选框全选/全不选切换
2006/12/23 Javascript
jQuery之网页换肤实现代码
2011/04/30 Javascript
Javascript继承机制的设计思想分享
2011/08/28 Javascript
javascript开发随笔一 preventDefault的必要
2011/11/25 Javascript
iframe 上下滚动条如何默认在下方实现原理
2012/12/10 Javascript
onclick与listeners的执行先后问题详细解剖
2013/01/07 Javascript
14个有用的Jquery技巧分享
2015/01/08 Javascript
jquery仅用6行代码实现滑动门效果
2015/09/07 Javascript
JS提交form表单实例分析
2015/12/10 Javascript
JavaScript的for循环中嵌套一个点击事件的问题解决
2017/03/03 Javascript
详解Vue中使用v-for语句抛出错误的解决方案
2017/05/04 Javascript
手动用webpack搭建第一个ReactApp的示例
2018/04/11 Javascript
微信小程序之裁剪图片成圆形的实现代码
2018/10/11 Javascript
微信小程序文字显示换行问题
2019/07/28 Javascript
python虚拟环境 virtualenv的简单使用
2020/01/21 Javascript
vue组件库的在线主题编辑器的实现思路
2020/04/03 Javascript
在vue项目中promise解决回调地狱和并发请求的问题
2020/11/09 Javascript
[42:52]IG vs VGJ.T 2018国际邀请赛小组赛BO2 第二场 8.18
2018/08/19 DOTA
在Windows8上的搭建Python和Django环境
2014/07/03 Python
python 2.7.14安装图文教程
2018/04/08 Python
python使用socket创建tcp服务器和客户端
2018/04/12 Python
django反向解析URL和URL命名空间的方法
2018/06/05 Python
Python面向对象实现一个对象调用另一个对象操作示例
2019/04/08 Python
pyqt5 实现 下拉菜单 + 打开文件的示例代码
2019/06/20 Python
Python生态圈图像格式转换问题(推荐)
2019/12/02 Python
HTML5本地存储之IndexedDB
2017/06/16 HTML / CSS
三八红旗手主要事迹材料
2015/11/04 职场文书
python迷宫问题深度优先遍历实例
2021/06/20 Python
Mysql的Table doesn't exist问题及解决
2022/12/24 MySQL
CSS实现鼠标悬浮动画特效
2023/05/07 HTML / CSS