爬虫小知识3

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)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值