urilib库
1、了解urllib库
是Python自带的网络请求库,可以模拟浏览器的行为,向指定服务器发送一个请求,并可以保存服务器返回的数据。
2、熟练掌握urllib函数
urlopen
一个表示远程url的类文件对象,然后像本地文件一样操作这个对象来获取远程数据。
案例:
from urllib import request
resq = request.urlopen('https://www.baidu.com')
print(resq.read())
url:请求的url
data:请求的数据,如果设置了这个值,那么将变成post请求
返回值:返回值是一个http.client.HTTPResponse对象。
- read():返回指定长度数据
- readline():返回单行数据
- readlines():返回逐行数据
- getcode():返回状态码()
urlretrieve函数
这个行数可以方便的将网页上的一个文件保存到本地
from urllib import request
request.urlretrieve(url,文件名)
urlencode函数:编码
urlencode可以把字典数据转换成URL编码的数据
from urllib import parse
data = {'name':'老王','age':18,'greet':'Hello world'}
qs = parse.urlencode(data)
print(qs)
#补充对字符串编码
a = '石原里美'
b = parse.quote(a)
print(b)
parse_qs函数:解码
parse_qs可以把URL编码数据解码为字典数据
print(parse.parse_qs(qs))
#接上
urlparse和urlsplit函数:解析url
对url的各个组成部分进行分割
from urllib import parse
url = 'http://www.baidu.com/index.html;user?id=s#comment'
result = parse.urlparse(url)
print(result)
#urlsplit不包含params属性
result = parse.urlsplit(url)
print(result)
requset.Request类
在请求是增加一些请求头,比如增加一个User-Agent
from urllib import request
headers = {}
rq= request.Request('https://www.baidu.com/',headers = headers)
resp = request.urlopen(rq)
print(resp.read())
proxyHandler处理器(代理设置),解决封ip:
http://httpbin.org:这个网站可以方便的查看htp请求的一些参数
常用的代理有:
西刺免费代理:http://www.xicidaili.com
快代理:http://www.kuaidaili.com
代理云http://www.dailiyun.com
from urllib import request
url = 'http://httpbin.org/ip'
#使用Proxyhandler,传入代理构建一个handler
handler = request.ProxyHandler({'http':'171.35.146.47:9999'})
#使用handler构建一个opener
opener = request.build_opener(handler)
#使用opener发送请求
rq =opener.open(url)
cookie:
指某些网站为了辨别用户身份、进行 session跟踪而储存在用户本地终端上的数据
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协议下起作用。
cookie实战1:模拟知乎登陆
#网页Network:Request Headers:cookie
from urllib import request
url = 'http://www.zhihu.com/hot'
headers = {
'cookie':'_zap=90fb470a-3d0e-46d8-86e2-48cbd7011847; d_c0="AACZsvckwRCPTkg8gZbxqZiYG56FbHJkzhY=|1580619608"; capsion_ticket="2|1:0|10:1581470479|14:capsion_ticket|44:ZjdjYTYyMzFhZTRkNDJlMmE1MzQ0YzUxYzJkYWUyYjU=|bc168dc0ebd879a113e087d08fb93c19a3796d2beca11b8c5981502df3f5ebc8"; z_c0="2|1:0|10:1581470485|4:z_c0|92:Mi4xOGFCUERRQUFBQUFBQUpteTl5VEJFQ1lBQUFCZ0FsVk5GYUV3WHdEd1Y3cGVZdWJ2VWVsdy1YeEd2RFctYnBNcURR|44cd8e0099ad2659aaa12aea79f891ae0f8a4b46bde8a31128047b7ebdb2ab97"; _xsrf=ef03277f-8e27-45a7-b100-63823e822cfb; Hm_lvt_98beee57fd2ef70ccdd5ca52b9740c49=1581576284,1581673467,1581686994,1581951739; Hm_lpvt_98beee57fd2ef70ccdd5ca52b9740c49=1581951739; tst=h; tshl=; KLBRSID=031b5396d5ab406499e2ac6fe1bb1a43|1581951744|1581951732'
}
wq = request.Request(url,headers=headers)
rq = request.urlopen(wq)
print(rq.read().decode('utf-8'))
cookie实战2:http.cookiejar模块模拟登陆知乎
http.cookiejar模块的类有CookieJar、FileCookieJar、MozillaCookieJar、LWPCookieJar
CookieJar:管理cookie值、储存HTTP请求生成的cookie向HTTP传输的请求添加cookie的对象。储存在内容中,对cookieJ回首,cookie也将丢失
FileCookieJar:检索cookie信息并储存为文件。delayload为True时支持延迟访问文件,即需要时才读取文件或在文件中储存。
from urllib import request
from urllib import parse
from http.cookiejar import CookieJar
url = 'https://i.meishi.cc/login_t.php?username=v78297944%40gmail.com&login_type=2&password=a000000&cookietime=on'
#创建对象
cookiejar = CookieJar()
handler = request.HTTPCookieProcessor(cookiejar)
opener =request.build_opener(handler)
#发送登陆请求
post_url = url
post_data = parse.urlencode({
'username':'v78297944@gmail.com',
'password':'a000000'
})
req = request.Request(post_url,data= post_data.encode('utf-8'))
opener.open(req)
#登陆网页
url = 'https://i.meishi.cc/cook.php?id=14456897'
rewq = request.urlopen(url)
print(rewq.read().decode('utf-8'))
Cookie加载与保存
from urllib import request
from http.cookiejar import MozillaCookieJar
cookiejar = MozillaCookieJar()
handler = request.HTTPCookieProcessor(cookiejar)
opener = request.build_opener(handler)
resp = opener.open('http://www.baidu.com')
cookiejar.save('cookie.txt',ignore_discard=True,ignore_expires=True)
ignore_discard=True即使cookie即将被丢弃也要保存下来。
ignore_expries=True如果cookie已经过期也要保存下来并且文件存在时也将覆盖。
from urllib import request
from http.cookiejar import MozillaCookieJar
cookiejar = MozillaCookieJar('cookie.txt')
cookiejar.load()
handler = request.HTTPCookieProcessor(cookiejar)
opener = request.build_opener(handler)
resp = opener.open('http://www.baidu.com')
for cookie in cookiejar:
print(cookie)
案例:
1. 爬取猫眼
from urllib import request
url = 'http://piaofang.maoyan.com/second-box'
headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.106 Safari/537.36 Edg/80.0.361.54'}
rq =request.Request(url,headers= headers)
wq =request.urlopen(rq)
print(wq.read().decode('utf-8'))
#需要的数据如果没在源代码中,则有可能出现在Json文件中。通过NetWork查看JSon文件的get地址,替换url获取内容
2. 爬去别逗了网多页内容
from urllib import request
for i in range(8845,8850):
url = 'https://www.biedoul.com/index/'+str(i)
rq = request.Request(url)
wq = request.urlopen(rq)
print(wq.read().decode())