当前位置:   article > 正文

关于起点中文网字体反爬的解决方法——以阅读指数榜为例_起点小说反爬

起点小说反爬

一、准备阶段

1.目标网站观察

①采集网页属于静态网页
②网站做了字体反爬,关键信息在html中是乱码
在这里插入图片描述

二、关于起点中文网的字体反爬

1.什么是字体反爬

① 网站采取的一种反爬措施
② 通过自定义字体文件的方式,让前端显示正常,但在html中是乱码
③ 一般自定义的字体文件是随机的,每次请求都会改变。还有一种字体反爬更加变态,在字体文件中还有一次随机,这样子即使获取到字体文件也很难找到字体Unicode与前端显示本文的正确对应关系,这种程度的反爬,我想应该需要通过机器学习来解决,本文并没有对此作答。

2.对起点中文网的字体反爬的解析

①通过对整个html的分析,找到了下载woff字体文件的网址,截取出最重要的部分
在这里插入图片描述
②其中code对应的就是html页面中乱码的十六进制编码,name对应的应该就是数字的英文表达
③看到这里,思路其实就应该清晰了。但这应该算是最简单的字体反爬了,像58同城,还需要再找一组对应,最后结果应该是GlyphOrder标签中的id减去1;猫眼电影应该是最难的,属于我上述的双随机,可能需要KNN算法来解决。

三、代码逻辑

1.通过请求起始页面采集基本信息以及详细页面的url
2.在详细页面中利用re正则表达式解析得到字体下载文件和乱码部分
3.利用fontTools.ttLib解析字体文件得到对应camp
4.配合乱码部分的十六进制编码,得到正确结果
5.scrapy crawl main -o res.csv将结果保存为csv

四、代码部分

main.py

import scrapy
import re
import requests
from fontTools.ttLib import TTFont
from io import BytesIO
import time
from ..items import QidianxiaoshuoItem



class MainSpider(scrapy.Spider):
    name = 'main'
    # allowed_domains = ['main.com']
    # start_urls = ['https://www.qidian.com/rank/readIndex?page=1',
    #               'https://www.qidian.com/rank/readIndex?page=2']

    start_urls = [f'https://www.qidian.com/rank/readIndex?page={
     i}' for i in range(1,6)]



    def get_font(self,url):
        time.sleep(1)
        response = requests.get(url)
        font = TTFont(BytesIO(response.content))
        cmap = font
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号