爬虫-urllib模块的使用
2021-03-03 08:27
标签:def sci 直接 网站 形式 realm python3 读取文件 error urllib是Python中请求url连接的官方标准库,在Python3中将Python2中的urllib和urllib2整合成了urllib。urllib中一共有四个模块,分别如下: 默认的访问方式是GET,当在urlopen()方法中传入data参数时,则会发起POST请求。注意:传递的data数据需要为bytes格式 如果代理需要授权验证,简单的方式是只需要在ProxyHandler传入的参数字典中,将值改为‘用户名:密码@ip:端口号‘这种形式,比如{"http":"myname:mypasswd@124.88.67.81:80"},复杂一点的需要创建一个密码管理对象,下面会有介绍。 注:通常用户名和密码不直接写在程序中,而是存放在环境变量,或者单独写入一个模块,然后从模块导入 CookieJar:管理HTTP cookie值、存储HTTP请求生成的cookie、向传出的HTTP请求添加cookie的对象。整个cookie都存储在内存中,对CookieJar实例进行垃圾回收后cookie也将丢失。 FileCookieJar (filename,delayload=None,policy=None):从CookieJar派生而来,用来创建FileCookieJar实例,检索cookie信息并将cookie存储到文件中。filename是存储cookie的文件名。delayload为True时支持延迟访问访问文件,即只有在需要时才读取文件或在文件中存储数据。 MozillaCookieJar (filename,delayload=None,policy=None):从FileCookieJar派生而来,创建与 LWPCookieJar (filename,delayload=None,policy=None):从FileCookieJar派生而来,创建与 data参数需要用urllib.parse模块对其进行数据格式处理。 爬虫-urllib模块的使用 标签:def sci 直接 网站 形式 realm python3 读取文件 error 原文地址:https://www.cnblogs.com/Elite-Wang/p/14278731.html
一、request模块
1.urlopen()方法:
发送简单的GET请求
from urllib.request import urlopen
#向指定的url发送请求,并返回服务器响应的类文件对象
resp = urlopen(‘https://www.baidu.com‘)
print(resp.read().decode())
发送简单的POST请求(data参数)
from urllib.reuqest import urlopen
from urllib.parse import urlencode
#将字典类型的数据转换成表单类型的数据格式,如"world=hello"
data = urlencode({"word":"hello"}).encode()
response = request.urlopen(‘http://httpbin.org/post‘, data=data)
print(response.read().decode())
2.Request
from urllib.request import Request,urlopen
url = ‘https://www.baidu.com/‘
ua_header = {"User-Agent" : "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0;"}
#url连同headers一起构造request请求,这个请求附带IE 9.0浏览器的User-Agent
request = Request(url,headers=ua_header)
#向服务器发送请求
resp = urlopen(request)
print(resp.read().decode)
3.ProxyHandler处理器(代理IP)
from urllib.request import build_opener,urlopen(),install_opener,Request,ProxyHandler
# 构建了两个代理Handler,一个有代理IP,一个没有代理IP
httpproxy_handler = urllib2.ProxyHandler({‘http‘: ‘218.18.232.26:80‘, ‘https‘: ‘218.18.232.26:80‘})
nullproxy_handler = urllib2.ProxyHandler({})
proxySwitch = True #定义一个代理开关
# 通过build_opener()方法使用这些代理Handler对象,创建自定义opener对象
# 根据代理开关是否打开,使用不同的代理模式
if proxySwitch:
opener = build_opener(httpproxy_handler)
else:
opener = build_opener(nullproxy_handler)
request = Request("http://www.baidu.com/")
# 1. 如果这么写,只有使用opener.open()方法发送请求才使用自定义的代理,而urlopen()则不使用自定义代理。
resp = opener.open(request)
# 2. 如果这么写,就是将opener应用到全局,之后所有的,不管是opener.open()还是urlopen() 发送请求,都将使用自定义代理。
# install_opener(opener)
# resp = urlopen(request)
print (resp.read().decode())
4.HTTPPasswordMgrWithDefaultRealm()
ProxyBasicAuthHandler())
HTTPBasicAuthHandler())
5.ProxyBasicAuthHandler(代理授权验证)
from urllib.request import HTTPPasswordMgrWithDefaultRealm,ProxyBasicAuthHandler,build_opener,Request
# 私密代理授权的账户
user = "mr_mao_hacker"
# 私密代理授权的密码
passwd = "sffqry9r"
# 私密代理 IP
proxyserver = "61.158.163.130:16816"
# 1. 构建一个密码管理对象,用来保存需要处理的用户名和密码
passwdmgr = HTTPPasswordMgrWithDefaultRealm()
# 2. 添加账户信息,第一个参数realm是与远程服务器相关的域信息,一般没人管它都是写None,后面三个参数分别是代理服务器、用户名、密码
passwdmgr.add_password(None, proxyserver, user, passwd)
# 3. 构建一个代理基础用户名/密码验证的ProxyBasicAuthHandler处理器对象,参数是创建的密码管理对象
# 注意,这里不再使用普通ProxyHandler类了
proxyauth_handler = ProxyBasicAuthHandler(passwdmgr)
# 4. 通过 build_opener()方法使用这些代理Handler对象,创建自定义opener对象,参数包括构建的 proxy_handler 和 proxyauth_handler
opener = build_opener(proxyauth_handler)
request = urllib2.Request("https://www.baidu.com/")
resp = opener.open(request)
print (resp.read().decode())
6.HTTPBasicAuthHandler(WEB客户端授权验证)
7.Cookies
Mozilla浏览器 cookies.txt兼容
的FileCookieJar实例。libwww-perl标准的 Set-Cookie3 文件格式
兼容的FileCookieJar实例。
获取cookie,并保存到CookieJar()中
from http.cookiejar import CookieJar
from urllib.request import Request,build_opener,HTTPCookieProcessor
# 构建一个CookieJar对象实例来保存cookie
cookiejar = cookielib.CookieJar()
# 使用HTTPCookieProcessor()来创建cookie处理器对象,参数为CookieJar()对象
handler=HTTPCookieProcessor(cookiejar)
opener = build_opener(handler)
# 4. 以get方法访问页面,访问之后会自动保存cookie到cookiejar中
resp = opener.open("http://www.baidu.com")
## 可以按标准格式将保存的Cookie打印出来
cookieStr = ""
for item in cookiejar:
cookieStr = cookieStr + item.name + "=" + item.value + ";"
## 舍去最后一位的分号
print cookieStr[:-1]
访问网站获得cookie,并将cookie保存在本地文件中
from http.cookiejar import MozillaCookieJar
from urllib.request import Request,build_opener,HTTPCookieProcessor
# 保存cookie的本地磁盘文件名
filename = ‘cookie.txt‘
#声明一个MozillaCookieJar(有save实现)对象实例来保存cookie,之后写入文件
cookiejar = MozillaCookieJar(filename)
# 使用HTTPCookieProcessor()来创建cookie处理器对象,参数为CookieJar()对象
handler = HTTPCookieProcessor(cookiejar)
opener = build_opener(handler)
response = opener.open("https://www.baidu.com/")
# 保存cookie到本地文件
cookiejar.save()
从文件中获取cookie
from http.cookiejar import MozillaCookieJar
from urllib.request import Request,build_opener,HTTPCookieProcessor
#创建MozillaCookieJar(有load实现)实例对象
cookiejar = MozillaCookieJar(filename)
#从文件中读取cookie内容到对象
cookiejar.load(‘cookie.txt‘)
# 使用HTTPCookieProcessor()来创建cookie处理器对象,参数为CookieJar()对象
handler = HTTPCookieProcessor(cookiejar)
opener = build_opener(handler)
response = opener.open("https://www.baidu.com/")
8.处理HTTPS请求SSL证书验证
import ssl
from urllib.request import urlopen,Request
# 表示忽略未经核实的SSL证书认证
context = ssl._create_unverified_context()
url = "https://www.12306.cn/mormhweb/"
headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36"}
request = Request(url,headers=headers)
# 在urlopen()方法里 指明添加 context 参数
resp = urlopen(request, context=context)
print(resp.read().decode())
二、error模块
1.URLError
from urllib.error import URLError
from urllib.request import Request,urlopen
request = Request(‘http://www.fafafasfdaffaf.com/‘)
try:
resp = urlopen(request)
except URLError as e:
print(e)
2.HTTPError
from urllib.error import HTTPError
from urllib.request import Request,urlopen
requset = Request(‘http://www.baidu.com/lfafdaflafapae.html‘)
try:
resp = urlopen(requset)
except HTTPError as e:
print(e)
print(e.code)
print(e.reason)
print(e.headers)
三、parse模块
上一篇:js原型链原理