urllib
一.urllib的安装:
pip3 install --user urllib3
二.使用:
①request:打开和读取url
如:
import url.request
a = url.request.urlopen('https://lcj.ink') #打开网页https://lcj.ink
print(a.read().decode('utf-8')) #以utf-8编码输出网页信息
说明:
urllib.request定义了一些打开url的函数和类,包含授权验证、重定向、浏览器cookies等——urllib.request可以模拟浏览器的一个请求发起的过程
urllib.request的几个函数:
1>urlopen()
urlopen(url,data=None,[timeout, ]*,cafile=None,capath=None,context=None)
Ⅰ.url: url地址
Ⅱ.data: 发送到服务器上的其他数据对象,默认为None
Ⅲ.timeout: 甚至访问超时时间
Ⅳ.cafile和capath: cafile为CA证书,capath为CA证书的路径,使用HTTPS时需要用到
Ⅴ.context: ssl.SSL Context类型,用来指定SSL设置
实例:
from urllib.request import urlopen
a = urlopen('https://lcj.ink')
print(a.read())
注:read()是读取整个网页的内容,我们还可以使用readline()和readlines()函数
其中,readline()是读取文件中的一行内容
readlines()是读取文件的全部内容,它会把读取的内容赋值给一个列表
如:
from urllib.request import urlopen
a = urlopen('https://lcj.ink')
lines = a.readlines()
for line in lines :
print(line)
2>getcode()或者status
用于获取网页状态码,判定网页是否可以正常访问,如果返回200则说明网页正常,返回404说明网页不存在
如:
import urllib.request
a = urllib.request.urlopen('https://lcj.ink')
print(a.getcode())
print(a.status)
try :
b = urllib.request.urlopen('https://lcj.ink')
except urllib.error.HTTPError as e :
if e.code == 404
print(404)
3>quote()和unquote()
用于url的编码( quote() )和解码( unquote() )
如:
import urllib.request
encode_url = urllib.request.quote('1+1') #编码
print(encode_url)
unencode_url = urllib.request.unquote(encode_url) #解码
print(unencode_url)
4>Request()
用于模拟头部信息
Request(url,data=None,headers={},origin_req_host=None,unverfiable=False,method=None)
Ⅰ.url: url地址
Ⅱ.data: 发送到服务器的其他数据对象,默认为None
Ⅲ.headers: HTTP请求的头部信息,字典格式
Ⅳ.origin_req_host: 请求的主机地址,IP或域名
Ⅴ.unverifiable: 很少用的参数,用于设置网页是否需要验证,默认为False
Ⅵ.method: 请求方法,如GET、POST、DELETE、PUT等
如:
import urllib.request
import urllib.parse
url = 'https://lcj.ink/?s='
keyword = '爬虫'
key_code = urllib.request.quote(keyword)
url_all = url + key_code
header = {
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:98.0) Gecko/20100101 Firefox/98.0'
}
request = urllib.request.Request(url_all,headers=header)
re = urllib.request.urlopen(request).read()
fh = open('./1.txt','wb')
fh.write(re)
fh.close()
我们可以使用data来传递其他信息(表格提交信息),如:
import urllib.request
import urllib.parse
url = 'https://lcj.ink/test.php'
data = {'name':'abc','age':'18'}
header = {
"Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:98.0) Gecko/20100101 Firefox/98.0"
}
data = urllib.parse.urlencode(data).encode('utf8')
request = urllib.request.Request(url,data,header,method = 'POST')
re = urllib.request.urlopen(request).read()
fh = open('./1.txt','wb')
fh.write(re)
fh.close()
②解析URL: parse
urlparse(urlstring,scheme=”,allow_fragments=True)
Ⅰ.urlstring: url地址
Ⅱ.scheme: 协议类型
Ⅲ.allow_fragments: 如果参数为False,则无法识别片段标识符,相反,它们被解析为路径、参数或查询组件的一部分,并且fragment在返回值中设置为空字符串
实例:
from urllib.parse import urlparse
o = urlparse('https://lcj.ink')
print(o)
输出结果为:
ParseResult(scheme='https',netloc='lcj.ink',path='',params='',query='',fragment='')
Ⅰ.scheme: URL协议
Ⅱ.netloc: 网络位置部分
Ⅲ.path: 分层路径
Ⅳ.params: 最后路径元素的参数
Ⅴ.query: 查询组件(https://lcj.ink/?s=…..中的 s=…..就是查询组件)
Ⅵ.fragment: 片段识别
from urllib.parse import urlparse
o = urlparse('https://lcj.ink')
print(o.scheme)
urllib.parse.urlencode(query,doseq=False,safe=”,encoding=None,errors=None,quote_via=quote_plus)
Ⅰ.query:查询组件(查询参数)
Ⅱ.deseq:序列元素是否单独转换
Ⅲ.safe:安全默认值
Ⅳ.encoding:编码
Ⅴ.errors:错误默认值
Ⅵ.quote_via:查询参数的成分是str时,safe,encoding,errors传递给指定函数默认为quote_plus(),加强版quote()