【移动应用开发技术】Python爬虫中urllib3与urllib的区别有哪些_第1页
【移动应用开发技术】Python爬虫中urllib3与urllib的区别有哪些_第2页
【移动应用开发技术】Python爬虫中urllib3与urllib的区别有哪些_第3页
【移动应用开发技术】Python爬虫中urllib3与urllib的区别有哪些_第4页
【移动应用开发技术】Python爬虫中urllib3与urllib的区别有哪些_第5页
已阅读5页,还剩6页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

【移动应用开发技术】Python爬虫中urllib3与urllib的区别有哪些

这篇文章主要介绍“Python爬虫中urllib3与urllib的区别有哪些”,在日常操作中,相信很多人在Python爬虫中urllib3与urllib的区别有哪些问题上存在疑惑,在下查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Python爬虫中urllib3与urllib的区别有哪些”的疑惑有所帮助!接下来,请跟着在下一起来学习吧!urllib是一个用来处理网络请求的python标准库,它包含4个模块。urllib.request请求模块,用于发起网络请求urllib.parse解析模块,用于解析URLurllib.error异常处理模块,用于处理request引起的异常urllib.robotparserrobots.tx用于解析robots.txt文件urllib.request模块request模块主要负责构造和发起网络请求,并在其中添加Headers,Proxy等。利用它可以模拟浏览器的请求发起过程。发起网络请求操作cookie添加Headers使用代理关于urllib.request.urlopen参数的介绍urllib.request.urlopen(url,data=None,[timeout,]*,cafile=None,capath=None,cadefault=False,context=None)urlopen是一个简单发送网络请求的方法。它接收一个字符串格式的url,它会向传入的url发送网络请求,然后返回结果。先写一个简单的例子:from

urllib

import

request

response

=

request.urlopen(url="/get")

print(response.read().decode())urlopen默认会发送get请求,当传入data参数时,则会发起POST请求。data参数是字节类型、者类文件对象或可迭代对象。from

urllib

import

request

response

=

request.urlopen(url="/post",

data=b"username=q123&password=123")

print(response.read().decode())还才可以设置超时,如果请求超过设置时间,则抛出异常。timeout没有指定则用系统默认设置,timeout只对,http,https以及ftp连接起作用。它以秒为单位,比如可以设置timeout=0.1超时时间为0.1秒。from

urllib

import

request

response

=

request.urlopen(url="/",timeout=0.1)Request对象利用openurl可以发起最基本的请求,但这几个简单的参数不足以构建一个完整的请求,可以利用更强大的Request对象来构建更加完整的请求。1.请求头添加通过urllib发送的请求会有一个默认的Headers:“User-Agent”:“Python-urllib/3.6”,指明请求是由urllib发送的。所以遇到一些验证User-Agent的网站时,需要我们自定义Headers把自己伪装起来。from

urllib

import

request

headers

={

"Referer":

"/s?ie=utf-8&f=3&rsv_bp=1&tn=baidu&wd=python%20urllib%E5%BA%93&oq=python%2520urllib%25E5%25BA%2593&rsv_pq=947af0af001c94d0&rsv_t=66135egC273yN5Uj589q%2FvA844PvH9087sbPe9ZJsjA8JA10Z2b3%2BtWMpwo&rqlang=cn&rsv_enter=0&prefixsug=python%2520urllib%25E5%25BA%2593&rsp=0",

"User-Agent":

"Mozilla/5.0

(Windows

NT

10.0;

Win64;

x64)

AppleWebKit/537.36

(KHTML,

like

Gecko)

Chrome/72.0.3626.121

Safari/537.36"

}

response

=

request.Request(url="/",headers=headers)

response

=

request.urlopen(response)

print(response.read().decode())2.操作cookie在开发爬虫过程中,对cookie的处理非常重要,urllib的cookie的处理如下案例from

urllib

import

request

from

http

import

cookiejar

#

创建一个cookie对象

cookie

=

cookiejar.CookieJar()

#

创一个cookie处理器

cookies

=

request.HTTPCookieProcessor(cookie)

#

以它为参数,创建opener对象

opener

=

request.build_opener(cookies)

#

使用这个opener

来发请求

res

=opener.open("/")

print(cookies.cookiejar)3.设置代理运行爬虫的时候,经常会出现被封IP的情况,这时我们就需要使用ip代理来处理,urllib的IP代理的设置如下:from

urllib

import

request

url

="/ip"

#代理地址

proxy

={"http":":3128"}

#

代理处理器

proxies

=request.ProxyBasicAuthHandler(proxy)

#

创建opener对象

opener

=

request.build_opener(proxies)

res

=opener.open(url)

print(res.read().decode())urlib库中的类或或者方法,在发送网络请求后,都会返回一个urllib.response的对象。它包含了请求回来的数据结果。它包含了一些属性和方法,供我们处理返回的结果read()获取响应返回的数据,只能用一次readline()读取一行info()获取响应头信息geturl()获取访问的urlgetcode()返回状态码urllib.parse模块parse.urlencode()在发送请求的时候,往往会需要传递很多的参数,如果用字符串方法去拼接会比较麻烦,parse.urlencode()方法就是用来拼接url参数的。from

urllib

import

parse

params

=

{"wd":"测试",

"code":1,

"height":188}

res

=

parse.urlencode(params)

print(res)打印结果为wd=%E6%B5%8B%E8%AF%95&code=1&height=188也可以通过parse.parse_qs()方法将它转回字典print(parse.parse_qs("wd=%E6%B5%8B%E8%AF%95&code=1&height=188"))urllib.error模块error模块主要负责处理异常,如果请求出现错误,我们可以用error模块进行处理主要包含URLError和HTTPErrorURLError:是error异常模块的基类,由request模块产生的异常都可以用这个类来处理HTTPError:是URLError的子类,主要包含三个属性Code:请求的状态码reason:错误的原因headers:响应的报头from

urllib

import

request,error

try:

response

=

request.urlopen("/1111.html")

except

error.HTTPError

as

e:

print(e.reason)

print(e.code)

print(e.headers)

except

error.URLError

as

e:

print(e.reason)

else:

print("reqeust

successfully")urllib.robotparse模块

robotparse模块主要负责处理爬虫协议文件,robots.txt.的解析。Robots协议(也称为爬虫协议、机器人协议等)的全称是“网络爬虫排除标准”(RobotsExclusionProtocol),网站通过Robots协议告诉搜索引擎哪些页面可以抓取,哪些页面不能抓取urllib3是比urllib库更强大的存在,目前已经有许多的原生系统已经开始使用urllib3。urllib3具有如下优点:支持HTTP和SOCKS代理支持压缩编码100%测试覆盖率具有链接池线程安全客户端SLL/TLS验证协助处理重复请求和HTTP重定位使用multipart编码上传文件因为urllib3并不是Python的标准库,所以我们使用之前,需要进行下载安装,具体命令如下所示:pip

install

urllib3

#或

conda

install

urllib3下面,我们来讲解urllib3库的使用方式。网络请求GET请求首先,在我们使用urllib3库进行网络请求时,需创建PoolManager类的实例,该类用于管理线程池。下面,我们来通过urllib访问百度,并返回查询的结果,示例如下:import

urllib3

http

=

urllib3.PoolManager()

url

=

"/s"

headers

=

{

"User-Agent":

"Mozilla/5.0

(Windows

NT

10.0;

Win64;

x64)

AppleWebKit/537.36

(KHTML,

like

Gecko)

Chrome/91.0.4472.124

Safari/537.36"

}

response

=

http.request("GET",

url,

fields={"wd":

"机器学习"},

headers=headers)

result

=

response.data.decode("UTF-8")

print(result)运行之后,效果如下:这里,我们通过fields参数指定GET的请求字段。不过,这里先一步讲解了请求头,其实是百度有安全机制,读者可以去掉headers参数试试。会返回百度的安全验证页面。POST请求如果需要向服务器提交表单或者比较复杂的数据,就需要使用到POST请求。POST请求比较简单,仅仅只是将请求的第一个参数改为“POST”即可。示例如下:import

urllib3

http

=

urllib3.PoolManager()

url

=

"/post"

headers

=

{

"User-Agent":

"Mozilla/5.0

(Windows

NT

10.0;

Win64;

x64)

AppleWebKit/537.36

(KHTML,

like

Gecko)

Chrome/91.0.4472.124

Safari/537.36"

}

response

=

http.request("POST",

url,

fields={"username":

"name",

"age":

"123456"},

headers=headers)

result

=

response.data.decode("UTF-8")

print(result)运行之后,返回如下数据:HTTP响应头使用urllib3库进行网络访问时,其返回的HTTPResponse。默认有一些携带的参数,其中就包括info方法。它能返回响应头数据,示例如下:import

urllib3

http

=

urllib3.PoolManager()

url

=

"/s"

headers

=

{

"User-Agent":

"Mozilla/5.0

(Windows

NT

10.0;

Win64;

x64)

AppleWebKit/537.36

(KHTML,

like

Gecko)

Chrome/91.0.4472.124

Safari/537.36"

}

response

=

http.request("POST",

url,

fields={"wd":

"机器学习"},

headers=headers)

for

key

in

().keys():

print("key:",()[key])运行之后,返回的响应数据如下:上传文件首先,我们需要简单的实现一个文件上传的服务器代码,这里我们使用Flask搭建一个简单的服务器Python程序,代码如下:import

flask

import

os

UPLOAD_FILE

=

"uploads"

app

=

flask.Flask(__name__)

@app.route("/",

methods=["POST"])

def

upload_file():

file

=

flask.request.files["file"]

if

file:

file.save(os.path.join(UPLOAD_FILE,

os.path.basename(file.filename)))

return

"文件上传成功"

else:

return

"文件上传失败"

if

__name__

==

"__main__":

app.run()运行之后,它会一直等待客户端上传文件。这个时候,我们再来实现urllib3是如何上传文件的,示例如下:import

urllib3

http

=

urllib3.PoolManager()

with

open("1.jpg",

"rb")

as

f:

fileData

=

f.read()

url

=

":5000"

response

=

http.request("POST",

url,

fields={"file":

("1.jpg",

fileData,

"image/jpeg")})

print(response.data.decode("UTF-8"))默认flask搭建的服务器,其接口为5000,也就是通过:5000进行访问。运行之后,就会在uploads文件夹下创建一个1.jpg的图片。同时,控制台会输出文件上传成功,而服务器会返回状态码200。这里,上传文件就1一个键值对,其中file代表服务器上传文件的字段。值的元组里,fileData为文件的二进制形式,"image/jpeg"代表上传文件的格式(可以省略)。超时处理urllib3库其HTTP的底层

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论