02 urllib库的使用

2019-08-05  本文已影响0人  yungege

02 urllib库的使用

一、urllib库

1、概念

urllib 是一个用来处理网络请求的python标准库,它包含4个模块。
urllib.requests:请求模块,用于发起网络请求
urllib.parse:解析模块,用于解析URL
urllib.error:异常处理模块,用于处理request引起的异常
urllib.robotparse:用于解析robots.txt文件

2、urllib.request模块

request模块主要负责构造和发起网络请求,并在其中添加Headers,Proxy等。
利用它可以模拟浏览器的请求发起过程。
发起网络请求
添加Headers
操作cookie
使用代理

1)urlopen方法

urllib.request.urlopen(url, data=None, [timeout, ]*, cafile=None, capath=None, cadefault=False, context=None)
urlopen是一个简单发送网络请求的方法。它接收一个字符串格式的url,它会向传入的url发送网络请求,然后返回结果。

import urllib.request

response = urllib.request.urlopen(url="http://httpbin.org/get")
print(response) #<http.client.HTTPResponse object at 0x02BB7690>
print(response.read().decode())

# {
#   "args": {},
#   "headers": {
#     "Accept-Encoding": "identity",
#     "Connection": "close",
#     "Host": "httpbin.org",
#     "User-Agent": "Python-urllib/3.6"
#   },
#   "origin": "183.40.34.81",
#   "url": "http://httpbin.org/get"
# }

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

response = urllib.request.urlopen(url="http://httpbin.org/post",data=b"user=user&password=password")
print(response) #<http.client.HTTPResponse object at 0x02BB7690>
print(response.read().decode())
# {
#   "args": {},
#   "data": "",
#   "files": {},
#   "form": {
#     "password": "password",
#     "user": "user"
#   },
#   "headers": {
#     "Accept-Encoding": "identity",
#     "Connection": "close",
#     "Content-Length": "27",
#     "Content-Type": "application/x-www-form-urlencoded",
#     "Host": "httpbin.org",
#     "User-Agent": "Python-urllib/3.6"
#   },
#   "json": null,
#   "origin": "183.40.34.81",
#   "url": "http://httpbin.org/post"
# }

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

response = urllib.request.urlopen(url="http://httpbin.org/post",timeout=0.5)

2)Request对象

import urllib.request

req = urllib.request.Request("http://ww.baidu.com")
response = urllib.request.urlopen(req)
print(response)

1.请求头添加
通过urllib发送的请求会有一个默认的Headers: “User-Agent”:“Python-urllib/3.6”,指明请求是由urllib发送的。所以遇到一些验证User-Agent的网站时,需要我们自定义Headers把自己伪装起来。

url = "http://ww.baidu.com"
headers ={
"User-Agent": "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36"
}
req = urllib.request.Request(url=url,headers=headers)
response = urllib.request.urlopen(req)
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("http://www.baidu.com")

print(res.read().decode())
print(cookies.cookiejar)

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

from urllib import request

# url
url = 'http://httpbin.org/ip'

# 代理地址
proxy = {
    "http":"1.199.31.22"
}

# 代理处理器
proxies = request.ProxyHandler(proxy)

#创建opener对象
opener = request.build_opener(proxies)

res = opener.open(url)

3)Response对象

urlib库中的类或或者方法,在发送网络请求后,都会返回一个urllib.response的对象。它包含了请求回来的数据结果。它包含了一些属性和方法,供我们处理返回的结果
1、read() 获取响应返回的数据,只能用一次
2、readline() 读取一行
3、info() 获取响应头信息
4、geturl() 获取访问的url
5、getcode() 返回状态码

3、urllib.parse模块

parse模块是一个工具模块,提供了需要对url处理的方法,用于解析url。
parse.quote()
url中只能包含ascii字符,在实际操作过程中,get请求通过url传递的参数中会有大量的特殊字符,例如汉字,那么就需要进行url编码。

例如https://baike.baidu.com/item/URL编码/3703727?fr=aladdin

我们需要将编码进行url编码

利用parse.unquote()可以反编码回来

from urllib import parse

url = "https://www.baidu.com/s?wd={}"
safe_url = url.format(parse.quote("快代理"))
print(safe_url) #https://www.baidu.com/s?wd=%E5%BF%AB%E4%BB%A3%E7%90%86
print(parse.unquote(safe_url))  #https://www.baidu.com/s?wd=快代理

parse.urlencode()
在发送请求的时候,往往会需要传递很多的参数,如果用字符串方法去拼接会比较麻烦,parse.urlencode()方法就是用来拼接url参数的。
也可以通过parse.parse_qs()方法将它转回字典

params = {"wd":"测试","code":1,"height":"188"}
res = parse.urlencode(params)
print(res)  # wd=%E6%B5%8B%E8%AF%95&code=1&height=188
print(parse.parse_qs("wd=%E6%B5%8B%E8%AF%95&code=1&height=188"))
# {'wd': ['测试'], 'code': ['1'], 'height': ['188']}

4、urllib.error模块

error模块主要负责处理异常,如果请求出现错误,我们可以用error模块进行处理
主要包含URLError和HTTPError

URLError:是error异常模块的基类,由request模块产生的异常都可以用这个类来处理
HTTPError:是URLError的子类,主要包含三个属性:Code:请求的状态码;reason:错误的原因;headers:响应的报头

5、urllib.robotparse模块

robotparse模块主要负责处理爬虫协议文件,robots.txt.的解析。

https://www.taobao.com/robots.txt

Robots协议(也称为爬虫协议、机器人协议等)的全称是“网络爬虫排除标准”(Robots Exclusion Protocol),网站通过Robots协议告诉搜索引擎哪些页面可以抓取,哪些页面不能抓取。

robots.txt文件是一个文本文件,使用任何一个常见的文本编辑器,比如Windows系统自带的Notepad,就可以创建和编辑它 [1] 。robots.txt是一个协议,而不是一个命令。robots.txt是搜索引擎中访问网站的时候要查看的第一个文件。robots.txt文件告诉蜘蛛程序在服务器上什么文件是可以被查看的。

二、urllib3库

urllib3 是一个基于python3的功能强大,友好的http客户端。越来越多的python应用开始采用urllib3.它提供了很多python标准库里没有的重要功能 P

1、PoolManager对象

import urllib3

# 实例化一个PoolManager对象
http = urllib3.PoolManager()

url = "http://httpbin.org/get"
fields = {'user':'12345','password':123456789}
headers ={"User-Agent": "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36"}
# 用request()发送一个请求
r=http.request('GET',url=url,fields=fields,headers=headers)
print(r.status)
print(r.data.decode())
print(r.headers)

2、ProxyManager对象

import urllib3

proxy = urllib3.ProxyManager("http://182.44.224.167")

res = proxy.request('GET','http://httpbin.org/get')
print(res.data.decode())

3、Request data

get,head,delete请求,可以通过提供字典类型的参数fields来添加查询参数。

02.jpg

对于post和put请求,如果需要查询参数,需要通过url编码将参数编码成正确格式然后拼接到url中

03.jpg

对于put和post请求,需要提供字典类型的参数field来传递form表单数据。

04.jpg

当我们需要发送json数据时,我们需要在request中传入编码后的二进制数据类型的body参数,并制定Content-Type的请求头

05.jpg

对于文件上传,我们可以模仿浏览器表单的方式

06.jpg

对于二进制的数据上传,我们用指定body的方式,并设置Content-Type的请求头

07.jpg

三、爬虫开发的一般流程

找到目标数据
分析请求流程
构造http请求
提取清洗数据
数据持久化

上一篇 下一篇

猜你喜欢

热点阅读