IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Python知识库 -> 关于起点中文网月票字体解密(附赠翻页获得月票) -> 正文阅读

[Python知识库]关于起点中文网月票字体解密(附赠翻页获得月票)

最近好久没写代码了,突然想热热手于是就相中了起点中文网(●ˇ?ˇ●)
废话不多说,献上代码
我们先来分析分析起点中文网的网站
https://www.qidian.com/rank/yuepiao/year2022-month01/
正常操作我们进入网站之后,按f12,点击network ,如下图
在这里插入图片描述
我们需要找到我们要爬取的内容,今天我们就爬取标题和月票数吧
在这里插入图片描述
**找到箭头所指的网址点进去查看它的预览(Preview)查找了之后发现,没有我们要找的数据,我们再看是否在Response中,用CTRL+f来搜索星门会发现在这个里面
**
在这里插入图片描述
在这里插入图片描述
这样我们就得到了题目,获取题目的代码如下

import random
import requests
from lxml import etree
 # 确定起点中文网月票排行榜网址
  url = 'https://www.qidian.com/rank/yuepiao/year2022-month01/'
 # 请求头
 headers = {
       'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.193 Safari/537.36',
        'referer': 'https://www.qidian.com/rank/',
        'cookie': 'e1=%7B%22pid%22%3A%22qd_P_rank_01%22%2C%22eid%22%3A%22qd_C19%22%2C%22l1%22%3A4%7D; e2=%7B%22pid%22%3A%22qd_P_rank_01%22%2C%22eid%22%3A%22%22%2C%22l1%22%3A4%7D; _yep_uuid=fd95b6b7-090e-c6e5-cb8c-b8387e5b29ab; _ga=GA1.1.376581816.1643601078; newstatisticUUID=1643601078_1599172947; _csrfToken=m8mDkhtjc381bOHrIGiYTkE1g3bUzgPZjExmmO9l; _ga_FZMMH98S83=GS1.1.1643601077.1.1.1643601098.0; _ga_PFYW0QLV3P=GS1.1.1643601077.1.1.1643601098.0'
    }
# 响应数据
response = requests.get(url, headers=headers)
response_text = response.text
html_data = etree.HTML(response_text)
#通过xpath获得题目
title_list = html_data.xpath('//h2/a/text()')
print(title_list)

**运行代码可以看到第一页的小说名字都出来了(以列表的形式)
**
在这里插入图片描述
当然我们还要获得这些小说的月票数
在这里插入图片描述
可以看出月票数没有直接的显示出来那我们先把这未显示的拿到

# 利用正则获取月票数
re_data = re.findall('</style><span class=".*?">(.*?)</span>', response_text) 
print(re_data)

效果如下
在这里插入图片描述
可以看出这跟网页上的显示的不一样啊,这是啥呀,于是可以猜想此月票数应该是进行了字体加密了为了验证此想法在字体上找到了一个src
在这里插入图片描述
并且此src还是动态的(心态崩了)每次进入此网页就会随机生成以下是我在network的font进行对比
在这里插入图片描述
在这里插入图片描述
于是获得动态字体url的代码如下

 # 利用正则获取动态url
font_url = re.findall(r"format\('eot'\); src: url\('(.*?)'\) format\('woff'\)", response_text)[0]
print(font_url)

然后后面的思路就清晰了直接用获得的字体包来解密源码中加密的数据就行了

# 发送请求,下载字体加密文件
font_response = requests.get(font_url, headers=headers)
with open('jiemi.woff','wb')as f:
      f.write(font_response.content)
#解析字体解密文件
#创建TTFont对象
font_obj = TTFont('jiemi.woff')
#转换成xml明文格式
font_obj.saveXML('jiemi.xml')

# 获取映射表
cmap_dict = font_obj.getBestCmap()
print("字体加密映射表", cmap_dict)
# 去掉加密后的特殊符号 &#  &#100196 =》100196  re_data
for i in enumerate(re_data):
	new_font_list = re.findall(r'\d+', i[1])
    re_data[i[0]] = new_font_list
print("去掉特殊符号", re_data)
# 把关系映射表的英文数字改成阿拉伯数字  {100196: '3'}
dict_e_a = {
        "one": '1', "two": '2', "three": '3', "four": '4', "five": "5", "six": '6', "seven": "7", "eight": '8', "nine": '9',
        "zero": '0'
    }

# 遍历关系映射表
for i in cmap_dict:
# 遍历dict_e_a
     for j in dict_e_a:
     # dict_的值等于dict_e_a的键
     	if cmap_dict[i] == j:
        	cmap_dict[i] = dict_e_a[j]

print("替换成数字后的关系映射表", cmap_dict)

# 10.通过匹配response去掉特殊符号的值 和 改成阿拉伯数字后的关系映射表,把密文改成明文  100196   =》 3
for i in re_data:  # 去掉response去掉特殊符号的值[[],[],[]]
	print(i)  #  ['100388', '100389', '100388', '100385', '100385']
    for j in enumerate(i):  # 100388
            # print(j)
    for k in cmap_dict:  # 改成阿拉伯数字后的关系映射表
                # print(k)
    if j[1] == str(k):
    	print(j[0])
        i[j[0]] = cmap_dict[k]
print("解析之后的月票数", re_data)

# 对单个明文进行拼接成完整的月票数
list_ = []
for i in re_data:
	j = ''
	for k in i:
		j += k
    list_.append(j)
print("最终的月票明文数据列表", list_)

# 11.把书名和字典名进行组成字典{"书名":"月票数"}
rank_dict = {}
for i in range(len(title_list)):
	rank_dict[title_list[i]] = list_[i]

这样还不够我有搞了个多页,翻页不是很难,就是这个解密不是很好搞观察第一页第二页第三页的url的不同
第一页:https://www.qidian.com/rank/yuepiao/year2022-month01/
第二页:https://www.qidian.com/rank/yuepiao/year2022-month01-page2/
第三页:https://www.qidian.com/rank/yuepiao/year2022-month01-page3/
发现规律,完整翻页代码如下

import random
import requests
import time
from lxml import etree
from fontTools.ttLib import TTFont
import re

pages = int(input('请输入要查询的页数'))
for page in range(pages):
    if page == 0:
        # 确定起点中文网月票排行榜网址
        url = 'https://www.qidian.com/rank/yuepiao/year2022-month01/'
    else:
        pages_i=1
        url = f'https://www.qidian.com/rank/yuepiao/year2022-month01-page{pages_i+page}/'
    # 请求头
    headers = {
        'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.193 Safari/537.36',
        'referer': 'https://www.qidian.com/rank/',
        'cookie': 'e1=%7B%22pid%22%3A%22qd_P_rank_01%22%2C%22eid%22%3A%22qd_C19%22%2C%22l1%22%3A4%7D; e2=%7B%22pid%22%3A%22qd_P_rank_01%22%2C%22eid%22%3A%22%22%2C%22l1%22%3A4%7D; _yep_uuid=fd95b6b7-090e-c6e5-cb8c-b8387e5b29ab; _ga=GA1.1.376581816.1643601078; newstatisticUUID=1643601078_1599172947; _csrfToken=m8mDkhtjc381bOHrIGiYTkE1g3bUzgPZjExmmO9l; _ga_FZMMH98S83=GS1.1.1643601077.1.1.1643601098.0; _ga_PFYW0QLV3P=GS1.1.1643601077.1.1.1643601098.0'
    }
    # 响应数据
    response = requests.get(url, headers=headers)
    response_text = response.text
    html_data = etree.HTML(response_text)
    # 通过xpath获得题目
    title_list = html_data.xpath('//h2/a/text()')
    print(title_list)
    # 利用正则获取月票数
    re_data = re.findall('</style><span class=".*?">(.*?)</span>', response_text)
    print(re_data)
    # 利用正则获取动态url
    font_url = re.findall(r"format\('eot'\); src: url\('(.*?)'\) format\('woff'\)", response_text)[0]
    # 发送请求,下载字体加密文件
    font_response = requests.get(font_url, headers=headers)
    with open('jiemi.woff','wb')as f:
        f.write(font_response.content)
    #解析字体解密文件
    #创建TTFont对象
    font_obj = TTFont('jiemi.woff')
    #转换成xml明文格式
    font_obj.saveXML('jiemi.xml')
    # 获取映射表
    cmap_dict = font_obj.getBestCmap()
    print("字体加密映射表", cmap_dict)
    # 去掉加密后的特殊符号 &#  &#100196 =》100196  re_data
    for i in enumerate(re_data):
        # print(i)
        new_font_list = re.findall(r'\d+', i[1])
        re_data[i[0]] = new_font_list
    print("去掉特殊符号", re_data)
    # 把关系映射表的英文数字改成阿拉伯数字  {100196: '3'}
    dict_e_a = {
        "one": '1', "two": '2', "three": '3', "four": '4', "five": "5", "six": '6', "seven": "7", "eight": '8', "nine": '9',
        "zero": '0'
    }
    # 遍历关系映射表
    for i in cmap_dict:
        # 遍历dict_e_a
        for j in dict_e_a:
            # dict_的值等于dict_e_a的键
            if cmap_dict[i] == j:
                cmap_dict[i] = dict_e_a[j]
    print("替换成数字后的关系映射表", cmap_dict)
    # 10.通过匹配response去掉特殊符号的值 和 改成阿拉伯数字后的关系映射表,把密文改成明文  100196   =》 3
    for i in re_data:  # 去掉response去掉特殊符号的值[[],[],[]]
        print(i)  #  ['100388', '100389', '100388', '100385', '100385']
        for j in enumerate(i):  # 100388
            # print(j)
            for k in cmap_dict:  # 改成阿拉伯数字后的关系映射表
                # print(k)
                if j[1] == str(k):
                    print(j[0])
                    i[j[0]] = cmap_dict[k]
    print("解析之后的月票数", re_data)
    # 对单个明文进行拼接成完整的月票数
    list_ = []
    for i in re_data:
        j = ''
        for k in i:
            j += k
        list_.append(j)
    print("最终的月票明文数据列表", list_)
    # 把书名和字典名进行组成字典{"书名":"月票数"}
    rank_dict = {}
    for i in range(len(title_list)):
        rank_dict[title_list[i]] = list_[i]
    print(f"第{page+1}最终的结果", rank_dict)
    print('-'*50)
    #防止反爬,随即休眠1到2秒
    time.sleep(random.randint(1,2))

效果如下:

在这里插入图片描述
喜欢此文章的可以点在关注我,后续会发布更多好文章(●’?’●)

  Python知识库 最新文章
Python中String模块
【Python】 14-CVS文件操作
python的panda库读写文件
使用Nordic的nrf52840实现蓝牙DFU过程
【Python学习记录】numpy数组用法整理
Python学习笔记
python字符串和列表
python如何从txt文件中解析出有效的数据
Python编程从入门到实践自学/3.1-3.2
python变量
上一篇文章      下一篇文章      查看所有文章
加:2022-02-01 20:33:48  更:2022-02-01 20:34:14 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2025年2日历 -2025/2/21 3:46:06-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码