Der Inhalt dieses Artikels handelt vom Python-Crawler-- -Das Reverse-Crawling von Autohome-Schriftarten hat einen gewissen Referenzwert.
Zielwebsite: Autohome
Zielwebsite: https://club.autohome.com.cn/bbs/thread/2d8a42404ba24266/77486027-1.html#pvareaid=2199101
Grund:
Heute hat mich mein alter Kollege gebeten, mir eine Website anzusehen: „Auto Home“. Zuerst hatte ich das Gefühl, dass es keine Anti-Kletter-Maßnahmen geben sollte, aber während des eigentlichen Betriebs habe ich Es stellte sich heraus, dass es sich um eine Schriftart handelte. Es wurde eine Anti-Crawling-Verschlüsselung durchgeführt.
Quellcode anzeigen:
Ich kann nicht anders, als überrascht zu sein, handelt es sich um UTF-8-codierten Text? Also habe ich online konvertiert,
und durch die Konvertierung habe ich trotzdem herausgefunden, dass die Schriftarten, die ich bekommen habe, immer noch gefälscht waren. Da ich nicht an das Böse glaubte, habe ich den Artikel erneut in NotePad++ eingefügt und festgestellt:
Es stellt sich heraus, dass diese Schriftarten nicht eingefügt werden können. Nun, wir können nur davon ausgehen, dass die Schriftarteinstellungen Anti-Crawling sind. Wenn Sie
im Quellcode sehen, können Sie über myfont etwas finden? Am Ende habe ich wirklich etwas gefunden
Ist das nicht...ttf-Schriftart? Ist es mit dieser Schriftart verschlüsselt? Laden Sie dann zuerst diese Schriftart herunter, um zu sehen, ob die Vermutung richtig ist. Nach dem Herunterladen der Schriftart finden Sie hier ein Tool zum Anzeigen von TTF-Schriftarten: Font Creator (selbst herunterladen ...) Herunterladen und zum Anzeigen öffnen
Jedes Zeichen oben zeigt seine Glyphe und seinen Glyphencode, daher frage ich mich, wie diese beiden Schriftarten konvertiert werden. Als ich viele große Blogs durchstöberte, fand ich ein Python-Paket, das auf die Analyse von Schriftarten spezialisiert ist: Fonttools. Installieren Sie pip install fonttools selbst. Referenzlink: https://darknode.in/font/font-tools-guide/
# 那么便开始通过字体库进行解析 world = TTFont('./world.ttf') # 读取响应的映射关系 uni_list = world['cmap'].tables[0].ttFont.getGlyphOrder() # 'cmap' 表示汉字对应的映射 为unicode编码 print(uni_list) # 按顺序拿到各个字符的unicode编码 # 打印结果: ['.notdef', 'uniEDE8', 'uniED35', 'uniED87', 'uniECD3', 'uniED25', 'uniEC72', 'uniEDB2', 'uniEE04', 'uniED51', 'uniEC9D', 'uniECEF', 'uniEC3C', 'uniEC8D', 'uniEDCE', 'uniED1B', 'uniED6C', 'uniECB9', 'uniEDFA', 'uniEC57', 'uniED98', 'uniEDEA', 'uniED36', 'uniEC83', 'uniECD5', 'uniEC21', 'uniED62', 'uniEDB4', 'uniED00', 'uniED52', 'uniEC9F', 'uniEDDF', 'uniEC3D', 'uniED7E', 'uniECCA', 'uniED1C', 'uniEC69', 'uniECBB', 'uniEDFB'] # .notdef 并不是汉字的映射, 而是表示字体家族名称。 将映射列表转换成unicode的类型,因为自己文中获取的是字符串unicode类型的,当然你也可以转化为utf-8,不过你获取的文章内容也要转化为utf-8 unicode_list= [eval(r"u'\u" + uni[3:] + "'") for uni in uni_list[1:]]
Was die Zuordnung betrifft, habe ich tatsächlich einige Zweifel, was zwischen utf-8 und Unicode liegt . Beziehung? Es wird empfohlen, sich für eine detaillierte Erklärung an Zhihu zu wenden:
https://www.zhihu.com/question/23374078
Okay, oben wurde alles vorbereitet. Schreiben wir etwas Code.
# coding:utf-8 import re import requests from scrapy import Selector from fontTools.ttLib import TTFont class QiCheZhiJiaSpider: def article_content(self): url = 'https://club.autohome.com.cn/bbs/thread/2d8a42404ba24266/77486027-1.html#pvareaid=2199101' headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.119 Safari/537.36' } try: response = requests.get(url=url, headers=headers).text response_info = Selector(text=response) except BaseException as e: print(e) else: content = response_info.xpath('//div[@class="tz-paragraph"]//text()').extract() # 获取列表的形式内容。 # print(content) content_str = ''.join(content) # 紧接着获取字体的链接 world_href = re.findall(r",url\('(//.*\.ttf)'\).*", response, re.M or re.S)[0] world_href = 'https:' + world_href world_content = requests.get(url=world_href, headers=headers).content # 对获取到的字体进行下载.......... with open('./world.ttf', 'wb') as f: f.write(world_content) # 那么便开始通过字体库进行解析 world = TTFont('./world.ttf') # 读取响应的映射关系 uni_list = world['cmap'].tables[0].ttFont.getGlyphOrder() unicode_list = [eval(r"u'\u" + uni[3:] + "'") for uni in uni_list[1:]] world_list = ["右", "远", "高", "呢", "了", "短", "得", "矮", "多", "二", "大", "一", "不", "近", "是", "着", "五", "三", "九", "六", "少", "好", "上", "七", "和", "很", "十", "四", "左", "下", "八", "小", "坏", "低", "长", "更", "的", "地"] # # 录入字体文件中的字符。必须要以国际标准的unicode编码 for i in range(len(unicode_list )): content_str = content_str.replace(unicode_list [i], world_list[i]) print(content_str) if __name__ == '__main__': qi_che_zhi_jia = QiCheZhiJiaSpider() qi_che_zhi_jia.article_content()
Ergebnisanzeige:
Das Obige ist die gesamte Einführung, ich hoffe, Sie können etwas gewinnen, mehrPython-Video-Tutorial Bitte Achten Sie auf die chinesische PHP-Website.
Das obige ist der detaillierte Inhalt vonPython-Crawler --- Anti-Crawling für Autohome-Schriftarten. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!