1、常见的反爬技术-字体反爬
1.1 字体反爬的原理
CSS3 @font-face 规则
在 CSS3 之前,web 设计师必须使用已在用户计算机上安装好的字体。
通过 CSS3,web 设计师可以使用他们喜欢的任意字体。
当您您找到或购买到希望使用的字体时,可将该字体文件存放到 web 服务器上,它会在需要时被自动下载到用户的计算机上。
您“自己的”的字体是在 CSS3 @font-face 规则中定义的。
1.2 分析过程
1、先分析font-face对应的加密过的字符串;
2、将解密过后的字符串写入字体文件;
3、通过第三方的软件查看自定义字体与正常字体的对应关系;
4、自定义字体与正常字体的映射关系,可能每一次都是不一样,是动态的,每请求一次,就要重新获取一次。
# 安装包fontTools
pip install fontTools
ret = base64.b64decode(font_face)
print(ret)
with open('./bb.ttf','wb') as f:
f.write(ret)
font = TTFont('./bb.ttf')
font.saveXML('./bb.xml')
2、BeautifulSoup
2.1 安装
pip install beautifulsoup4
2.2 卸载
pip uninstall beautifulsoup4
2.3 re、lxml、bs4
工具 | 速度 | 使用难度 |
---|---|---|
正则 | 最快 | 最难 |
lxml(xpath) | 较快 | 一般 |
BeautifulSoup | 慢 | 最简单 |
2.4 bs4的四大对象种类
str1 = '<div>这是测试div</div>'
soup = BeautifulSoup(str1,'lxml')
print(soup)
print('---格式化输出---')
print(soup.prettify())
2.5 解析完成
2.5.1 tag
HTML里面的标签
# 获取标签
print(soup.div)
print(type(soup.div))
显示:
<div>这是测试div</div>
<class 'bs4.element.Tag'>
标签属性
name 获取的是标签的名字
attrs获取的是标签的所有属性,返回的是一个字典
获取属性中的某一个
attr_dict = soup.a.attrs
print(attr_dict)
print(attr_dict['href'])
print(attr_dict.get('href123',None))
print(soup.a['href'])
print(soup.a.get('href'))
print(soup.a.get('href123'))
类型 | 类似 |
---|---|
attr_dict = soup.a.attrs | |
soup.a[‘href’] | attr_dict[‘href’] |
soup.a.get(‘href123’) | attr_dict.get(‘href123’,None) |
2.5.2 NavigableString
获取的是标签内部的内容
2.5.3 BeautifulSoup
文档对象,也就是整个文档的内容
soup = BeautifulSoup(str1,'lxml')
soup.name[document]
print(soup.attrs) ---> {}
2.5.4 comment
Coment对象是一个特殊类型的NavigableString对象。
2.6 遍历整个文档
2.6.1 获取的是子节点的内容
2.6.1.1 contents
node_list = soup.body.contents
print(node_list)
注意点:
1、contents获取的是整个节点内容,返回的是一个列表
2、如果需要获取节点的部分内容,可以采取下标取值
2.6.1.2 children
ret = soup.body.children
print(ret)
for item in ret:
print(item)
注意点:
1、children返回的是一个迭代器对象
2、需要读取,使用for循环读取
2.6.2 子孙节点
# 递归遍历
dant = soup.descendants
print(dant)
i = 1
for item in dant:
print('这是第',i)
print('#########')
print(item)
i+=1
2.6.3 按照需求搜索整个文档树
2.6.3.1 find_all
1、name
字符串
ret = soup.find_all('a')
print(ret)
注意点:
find_all返回的是一个列表
列表
ret = soup.find_all(['a','p'])
print(ret)
注意点:
name对应的值为同时查找多个标签,可以使用列表存储多个标签的方式进行查找
正则表达式
ret = soup.find_all(re.compile('^b'))
print(ret)
2、关键字参数
ret - soup.find_all(id='link2')
ret = soup.find_all(class_='sister')
print(ret)
3、text
按照文件内容查找
# ret = soup.find_all(text=re.compile(r'Dormouse'))
print(ret)
2.6.3.2 find
找到满足条件的第一个
2.6.3.3 css选择器
ret = soup.select("a[id='link2']")
print(ret)