#這篇文章帶給大家的內容是關於Python爬蟲---汽車之家字體反爬,有一定的參考價值,有需要的朋友可以參考一下,希望對你有幫助。
目標網站:汽車之家
目標網址:https://club.autohome.com.cn/bbs/thread/2d8a42404ba24266/77486027-1.html#pvareaid=2199101
#緣由:
今天原來的同事讓我看一個網站:“汽車之家”,起初看了看感覺應該沒有反爬措施吧,但是實際在操作中,發現原來是字體進行了反爬加密。
查看原始碼:
不禁驚訝,難道是UTF-8編碼的文字嗎?於是在線轉換,
透過轉換還是發現,取得到的竟然還是假的字體。不信邪的我重新把文章給貼到NotePad 上結果發現:
#原來這些字體是貼不上去的。好吧,只能考慮字體設定了反爬。看到原始碼中
那麼便透過myfont看是否能發現點東西不?結果還真有所發現
這不是..ttf字體嗎?難道是使用這種字體加密的嗎?那麼先下載下來這種字體看是否猜測正確,下載過字體後這邊推薦一款查看..ttf字體的一個工具:Font Creator(自行下載…)下載打開查看
##上邊每個字顯示其字形和其字形編碼,那麼不禁想了想,這兩種字體是怎麼轉換的呢?翻閱許多大佬部落格找到一款專門解析font的python包,fonttools。自行安裝pip install fonttools 參考連結: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:]]關於映射這點,其實是有點疑問的utf-8和unicode之間有什麼關係?建議參考知乎詳解:
https://www.zhihu.com/question/23374078
好了,上邊已經把所有的東西準備好了,寫一下程式碼吧。
# 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()結果展示:
以上就是對的全部介紹,希望大家可以有所收穫,更多
以上是Python爬蟲---汽車之家字體反爬的詳細內容。更多資訊請關注PHP中文網其他相關文章!