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 相关文章推荐
在RedHat系Linux上部署Python的Celery框架的教程
Apr 07 Python
python用reduce和map把字符串转为数字的方法
Dec 19 Python
python3中dict(字典)的使用方法示例
Mar 22 Python
python的pdb调试命令的命令整理及实例
Jul 12 Python
python学生管理系统代码实现
Apr 05 Python
python简易远程控制单线程版
Jun 20 Python
python使用response.read()接收json数据的实例
Dec 19 Python
从0开始的Python学习016异常
Apr 08 Python
Python如何爬取微信公众号文章和评论(基于 Fiddler 抓包分析)
Jun 28 Python
python绘制多个子图的实例
Jul 07 Python
Django实现auth模块下的登录注册与注销功能
Oct 10 Python
python 实现批量替换文本中的某部分内容
Dec 13 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
PHP 和 XML: 使用expat函数(二)
2006/10/09 PHP
php 上一篇,下一篇文章实现代码与原理说明
2010/05/09 PHP
PHP中使用BigMap实例
2015/03/30 PHP
php判断str字符串是否是xml格式数据的方法示例
2017/07/26 PHP
Laravel5.4简单实现app接口Api Token认证方法
2019/08/29 PHP
php+js实现点赞功能的示例详解
2020/08/07 PHP
javascript 面向对象编程基础:继承
2009/08/21 Javascript
js 分栏效果实现代码
2009/08/29 Javascript
JSON传递bool类型数据的处理方式介绍
2013/09/18 Javascript
javascript实现修改微信分享的标题内容等
2014/12/11 Javascript
JQuery基础语法小结
2015/02/27 Javascript
JS实现带缓冲效果打开、关闭、移动一个层的方法
2015/05/09 Javascript
JavaScript动态添加style节点的方法
2015/06/09 Javascript
详解AngularJS Filter(过滤器)用法
2015/12/28 Javascript
js/jq仿window文件夹移动/剪切/复制等操作代码
2017/03/08 Javascript
vue中七牛插件使用的实例代码
2017/07/28 Javascript
关于自定义Egg.js的请求级别日志详解
2018/12/12 Javascript
js实现无缝滚动双图切换效果
2019/07/09 Javascript
mock.js模拟前后台交互
2019/07/25 Javascript
vue中使用element ui的弹窗与echarts之间的问题详解
2019/10/25 Javascript
详解Django中类视图使用装饰器的方式
2018/08/12 Python
pyqt5的QComboBox 使用模板的具体方法
2018/09/06 Python
Python 安装第三方库 pip install 安装慢安装不上的解决办法
2019/06/18 Python
TensorFlow绘制loss/accuracy曲线的实例
2020/01/21 Python
pygame实现飞机大战
2020/03/11 Python
屏蔽Django admin界面添加按钮的操作
2020/03/11 Python
解决Pytorch自定义层出现多Variable共享内存错误问题
2020/06/28 Python
python使用smtplib模块发送邮件
2020/12/17 Python
HTML5 Canvas实现图片缩放、翻转、颜色渐变的代码示例
2016/02/28 HTML / CSS
丝芙兰香港官网:Sephora香港
2018/03/13 全球购物
syb养殖创业计划书
2014/01/09 职场文书
小学生安全责任书
2014/07/25 职场文书
四风剖析查摆对照检查材料思想汇报
2014/09/24 职场文书
我的兄弟姐妹观后感
2015/06/15 职场文书
2015年六年级班主任工作总结
2015/10/15 职场文书
Python爬虫实战之爬取携程评论
2021/06/02 Python