网页抓取解密(解决网站字体加密的第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[^

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线