urllib库
python提供操作url的模块
版本
python2
- urllib
- urllib2
python3
- urllib
- urllib3
- requets模块依赖
urllib.request
urllib.request.urlopen()
linux中网络请求命令
- curl
- wget
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库配置
-
创建一个CookieJar对象
from http.cookiejar import CookieJar
cookie = cookiejar.CookieJar()
- 存储服务器返回的Cookie信息的
-
使用cookiejar对象,创建一个handler对象
handler = urllib.request.HTTPCookieProcessor(cookie)
-
使用handler创建一个opener
opener = urllib.request.build_opener(handler)
-
通过opener登录
-
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
代理的常用功能
-
突破自身IP访问限制,访问国外站点。
-
访问一些单位或团体内部资源
- 某大学FTP(前提是该代理地址在该资源 的允许访问范围之内),使用教育网内地址段免费代理服务器,就可以用于对教育网开放的各类FTP下载上传,以及各类资料查询共享等服务。
-
提高访问速度
- 通常代理服务器都设置一个较大的硬盘缓冲区,当有外界的信息通过时,同时也将其保存到缓冲区中,当其他用户再访问相同的信息时, 则直接由缓冲区中取出信息,传给用户,以提高访问速度。
-
隐藏真实IP
- 上网者也可以通过这种方法隐藏自己的IP,免受攻击。
本地浏览器代理配置
代码配置代理
-
创建Reuqest对象
-
创建ProxyHandler对象
-
handler = urllib.request.ProxyHandler(proxies={'http':'114.212.80.2:3128'})
-
-
用handler对象创建opener对象
-
使用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())