网络请求库urllib

urllib库

python提供操作url的模块

版本

python2

  • urllib
  • urllib2

python3

  • urllib
  • urllib3
    • requets模块依赖

urllib.request

urllib.request.urlopen()

linux中网络请求命令
urlopen()

urlopen()返回一个response对象

response: http.client.HTTPResponse

HttpClient :发起Http连接请求的对象。
HTTPResponse :Http 请求返回的响应。

geturl()

请求的url

read()

读取的是二进制数据,需要进行转码

解码decode

字节–>字符串

编码encode

字符串–>字节

readline()

读取当前行的数据-文本

readlines()

读取所有行数据-文本

code/getcode()/status

响应码

headers/getheaders()/info()

响应头

urllib.request.urlretrieve(url=,filename=)

读取内容,直接保存到本地

  • 请求网页
  • 请求图片
  • 请求视频

urllib.parse

urllib.parse.urlencode()

把字典对象解析成url可识别的参数字符串

url = 'https://www.baidu.com/s?'

data = {

	'wd':'美女'

}

source = urllib.parse.urlencode(data)

url = url+source

print(url)

urllib.parse.quote()

url编码

url编码中只能出现-_.a~z

如果有中文需要进行编码

url在线编码工具

http://tool.oschina.net/encode?type=4

url = urllib.pares.quote('http://www.baidu.com/user=语言&pass=123')

urllib.parse.unquote()

url解码

URLError\HTTPError

"""
HTTPError类是URLError类的子类

urllib.error.HTTPError

http错误:http错误是针对浏览器无法连接到服务器而增加出来的错误提示。引导并告诉浏览者该页是哪里出了问题。
"""
import urllib

	request = urllib.request.Request("http://hao123.com")

try:

	urllib.request.urlopen(request)

except urllib.error.URLError as e:

	print (e.reason)

捕获异常

try
except   

HTTP状态码

10x
  • 100:继续 客户端应当继续发送请求。客户端应当继续发送请求的剩余部分,或者如果请求已经完成,忽略这个响应。
  • 101: 转换协议 在发送完这个响应最后的空行后,服务器将会切换到在Upgrade 消息头中定义的那些协议。只有在切换新的协议更有好处的时候才应该采取类似措施。
  • 102:继续处理 由WebDAV(RFC 2518)扩展的状态码,代表处理将被继续执行。
20x
  • 200:请求成功 处理方式:获得响应的内容,进行处理
  • 201:请求完成,结果是创建了新资源。新创建资源的URI可在响应的实体中得到 处理方式:爬虫中不会遇到
  • 202:请求被接受,但处理尚未完成 处理方式:阻塞等待
  • 204:服务器端已经实现了请求,但是没有返回新的信 息。如果客户是用户代理,则无须为此更新自身的文档视图。 处理方式:丢弃
30x
  • 300:该状态码不被HTTP/1.0的应用程序直接使用, 只是作为3XX类型回应的默认解释。存在多个可用的被请求资源。 处理方式:若程序中能够处理,则进行进一步处理,如果程序中不能处理,则丢弃
  • 301:请求到的资源都会分配一个永久的URL,这样就可以在将来通过该URL来访问此资源 处理方式:重定向到分配的URL
  • 302:请求到的资源在一个不同的URL处临时保存 处理方式:重定向到临时的URL
  • 304:请求的资源未更新 处理方式:丢弃
40x
  • 400:非法请求 处理方式:丢弃
  • 401:未授权 处理方式:丢弃
  • 403:禁止 处理方式:丢弃
  • 404:没有找到 处理方式:丢弃
50x
  • 500:服务器内部错误 服务器遇到了一个未曾预料的状况,导致了它无法完成对请求的处理。一般来说,这个问题都会在服务器端的源代码出现错误时出现。
  • 501:服务器无法识别 服务器不支持当前请求所需要的某个功能。当服务器无法识别请求的方法,并且无法支持其对任何资源的请求。
  • 502:错误网关 作为网关或者代理工作的服务器尝试执行请求时,从上游服务器接收到无效的响应。
  • 503:服务出错 由于临时的服务器维护或者过载,服务器当前无法处理请求。这个状况是临时的,并且将在一段时间以后恢复。

扩展

解决SSL问题

  • 导入ssl包

    • import ssl
      
  • 请求前设置https上下文

    • ssl._create_default_https_context = ssl._create_unverified_context
      

Handler处理器

urllib.request.urlopen()
  • 不能定制请求头
urllib.request.Request
  • 可以定制请求头
  • Request(url, data, headers)
Handler
定制更高级的请求头
步骤

创建Handler对象

  • handler = urllib.request.HTTPHandler()

创建opener对象

  • opener= urllib.request.build_opener(handler)

创建Request对象

  • request = urllib.request.Request(url=url,headers=headers)

发送Request请求

  • opener.open(req)
request对象不能携带cookie,也不能使用代理,所以引入了Handler处理器、自定义Opener

import urllib.request

import urllib.parse

url = 'http://www.baidu.com/'

headers = {

	'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.162 Safari/537.36'

}

# 构建handler对象

handler = urllib.request.HTTPHandler()

# 构建opener对象

opener = urllib.request.build_opener(handler)

# 构建request对象

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

response = opener.open(request)

print(response.read().decode('utf-8'))

cookie库

cookie库能干啥??

自动帮我们保存登陆的cookie信息

cookie库配置

  1. 创建一个CookieJar对象
    • from http.cookiejar import CookieJar
    • cookie = cookiejar.CookieJar()
      • 存储服务器返回的Cookie信息的
  2. 使用cookiejar对象,创建一个handler对象

    • handler = urllib.request.HTTPCookieProcessor(cookie)
  3. 使用handler创建一个opener

    • opener = urllib.request.build_opener(handler)
  4. 通过opener登录

  5. handler会自动的保存登录之后的cookie

import urllib.request
import http.cookiejar as cookiejar

post_url = 'http://www.renren.com/ajaxLogin/login?1=1&uniqueTimestamp=20182122180'

data = {
	'rkey':'1c7df63368df7ce73c234de26178ec11',
	'password':'19870115',
	'origURL':'http://www.renren.com/home',
	'key_id':'1',
	'icode':'',
	'f':'http://www.renren.com/224549540',
	'email':'dqsygcz@126.com',
	'domain':'renren.com',
	'captcha_type':'web_login',
}

headers = {
	'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.162 Safari/537.36',
	'Referer': 'http://www.renren.com/SysHome.do'
}


# 转换字节
data = urllib.parse.urlencode(data).encode('utf-8')
# 定制请求对象
request = urllib.request.Request(url=post_url,headers=headers,data=data)
# 创建cookie对象
cookie = cookiejar.CookieJar()
# 创建handler对象
handler = urllib.request.HTTPCookieProcessor(cookie)
# 创建opener对象
opener = urllib.request.build_opener(handler)
# 使用opener对象发送请求
response = opener.open(request)
print(response.getcode())

get_url = 'http://www.renren.com/224549540/profile'
headers1 = {
	'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.162 Safari/537.36',
	'Referer': 'http://matter.renren.com/'
}

request = urllib.request.Request(url=get_url,headers=headers1)
response1 = urllib.request.urlopen(request)
print(response1.read().decode('utf-8'))

代理服务器

什么是代理服务器

https://www.xicidaili.com/nn

代理服务器_百度百科 (baidu.com)

代理的常用功能

  • 突破自身IP访问限制,访问国外站点。

  • 访问一些单位或团体内部资源

    • 某大学FTP(前提是该代理地址在该资源 的允许访问范围之内),使用教育网内地址段免费代理服务器,就可以用于对教育网开放的各类FTP下载上传,以及各类资料查询共享等服务。
  • 提高访问速度

    • 通常代理服务器都设置一个较大的硬盘缓冲区,当有外界的信息通过时,同时也将其保存到缓冲区中,当其他用户再访问相同的信息时, 则直接由缓冲区中取出信息,传给用户,以提高访问速度。
  • 隐藏真实IP

    • 上网者也可以通过这种方法隐藏自己的IP,免受攻击。

本地浏览器代理配置

代码配置代理

  1. 创建Reuqest对象

  2. 创建ProxyHandler对象

    • handler = urllib.request.ProxyHandler(proxies={'http':'114.212.80.2:3128'})
      
  3. 用handler对象创建opener对象

  4. 使用opener.open函数发送请求

# 创建代理handler对象

handler = urllib.request.ProxyHandler(proxies={'http':'114.212.80.2:3128'})

# 创建opener 

opener = urllib.request.build_opener(handler)

# opener.open 替代 urllib.request.urlopen

response = opener.open(request)

with open('ipp.html','wb') as fp:

	fp.write(response.read())
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值