网页抓取解密(解决网站字体加密的第2篇文章方法,具体执行步骤)
优采云 发布时间: 2021-12-18 05:17网页抓取解密(解决网站字体加密的第2篇文章方法,具体执行步骤)
前言:
写这个文章的原因是为了写一个python脚本来抓取一个食物相关的网站的电话号码,发现网站已经被字体加密了,抓到的那些是难以理解的十六进制代码,如下图:
文本:
用chrome查看对应的加密代码,发现是写在css文件中,css地址直接贴在这里:
找到对应的位置,发现是base64编码加密的
之前没接触过这个,于是开始查资料,主要是查下面两个文章,其中比较参考的是第二个文章的第四种方法,具体实现步骤和我我将列出我写的脚本:
将base64格式的字体信息解码成可用的字体文件
反爬虫技术:解决网站字体加密
步骤1:
提取CSS文件中网站字体对应的代码,自动保存为字体文件base.woff。复制下面的代码直接使用
# -*- coding:utf-8 -*-
import requests,base64
def downfont(url):
response = requests.get(url)
base64_string = response.text.split("base64,")[1].split("'")[0].strip()
bin_data = base64.decodebytes(base64_string.encode())
with open("base.woff", r"wb") as f:
f.write(bin_data)
if __name__ == "__main__":
url = 'https://wap.21food.cn/resources/css/layout.css'
downfont(url)
print('done.')
第2步:
下载FontCreator软件,下载链接:
打开第一步生成的“base.woff”字库,软件会自动生成字库的对应关系,如下图:
记得选择字幕,找到我们要抓取的网站加密字体对应的十六进制码,手动写入字典,这样我们抓取的数字就可以一一对应:key = { '10010':'0','1000D':'1','10011':'2','1000F':'3','10017':'4','1000E':'5','10015 ':' 6','10014':'7','10012':'8','10013':'9','10016':'-')
第 3 步:
编写爬虫程序,抓取我们要抓取的页面上电话号码的加密密文。我使用常规规则来匹配。以这个网址为例。我们需要抓取的是下图中的边框区域。
然后根据我们之前拿到的字典,自动转换成对应的实数,就可以在网页上得到这个数了。具体代码如下:
<p># -*- coding: utf-8 -*-
import requests
import cchardet
import traceback
from lxml import html
import re
import cchardet
def downloader(url, timeout=10, headers=None, debug=False, binary=False):
_headers = {
'User-Agent': ('Mozilla/5.0 (compatible; MSIE 9.0; '
'Windows NT 6.1; Win64; x64; Trident/5.0)'),
}
redirected_url = url
if headers:
_headers = headers
try:
r = requests.get(url, headers=_headers, timeout=timeout)
if binary:
html = r.content
else:
encoding = cchardet.detect(r.content)['encoding']
html = r.content.decode(encoding)
status = r.status_code
redirected_url = r.url
except:
if debug:
traceback.print_exc()
msg = 'failed download: {}'.format(url)
print(msg)
if binary:
html = b''
else:
html = ''
status = 0
return status, html, redirected_url
def extract(source):
p = re.findall(r'(&#x[^