urllib库的基本使用
1、urlopen函数
eg:
from urllib import request
resp = request.urlopen('http://www.baidu.com')
print(resp.read())
注:创建一个表示远程url的类文件对象,然后像操作本地文件一样操作这个类文件对象来获取远程数据。
request.urlopen(url,data)
url:请求的url。
data:请求的data,如果设置了这个值,那么将变成post请求。
返回值:返回值是一个http.client.HTTPResponse对象,这个对象是一个类文件句柄对象。
有read(size)、readline、readlines以及getcode等方法。
2、urlretrieve函数
eg:
from urllib import request
request.urlretrieve('http://www.baidu.com/','baidu.html')
注:这个函数可以方便将网页上的一个文件保存到本地。
request.urlretrieve(url,带后缀的文件名)
3、urlencode函数/字典编码
urlencode可以把字典数据转换为URL编码的数据。
eg:
from urllib import parse
data = {'name':'爬虫基础','greet':'hello world','age':100}
qs = parse.urlencode(data)
print(qs)
补充:
1、 字符串编码
a='石原里美'
b=parse.quote(a)
print(b)
2、quote()函数
eg:
from urllib.parse import quote
quote()函数,可以帮我们把内容转为标准的url格式,作为网址的一部分打开
4、parse_qs函数:
可以将经过编码后的url参数进行解码。
eg:
from urllib import parse
qs="name=%E7%88%AC%E8%99%AB%E5%9F%BA%E7%A1%80
&greet=hello+world
&age=100"
print(parse.parse_qs(qs))
# {'name': ['老王'], 'age': ['18'], 'greet': ['hello world']}
补充:
url解码
eg:from urllib import parse
url='xxxxxxxxxx'
print(parse.unquote(url))
5、urlparse和urlsplit函数:解析url
urlparse和urlsplit基本上是一模一样的。
唯一不一样的地方是:
urlparse里有params属性,而urlsplit没有这个params属性。
eg:
from urllib import parse
url = 'http://www.baidu.com/index.html;user?id=S#comment'
result = parse.urlparse(url)
# result = parse.urlsplit(url)
print(result)
print(result.scheme)
print(result.netloc)
print(result.path) #urlparse里有params属性,而urlsplit没有这个params属性。
print(result.params)
6、request.Request类
如果想要在请求的时候增加一些请求头,那么就必须使用request.Request类来实现。
比如要增加一个User-Agent
eg:
from urllib import request
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)
AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86
Safari/537.36'
}
rq = request.Request('https://www.baidu.com/',headers=headers)
resp = request.urlopen(rq)
print(resp.read())
7、使用代理IP
常用的代理有:
西刺免费代理IP:http://www.xicidaili.com/
快代理:http://www.kuaidaili.com/
代理云:http://www.dailiyun.com/
eg:
from urllib import request
# 没有使用代理
# url = 'http://httpbin.org/ip'
# resp = request.urlopen(url)
# print(resp.read())
# 使用代理
# 步骤
url = 'http://httpbin.org/ip'
#1. 使用ProxyHandler,传入代理构建一个handler
handler = request.ProxyHandler({'http':'122.193.244.243:9999'})
#2. 使用上面创建的handler构建一个opener
opener = request.build_opener(handler)
#3. 使用opener去发送一个请求
resp = opener.open(url)
print(resp.read())
8、cookie
1. 什么是cookie:指某些网站为了辨别用户身份、进行 session 跟踪而储存在用户本地终端上的数据
2. cookie的格式:
Set-Cookie: NAME=VALUE;Expires/Max-age=DATE;Path=PATH; Domain=DOMAIN_NAME;SECURE
参数意义:
NAME:cookie的名字。
VALUE:cookie的值。
Expires:cookie的过期时间。
Path:cookie作用的路径。
Domain:cookie作用的域名。
SECURE:是否只在https协议下起作用。
实例1
from urllib import request
from urllib import parse
from http.cookiejar import CookieJar
# 登录:https://i.meishi.cc/login.php?redirect=https%3A%2F%2Fwww.meishij.net%2F
#个人网页https://i.meishi.cc/cook.php?id=13686422
headers={
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36'
}
#1.登录
#1.1 创建cookiejar对象
cookiejar = CookieJar()
#1.2 使用cookiejar创建一个HTTPCookieProcess对象
handler = request.HTTPCookieProcessor(cookiejar)
#1.3 使用上一步的创建的handler创建一个opener
opener = request.build_opener(handler)
#1.4 使用opener发送登录请求 (账号和密码)
post_url = 'https://i.meishi.cc/login.php?redirect=https%3A%2F%2Fwww.meishij.net%2F'
post_data = parse.urlencode({
'username':'1097566154@qq.com',
'password':'wq15290884759.'
})
req = request.Request(post_url,data=post_data.encode('utf-8'))
opener.open(req)
#2.访问个人网页
url = 'https://i.meishi.cc/cook.php?id=13686422'
rq = request.Request(url,headers=headers)
resp = opener.open(rq)
print(resp.read().decode('utf-8'))
实例2:保存和加载
from urllib import request
from http.cookiejar import MozillaCookieJar
# 保存
# cookiejar = MozillaCookieJar('cookie.txt')
# handler = request.HTTPCookieProcessor(cookiejar)
# opener = request.build_opener(handler)
# resp = opener.open('http://www.httpbin.org/cookies/set/course/abc')
#
# cookiejar.save(ignore_discard=True,ignore_expires=True)
# ignore_discard=True 即使cookies即将被丢弃也要保存下来
# ignore_expires=True 如果cookies已经过期也将它保存并且文件已存在时将覆盖
#加载
cookiejar = MozillaCookieJar('cookie.txt')
cookiejar.load()
handler = request.HTTPCookieProcessor(cookiejar)
opener = request.build_opener(handler)
resp = opener.open('http://www.httpbin.org/cookies/set/course/abc')
for cookie in cookiejar:
print(cookie)