赞
踩
①采集网页属于静态网页
②网站做了字体反爬,关键信息在html中是乱码
① 网站采取的一种反爬措施
② 通过自定义字体文件的方式,让前端显示正常,但在html中是乱码
③ 一般自定义的字体文件是随机的,每次请求都会改变。还有一种字体反爬更加变态,在字体文件中还有一次随机,这样子即使获取到字体文件也很难找到字体Unicode与前端显示本文的正确对应关系,这种程度的反爬,我想应该需要通过机器学习来解决,本文并没有对此作答。
①通过对整个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
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。