您好,欢迎访问代理记账网站
移动应用 微信公众号 联系我们

咨询热线 -

电话 15988168888

联系客服
  • 价格透明
  • 信息保密
  • 进度掌控
  • 售后无忧

字体反爬-起点月票

字体反爬-起点月票

思路分析
1、得到该页面的所有月票数据
2、对月票url 发送请求 获取响应
3、提取字体文件的url,通过该url提取字体的关系映射表
4、保存数据
“”"

import re
import requests
from fontTools.ttLib import TTFont
from io import BytesIO
from lxml import etree

代码实现:

1、确定url

base_url = 'https://www.qidian.com/rank/yuepiao'

2、构建请求头

headers = {
    'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.85 Safari/537.36'
    ,
    'referer': 'https://www.qidian.com/rank'
    ,
    'cookie': 'e1=%7B%22pid%22%3A%22qd_P_rank_19%22%2C%22eid%22%3A%22%22%2C%22l1%22%3A5%7D; e2=%7B%22pid%22%3A%22qd_P_rank_19%22%2C%22eid%22%3A%22%22%2C%22l1%22%3A5%7D; _csrfToken=BnhREF5ih538gczHjZfLlPHPVizX7VPUasM3nJ6g; newstatisticUUID=1620827924_867497743; _yep_uuid=7e4bf842-f915-978c-af83-07a16f41beac; e1=%7B%22pid%22%3A%22qd_P_rank_01%22%2C%22eid%22%3A%22qd_C45%22%2C%22l1%22%3A5%7D; e2=%7B%22pid%22%3A%22qd_P_rank_01%22%2C%22eid%22%3A%22%22%2C%22l1%22%3A5%7D'

}

3、发送请求获取响应

response = requests.get(base_url, headers=headers)

print(response.content.decode()) # 结果中没有所需要的内容

4、从响应内容中提取字体加密文件的url 正则表达式

font_url = re.findall(r"\); src: url\('(.*?)'\) format\('woff'\)", response.text)[0]

\取消字符转义 # print(font_url)

5、提取月票加密数据

jm_data = re.findall(r'</style><span class=".*?>(.*?);</span></span>月票</p>', response.text)

print(jm_data) # 𘠀𘠁𘟷𘟷&#100352’

6、对字体加密文件的url 发送请求获取响应

res_font = requests.get(font_url)
# print(res_font.content.decode())

‘utf-8’ codec can’t decode byte 0xa4 in position 19: invalid start byte

因为从网页中读取二进制数据,需要使用IO Bytes 模块

7、创建字体对象

font = TTFont(BytesIO(res_font.content))

print(font) # <fontTools.ttLib.ttFont.TTFont object at 0x000001D9516DD108>

8、提取字体关系映射表

font_cmap = font.getBestCmap()
# print(font_cmap)
# {100054: 'nine', 100056: 'two', 100057: 'eight', 100058: 'zero', 100059: 'period', 100060: 'one', 100061: 'six', 100062: 'four', 100063: 'five', 100064: 'three', 100065: 'seven'}

9 、提取小说名称使用xpath:

name_list = etree.HTML(response.text).xpath('//*[@id="rank-view-list"]/div/ul/li[*]/div[2]/h4/a/text()')
# print(name_list)

10、对月票的加密数据进行提取分割,去掉多余的部分 # 定义存放每组月票的的列表数据

list_yp = []
for data in jm_data:
    # print(data)  # 类型为字符串
    # 得到加密数据列表
    data_list = data.replace("&#", "").split(";")
    # print(data_list)  # ['100223', '100228', '100225', '100223', '100226']
 # 定义英文数字字典对应表
    dic_num = {'zero': '0', 'one': '1', 'two': '2', 'three': '3', 'four': '4', 'five': '5', 'six': '6', 'seven': '7',
               'eight': '8',
               'nine': '9'}
    # 定义空字符串存储数据
    res_font = ""
    for i in data_list:
        # print(i)
        # 将字体加密数据转换为对应的数字
        font_data = dic_num[font_cmap[int(i)]]
        res_font += font_data
    list_yp.append(res_font)  # 将月票数据添加到列表
# print(list_yp)

11、组装存储数据

# print(list(zip(name_list, list_yp)))
for result in list(zip(name_list, list_yp)):
    with open("起点月票榜.txt", "a", encoding="utf-8")as f:
        f.write(str(result) + "\n")

分享:

低价透明

统一报价,无隐形消费

金牌服务

一对一专属顾问7*24小时金牌服务

信息保密

个人信息安全有保障

售后无忧

服务出问题客服经理全程跟进