urlopen函数:
创建一个表示远程url的类文件对象,然后像本地文件一样操作这个类文件对象来获取远程数据。
url:请求的url。
data:请求的data,如果设置了这个值,那么将变成post请求。
返回值:返回值是一个http.client.HTTPResponse对象,这个对象是一个类文件句柄对象。有read(size)、readline、readlines以及getcode等方法。
例如:
from urllib import request
resp = request.urlopen("https://www.sogou.com/")
print(resp.read())
#若显示二进制代码,可以进行转码,以上print代码写为:print(resp.read().decode('utf-8'))
#resp.read(10)--提取前10个字符
#resp.readline()--提取第1行
#resp.readlines--提取多行
#resp.getcode--获取状态码,显示200为成功连接
urlretrieve函数:
这个函数可以方便的将网页上的一个文件保存到本地。
例如:
#保存网页
from urllib import request
url = "https://www.sogou.com/"
request.urlretrieve(url, 'sougou.html')
#保存图片
from urllib import request
url = "http://img.zcool.cn/community/01fe885a43130ca801206ed333fd16.jpg@3000w_1l_2o_100sh.jpg"
request.urlretrieve(url,'灌篮高手.jpg')
urlencode函数:编码
parse_qs函数:解码
urlencode可以把字典数据转换为URL编码的数据。
parse_qs可以把URL编码的数据转换为字典数据。
例如:
#urlencode编码,parse_qs解码 字典
from urllib import parse
data = {'name':'小明','age':'30','city':'北京'}
qs = parse.urlencode(data) # urlencode()--括号内的必须为字典
print(qs)
#解码
print(parse.parse_qs(qs))
补充说明:如果不是字典数据,而是字符串数据,可以用quote编码,unquote解码,例如:
#quote编码,unquote解码 字符串
from urllib import parse
data = "我正在学习网络爬虫。"
qs = parse.quote(data)
print(qs)
#解码
print(parse.unquote(qs))
编码、解码的用处:
'''通过搜狗搜索关键字"灌篮高手",
地址栏显示:https://www.sogou.com/web?query=灌篮高手,
但粘贴后进行了自动编码,
地址栏显示:https://www.sogou.com/web?query=%E7%81%8C%E7%AF%AE%E9%AB%98%E6%89%8B。
此时可使用urlencode编码后,将代码带入url中再抓取需要的数据。
'''
from urllib import parse
url_1 = "https://www.sogou.com/web?"
data = {"query":"灌篮高手"}
url_2 = parse.urlencode(data)
url = url_1+url_2
print(url)
urlparse和urlsplit函数:解析url
urlparse和urlsplit几乎一模一样,唯一的区别是:urlparse里有params属性,而urlsplit没有params属性。
例如:
from urllib import parse
url= "https://www.sogou.com/web?query=%E7%81%8C%E7%AF%AE%E9%AB%98%E6%89%8B"
result_urlparse = parse.urlparse(url)
result_urlsplit = parse.urlsplit(url)
print(result_urlparse)
print(result_urlsplit)
#输出:
#ParseResult(scheme='https', netloc='www.sogou.com', path='/web', params='', query='query=%E7%81%8C%E7%AF%AE%E9%AB%98%E6%89%8B', fragment='')
#SplitResult(scheme='https', netloc='www.sogou.com', path='/web', query='query=%E7%81%8C%E7%AF%AE%E9%AB%98%E6%89%8B', fragment='')
request.Request类:网络请求 可以增加请求头
from urllib import request
headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.122 Safari/537.36"}
url = "https://www.baidu.com/"
rq = request.Request(url,headers=headers) #网络请求,并添加请求头
resp = request.urlopen(rq) #打开网页
print(resp.read())
ProxyHandler(代理设置),解决封ip问题
代理原理:在请求目的网站之前,先请求代理服务器,然后让代理服务器去请求目的网站,代理服务器拿到目的网站的数据后,再转发给我们的代码。
例如:
from urllib import request
url = "http://httpbin.org/ip"
#设置代理ip,ProxyHandle()中的数据应是字典格式,且IP后面应加上端口号。
handler = request.ProxyHandler({"http":"118.212.104.182:9999"})
#创建一个opener,并将新的IP传入其中。
opener = request.build_opener(handler)
#使用opener向url发送请求。
resp = opener.open(url)
print(resp.read())
cookie
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的保存与加载(利用http.cookiejar中的MozillaCookieJar实现)
#保存
from urllib import request
from http.cookiejar import MozillaCookieJar
cookiejar = MozillaCookieJar()
handler = request.HTTPCookieProcessor(cookiejar)
opener = request.build_opener(handler)
opener.open('https://www.baidu.com/')
cookiejar.save('cookie.txt',ignore_discard=True, ignore_expires=True)
#加载
from urllib import request
from http.cookiejar import MozillaCookieJar
cookiejar = MozillaCookieJar()
cookiejar.load('cookie.txt')
handler = request.HTTPCookieProcessor(cookiejar)
opener = request.build_opener(handler)
opener.open('https://www.baidu.com/')
ignore_discard=True 即使cookies即将被丢弃也要保存下来
ignore_expires=True 如果cookies已经过期也将它保存并且文件已存在时将覆盖