urllib库总结

开始复习爬虫,这里做了一个utllib和正则的小总结,了解一下就好
在Python中有很多库可以用来抓取网页,urllib就是其中的一个库,就是用来抓取网页的,
urllib有几个主要的模块------->request模块,它是urllib最基本的http请求模块,可以用来模拟发送请求,就像在浏览器中输入网址,然后敲击回车键一样,使用的时候只需要给库方法传入相关的URL和相关的参数即可.
error异常处理模块,如果出现请求错误,我们可以使用这个模块来捕获异常,然后进行重试或者其他操作,保证程序不会意外终止.
parse:这是一个工具模块,提供了许多url的处理方法,比如拆分,解析,合并等等.
我们使用urlopen方法发起请求获取响应结果,例: response=request.urlopen(url=url,timeout=20),它有四个主要参数
我们需要知道,如下所示:
url:设置目标url
data:如果设置该参数,则请求默认为post请求
timeout:用于设置超时时间,单位为秒
context:必须是一个ssl.SSLContext类型,用来指定SSL设置,忽略未认证的CA证书,
使用urlopen直接发送请求,获取一些反爬手段低的网站,有些网站会根据请求头来判断是否是浏览器访问,则需要增加HTTP报头,必须创建一个 Request 实例来作为urlopen()的参数;而需要访问的url地址则作为 Request 实例的参数,它也有几个重要的参数,如下所示,
url 参数是请求链接,这个是必传参数,其他的都是可选参数。
data(默认空) 参数跟 urlopen() 中的 data 参数用法相同。
headers(默认空) 是一个字典。它除了在 Request 中添加,还可以通过调用 Reques t实例的 add_header() 方法来添加请求头。
unverifiable 参数表示这个请求是否是无法验证的,默认值是False。意思就是说用户没有足够权限来选择接收这个请求的结果。例如我们请求一个HTML文档中的图片,但是我们没有自动抓取图像的权限,我们就要将 unverifiable 的值设置成 True。(这个参数我们不需要设置)
method 参数指的是发起的 HTTP 请求的方式
接下来就是异常处理模块了,我们在发送请求的过程中,如果网络环境不好,或者出现了其他问题,会出现请求异常,如果不处理这些异常,程序很可能会崩溃,所以我们需要处理请求异常问题,报错的话基本都是,URLError:来自urllib库的error模块,继承自OSError,由request模块产生的异常都可以通过捕捉这个类来处理,它具有一个属性reason,返回错误的原因,HTTPError,
HTTPError是URLError的子类,我们发出一个请求时,服务器上都会对应一个response应答对象,其中它包含一个数字"响应状态码"。
专门用来处理HTTP请求错误,比如未认证,页面不存在等
有三个属性:
code:返回HTTP的状态码
reason:返回错误原因
headers:返回请求头
这里使用顺序也有所不同,具体使用,因为HTTPError的父类是URLError,所以我们更好的处理顺序应该是先捕获子类的错误,再捕获父类的错误,
再有一个就是parse工具模块了,parse模块下常用的url解析、合并、编码、解码方法,在使用它的时候,我们需要用命令from urllib import parse来导入,接下来介绍它的方法的作用
1,urlencode()将字典构形式的参数序列化为url编码后的字符串
2,parse_qs()将url编码格式的参数反序列化为字典类型,和urlencode()方法相反
3,quote()可以将中文转换为URL编码格式
4,unquote:可以将URL编码进行解码,和quote()方法相反
5,urljoin()传递一个基础链接,根据基础链接可以将某一个不完整的链接拼接为一个完整链接
6,urlparse()实现URL的识别和分段(了解),了解下就行,还有就是urlunparse()可以实现URL的构造(了解),了解就行
此外就是urllib的get请求和post请求了, 首先是get请求,例如:

url = "http://www.baidu.com/s"
word = {"wd":"六一儿童节,可我还是单身"}
word = urllib.parse.urlencode(word) #转换成url编码格式(字符串)
newurl = url + "?" + word

headers={
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36"
}

request = urllib.request.Request(newurl, headers=headers)

response = urllib.request.urlopen(request)

html = response.read()

print (html)

POST请求,Request请求对象的里有data参数,它就是用在POST里的,我们要传送的数据就是这个参数data,data是一个字典,里面要匹配键值对,

from urllib import request,parse

url = 'https://httpbin.org/post'

form_data = {
    'className':'1808',
    'peopleNum':30,
    'names':['zhangsan','lisi','wangwu','zhaoliu']
}

#使用urlencode将上传的表单书数据转换为url编码格式(#className=1808&peopleNum=30.....),
#再将字符串转为bytes类型(使用encode)
b_form_data = parse.urlencode(form_data).encode('utf-8')
print(b_form_data)
#b'className=1808&names=%5B%27zhangsan%27%2C+%27lisi%27%2C+%27wangwu%27%2C+%27zhaoliu%27%5D&peopleNum=30'

response = request.urlopen(url=url,data=b_form_data)
print(response.status)
print(response.read().decode('utf-8'))

再说一个就是urllib的高级用法,设置代理,当我们频繁爬取某个网站的数据时,我们的ip可能会被封,这时候我们就需要用到代理,代理实际上指的就是代理服务器,它的功能是代理网络用户去取得网络信息,形象地说,它是网络信息的中转站,再简单一点说,即使进行ip伪装的,
说说它具体的几个作用吧

1.突破自身IP访问限制,访问一些平时不能访问的站点。
2.提高访问速度:通常代理服务器都设置一个较大的硬盘缓冲区,当有外界的信息通过时,同时也将其保存到缓冲区中,当其他用户再访问相同的信息时,则直接由缓冲区中取出信息,传给用户,以提高访问速度。
3.隐藏真实IP:上网者也可以通过这种方法隐藏自己的IP,免受攻击。对于爬虫来说,我们用代理就是为了隐藏自身IP,防止自身的IP被封锁。
我们可以自定义代理,也就叫Opener,我们需要使用ProxyHandler处理器用来设置代理,例如:

from urllib import request,error

#构建支持代理的handler
proxy = {
'http':'61.138.33.20:808',
'https':'120.69.82.110:44693',
}

# 构建一个私密代理Handler,需要加上私密代理账户的用户名和密码
# proxy = {
# "http" :"username:password@61.135.217.7:80"
#}

proxy_handler = request.ProxyHandler(
proxies=proxy
)

#根据proxy_handler实例化一个opener对象
opener = request.build_opener(proxy_handler)

# 使用https://httpbin.org/get接口验证使用了代理
# url = 'https://httpbin.org/get'

try:
response = opener.open(url,timeout=5)
# 将自定义的opener设置为全局的opener,之后使用urlopen() 发送请求,都将使用自定义opener对象。
# request.install_opener(opener)
# response = urlopen(request)
print(response.status)
except error.HTTPError as err:
print(err.reason)
except error.URLError as err:
print(err.reason)

还有就是urllib用来设置cookie了,cookie用来做状态保持的,我们获取cookie就需要用到cookiejar库,该模块主要的对象有CookieJar、FileCookieJar、MozillaCookieJar、LWPCookieJar。其实大多数情况下,我们只用CookieJar(),如果需要和本地文件交互,就用 MozillaCookjar()
注重介绍下这个库,CookieJar:管理HTTP cookie值、存储HTTP请求生成的cookie、向传出的HTTP请求添加cookie的对象。整个cookie都存储在内存中,对CookieJar实例进行垃圾回收后cookie也将丢失。
MozillaCookieJar (filename,delayload=None,policy=None):从FileCookieJar派生而来,创建与Mozilla浏览器 cookies.txt兼容的FileCookieJar实例。
具体内容看代码:

#快代理登录
from urllib import request,parse,error
from http import cookiejar
import ssl,urllib

def kdl_login(url,data):

# 构建一个CookieJar对象实例来保存cookie
cookie_jar = cookiejar.CookieJar()

# 使用HTTPCookieProcessor()来创建cookie处理器对象,参数为CookieJar()对象
# handler = request.
handler = urllib.request.HTTPCookieProcessor(cookie_jar)

ssl_context = ssl._create_unverified_context()

https_hancler = urllib.request.HTTPSHandler(context=ssl_context)

# 通过 build_opener() 来构建opener
opener = urllib.request.build_opener(handler,https_hancler)

headers = {
'User-Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.157 Safari/537.36',
}

response = opener.open(url)

print(response.headers)

print({cookie.name:cookie.value for cookie in cookie_jar})

#####上半部分代码是为了获取登录需要的cookie信息##################

#####下半部分代码是为了获取登录需要的cookie信息##################

data = parse.urlencode(data).encode('utf-8')
print('======',data)

req = request.Request(url=url,data=data,headers=headers,method='POST')
try:
response = opener.open(req)
if response.status == 200:
html = response.read().decode('utf-8')
if '2295808193' in html:
print('登录成功')
print({cookie.name: cookie.value for cookie in cookie_jar})
with open('person.html','w') as file:
file.write(html)

except error.HTTPError as err:
print(err.reason)

except error.URLError as err:
print(err.reason)


if __name__ == '__main__':

data = {
'next':'',
'kf5_return_to':'',
'username': '18518753265',
'passwd': 'ljh123456',
}

url = 'https://www.kuaidaili.com/login/'

kdl_login(url,data)
基本的urllib库使用就是这些
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值