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 相关文章推荐
用实例分析Python中method的参数传递过程
Apr 02 Python
python MySQLdb Windows下安装教程及问题解决方法
May 09 Python
Python使用cx_Oracle模块将oracle中数据导出到csv文件的方法
May 16 Python
pyhton列表转换为数组的实例
Apr 04 Python
Python实现的爬虫刷回复功能示例
Jun 07 Python
TensorFlow卷积神经网络之使用训练好的模型识别猫狗图片
Mar 14 Python
PyTorch基本数据类型(一)
May 22 Python
Python将string转换到float的实例方法
Jul 29 Python
python中property属性的介绍及其应用详解
Aug 29 Python
Python短信轰炸的代码
Mar 25 Python
python开发入门——set的使用
Sep 03 Python
Python Matplotlib绘制条形图的全过程
Oct 24 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
全局记录程序片段的运行时间 正确找到程序逻辑耗时多的断点
2011/01/06 PHP
thinkphp中多表查询中防止数据重复的sql语句(必看)
2016/09/22 PHP
TP3.2.3框架使用CKeditor编辑器在页面中上传图片的方法分析
2019/12/31 PHP
一个小型js框架myJSFrame附API使用帮助
2008/06/28 Javascript
javascript web对话框与弹出窗口
2009/02/22 Javascript
js 加载并解析XML字符串的代码
2009/12/13 Javascript
jquery nth-child()选择器的简单应用
2010/07/10 Javascript
JS 控制小数位数的实现代码
2011/08/02 Javascript
单击按钮显示隐藏子菜单经典案例
2013/01/04 Javascript
利用jQuery的deferred对象实现异步按顺序加载JS文件
2013/03/17 Javascript
Jquery动态替换div内容及动态展示的方法
2015/01/23 Javascript
理解JavaScript中worker事件api
2015/12/25 Javascript
理解javascript定时器中的setTimeout与setInterval
2016/02/23 Javascript
javascript中eval解析JSON字符串
2016/02/27 Javascript
JS实现图片上传预览功能
2016/11/21 Javascript
javascript正则表达式模糊匹配IP地址功能示例
2017/01/06 Javascript
vue项目中v-model父子组件通信的实现详解
2017/12/10 Javascript
Element InfiniteScroll无限滚动的具体使用方法
2020/07/27 Javascript
vue实现登录功能
2020/12/31 Vue.js
python3序列化与反序列化用法实例
2015/05/26 Python
Django数据库表反向生成实例解析
2018/02/06 Python
numpy中三维数组中加入元素后的位置详解
2019/11/28 Python
python pymysql库的常用操作
2020/10/16 Python
Numpy ndarray 多维数组对象的使用
2021/02/10 Python
俄罗斯GamePark游戏商店网站:购买游戏、游戏机和配件
2020/03/13 全球购物
公务员年总结的自我评价
2013/10/25 职场文书
劳资协议书范本
2014/04/23 职场文书
学生安全承诺书
2014/05/22 职场文书
社区文艺活动方案
2014/08/19 职场文书
统计工作个人总结
2015/03/03 职场文书
2015年公司工作总结
2015/04/25 职场文书
2015年节能减排工作总结
2015/05/14 职场文书
学生会2016感恩节活动小结
2016/04/01 职场文书
高中16字霸气押韵班级口号集锦!
2019/06/27 职场文书
vscode中使用npm安装babel的方法
2021/08/02 Javascript
Netty分布式客户端处理接入事件handle源码解析
2022/03/25 Java/Android