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

一、准备阶段

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
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值