python 爬虫(一)——urllib

Posted by

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()