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包的五个简单准则简介
Jun 15 Python
详解Python编程中基本的数学计算使用
Feb 04 Python
python3使用scrapy生成csv文件代码示例
Dec 28 Python
浅谈Python黑帽子取代netcat
Feb 10 Python
Python3导入CSV文件的实例(跟Python2有些许的不同)
Jun 22 Python
python 通过 socket 发送文件的实例代码
Aug 14 Python
python3使用QQ邮箱发送邮件
May 20 Python
python使用Paramiko模块实现远程文件拷贝
Apr 30 Python
python TF-IDF算法实现文本关键词提取
May 29 Python
Django的CVB实例详解
Feb 10 Python
利用PyQt中的QThread类实现多线程
Feb 18 Python
python搜索算法原理及实例讲解
Nov 18 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学习资源和链接.
2006/12/05 PHP
PHP查询数据库中满足条件的记录条数(两种实现方法)
2013/01/29 PHP
yii实现CheckBox复选框在同一行显示的方法
2014/12/03 PHP
Apache连接PHP后无法启动问题解决思路
2015/06/18 PHP
基于php实现七牛抓取远程图片
2015/12/01 PHP
php实现小程序支付完整版
2018/10/09 PHP
使用js获取QueryString的方法小结
2010/02/28 Javascript
JS 事件绑定函数代码
2010/04/28 Javascript
jquery $("#variable") 循环改变variable的值示例
2014/02/23 Javascript
javascript实现英文首字母大写
2015/04/23 Javascript
AngularJS中的Promise详细介绍及实例代码
2016/12/13 Javascript
Jquery Easyui对话框组件Dialog使用详解(14)
2016/12/19 Javascript
js中Number数字数值运算后值不对的解决方法
2017/02/28 Javascript
jQuery pager.js 插件动态分页功能实例分析
2019/08/02 jQuery
python验证码识别的实例详解
2016/09/09 Python
python 读文件,然后转化为矩阵的实例
2018/04/23 Python
Python实现手写一个类似django的web框架示例
2018/07/20 Python
python Web开发你要理解的WSGI & uwsgi详解
2018/08/01 Python
Python小白必备的8个最常用的内置函数(推荐)
2019/04/03 Python
Python当中的array数组对象实例详解
2019/06/12 Python
python3.6、opencv安装环境搭建过程(图文教程)
2019/11/05 Python
Python GUI自动化实现绕过验证码登录
2020/01/10 Python
Python实现结构体代码实例
2020/02/10 Python
详解用Python进行时间序列预测的7种方法
2020/03/13 Python
英国马莎百货官网:Marks & Spencer
2016/07/29 全球购物
中学生学习生活的自我评价
2013/10/26 职场文书
《找不到快乐的波斯猫》教学反思
2014/02/24 职场文书
承诺书模板
2014/08/30 职场文书
大学新生军训自我鉴定范文
2014/09/13 职场文书
个人对照检查剖析材料
2014/10/13 职场文书
2014年街道办事处工作总结
2014/12/11 职场文书
小学生勤俭节约倡议书
2015/04/29 职场文书
React Hook用法示例详解(6个常见hook)
2021/04/28 Javascript
Python还能这么玩之用Python做个小游戏的外挂
2021/06/04 Python
Go语言读取txt文档的操作方法
2022/01/22 Golang
CSS文本阴影 text-shadow 悬停效果详解
2022/05/25 HTML / CSS