一、准备阶段
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