python库之网络爬虫

大多数库用于网络爬虫与可视化数据

1.pickle库

可以处理复杂的序列化语法,序列化时,只是序列化整个序列对象,而非内存地址。pickle模块实现了基本的数据序列化和反序列化。通过pickle模块的序列化操作我们能够将程序中运行的对象信息保存到文件中去,永久存储;通过pickle模块的反序列化操作,我们能够从文件中创建上一次程序保存的对象。所以pickle库也有两类主要接口,一个是序列化接口,一个是反序列化接口。

pickle常用函数:

1.pickle.dump(object, file, protocol=None)
dump操作方法可以将序列以二进制的形式存放在文件中,以便下次使用。

必填参数 obj 表示将要封装的对象

必填参数 file 表示 object 要写入的文件对象,file 必须以二进制模式打开,即 wb。file文件指的是.pkl后缀的pkl文件。

可选参数 protocol 表示告知 pickle 使用的协议,支持的协议一共有5中不同的类型,即(0,1,2,3,4)。(0,1,2)对应的是python早期的版本,(3,4)则是在python3之后的版本。默认的协议是添加在 Python 3 中的协议 3。
# 序列化到pkl文件
import pickle
def seriaize():
    ls = ["tom", "jan", "kang"]
    f = open("test1.pkl", "wb")
    pickle.dump(ls, f)
    f.close()

if __name__ == "__main__":
    seriaize()

2.pickle.load(file)
load()操作方法可以从字节对象中读取被封装的对象

file文件依旧是.pkl后缀的pkl文件,并且读取也应使用rb权限,因为是二进制文件。
# pkl文件反序列化
import pickle

def unserialize():
    f = open('test1.pkl', 'rb')
    test = pickle.load(f)
    print(test)


if __name__ == "__main__":
    unserialize()

3.pickle.dumps(object)
dumps()操作方法将object对象序列化并返回一个byte对象,而不是存入到文件中

# 序列化到二进制字符
import pickle
def serialize():
    ls = ["jan", "tom", "kang"]
    result = pickle.dumps(ls)
    print(result)

if __name__ == "__main__":
    serialize()

4.pickle.loads(bytes_object)
loads()操作方法从字节对象中读取被封装的对象

# 二进制字符反序列化
import pickle

def unserialize():
    result = b'\x80\x04\x95\x18\x00\x00\x00\x00\x00\x00\x00]\x94(\x8c\x03jan\x94\x8c\x03tom\x94\x8c\x04kang\x94e.'
    ls = pickle.loads(result)
    print(ls)

if __name__  == "__main__":
    unserialize()

2.urllib库

urllib库是python的内置HTTP请求库,包含以下各个模块内容:

(1)urllib.request:请求模块
(2)urllib.error:异常处理模块
(3)urllib.parse:解析模块
(4)urllib.robotparser:robots.txt解析模块

1.request模块
模拟浏览器的一个请求发起过程,同时还带有处理授权验证,重定向,浏览器Cookies及其他内容

(1)urllib.requestr.urlopen(url,data=None,[timeout,]*,cafile=None,capath=None,cadefault=False,context=None)方法

(1)data参数表示数据,如果设置的话一定要转化成字节流编码格式

data 如果要传必须是bytes类型,如果他是字典可以先用*urllib.parse模块

里的urlencode()编码
*(2)timeout的话是设置超时时间,可以用来捕捉获取服务器时间过久的异常
(3)其他参数的话 context参数必须是ssl.SSLContext类型,用来指定SSL设

置。cafile和capath这两个参数 是指CA证书和CA证书的路径。这个在请求

Https时是有用的。

网页请求
# get请求 (data为空)
url = "https://www.csdn.net/?spm=1001.2101.3001.5359"
respense = urllib.request.urlopen(url)  # 该方法返回一个对象
print(respense.read().decode("utf-8")) # response.read()   读取二进制数据

'''
字节-->字符串   解码decode
字符串-->字节   编码encode
'''

# 2.post请求   data参数用于post请求,比如表单提交,如果没有data参数则是get请求

url = "https://www.baidu.com/"
# urllib.parse.urlencode()   把字典对象解析成url可识别的参数字符串
data = bytes(urllib.parse.urlencode({'好好学习': '天天向上'}), encoding = 'utf-8')  # urlencode将字典解码,并转化为字节类型
respense = urllib.request.urlopen(url, data = data, timeout = 1)                 # timeout 服务器响应时间设置
print(respense.read().decode("utf-8"))

(2)urllib.request.Request(url,data=None,headers={},origin_req_host=None,unverifiable = False.method = None)

(1)url:用于发送请求的 URL,必选参数,其他参数都是可选参数。

(2)data:要提交的数据,该参数类型必须是 bytes.形式。如果要传输的数据类型是字典,需要用 urllib,parse.urlencode 函数进行编码。

(3)headers:请求头,是一个字典类型的数据,我们可以在构造请求时通过 headers 命名参数直 接构造,也可以通过 Request 对象的 add_header 方法后期添加。

(4)origin_req_host:请求方的 host 名称或 IP 地址。

(5)unverifiable:表示这个请求是否是无法验证的,默认是 False,意思就是说用户没有足够的 权限来选择接收这个请求的结果。例如,请求一个 HTML 文档中的图像,但是没有自动抓取图像的权 限,这时 unverifiable 的值就是 True。

(6)method:用来指定请求的方法,如 GET、POST、PUT 等。 如果指定了 data 参数,urlopen 函数就会发送 POST 请求,所以通常不需要指定 method 参数,不 过为了让程序更容易理解,也可以指定 method 参数。但当设置了 data 参数,而将 method 参数值设为 GET,那么 data 指定的表单数据并不提交给服务端。

url = "https://www.baidu.com/"

headers = \
{
"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.131 Safari/537.36 Edg/92.0.902.67",

"Host": "www.baidu.com", "Referer": "https://cn.bing.com/"

}

dict = {"name": "tom"}

data = bytes(urllib.parse.urlencode(dict), encoding = "utf-8") # 转为字节类型


# 由于urlopen无法传参数,声明一个Request对象
request = urllib.request.Request(url, data = data, headers = headers, method = 'POST')
respense = urllib.request.urlopen(request)
print(respense.read().decode('utf-8'))

小结:如果我们在获取请求对象时,不需要过多的参数传递,我么可以直接选择urllib.request.urlopen(),urllib.request.urlopen 是个方法,用于发送给服务器(发给服务器的内容可以是根据自带参数填写)。如果果需要进一步的包装请求,可以使用urllib.request.Request构造一个带有更多参数Request对象)并接收响应,返回的是响应的对象

2)urllib.error:异常处理模块
关于异常处理部分,需要了解有httperror和urlerror两种,父类与子类的关系。

#父类,只有一个reason
from urllib import request,error
try:
response = request.urlopen('http://www.bai.com/index.html')
except error.URLError as e:
print(e.reason)
#子类,有更多的属性
from urllib import request,error
try:
response = request.urlopen('http://abc.123/index.html')
except error.HTTPError as e:
print(e.reason,e.code,e.headers,sep='\n')
HTTPError 具有三个属性:
code:HTTP/HTTPS 请求返回的状态码。
headers:HTTP 请求返回的响应头信息。
reason:与父类方法一样,表示返回错误原因。
URLError 是 urrlib.error 异常类的基类,具有 reason属性,返回错误原因
hasattr() 函数用于判断某类是否具有此属性:
 if hasattr(e,"reason"):
    print('reason: ',e.reason)

3.BeautifulSoup库

Beautiful Soup将复杂HTML文档转换成一个复杂的树形结构,每个节点都是Python对象,所有对象可以归纳为四大对象种类:
1. Tag
2. NavigableString
3. BeautifulSoup
4. Comment

import re
from bs4 import BeautifulSoup

file = open("./baidu.html", 'rb')               # 打开当前目录下的文件 ./
html = file.read()                              # 读取文件并返回给html对象
bs = BeautifulSoup(html, "html.parser")         # html解析 并返回bs对象

ist_a =bs.find_all("a")                         # 打印出所有标签 a的整个信息
for i in list_a:
    print(i)

# 1.tag(就是标签)  有两个属性 :name ,attrs
print(bs.a.attrs)                               # 获取标签a的所有属性 以键值对返回
# 利用get()     传入属性的名称
print(bs.a['class'])    # 等价于 bs.a.get("class")


# 2.NavigableString (获取标签内部的文字) 用.string
print(bs.a.string)


# 3.BeautifulSoup 表示是一个文档的内容, 可以当中特殊的tag ,可以获取它的属性,类型,名称
print(bs.name)
print(bs.attrs)
print(type(bs))                      # <class 'bs4.BeautifulSoup'>

# 4.Comment 其对象是一个特殊类型的 NavigableString 对象,其输出的内容不包括注释符号。
print(bs.a.string)
print(type(bs.a.string))              # <class 'bs4.element.Comment'>


搜索:
find_all(name, attrs, recursive, text, **kwargs) 过滤器

# (1)name  字符串过滤:会查找与字符串完全匹配的内容
# limit限制标签返回的数量    也可以使用find() 该函数返回一个
a_list = bs.find_all('a', limit = 3)                 # 查找 a标签
for i in a_list:
    print(i)# 正则表达式过滤 如果传入的是正则表达式,那么BeautifulSoup4会通过search()来匹配内容
t_list = bs.find_all(re.compile('a'))           # 查找所有与a相关的
for i in t_list:
    print(i)

CSS选择器
在写 CSS 时,标签名不加任何修饰,类名前加点,id名前加 #
在这里我们也可以利用类似的方法来筛选元素,用到的方法是 bs.select(),返回类型是 list

# 通过类名
print(bs.select('.mnav'))
print(bs.select('.bri'))

# 通过标签名
print(bs.select('a'))

# 通过id
print(bs.select('#u1'))

# 通过组合
print(bs.select('div .bri'))   # div 下类名为bri

# 通过子标签
g_list = bs.select("head" > "title")

print(g_list)

4.re库

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Super.Bear

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值