ホームページ >バックエンド開発 >Python チュートリアル >Python クローラー --- Autohome フォントのクロール防止

Python クローラー --- Autohome フォントのクロール防止

云罗郡主
云罗郡主オリジナル
2019-01-21 10:58:064784ブラウズ





この記事では、Python クローラーに関する内容をお届けします--- Autohome フォントの逆クロールには一定の参考値がありますので、困っている友人は参考にしていただければ幸いです。

対象 Web サイト: Autohome

対象 Web サイト: https://club.autohome.com.cn/bbs/thread/2d8a42404ba24266/77486027-1.html#pvareaid=2199101

理由:

今日、昔の同僚に「オートホーム」というサイトを見てほしいと頼まれ、最初はクローリング対策などしなくても大丈夫だろうと思って見ていたのですが、実際に運用しているうちに、フォントであることが判明しました アンチクロール暗号化が実行されます。

ソース コードを表示:

Python クローラー --- Autohome フォントのクロール防止

驚かずにはいられませんが、これは UTF-8 でエンコードされたテキストですか?そこでオンラインで変換しました。

Python クローラー --- Autohome フォントのクロール防止

#変換後も、入手したフォントが依然として偽のフォントであることがわかりました。悪いことを信じず、記事をもう一度メモ帳に貼り付けたところ、次のことがわかりました。

Python クローラー --- Autohome フォントのクロール防止

これらのフォントは貼り付けることができないことがわかりました。まあ、フォント設定がクロール対策になっていると考えるしかありません。ソース コードに

があったので、myfont を調べて何か見つかるかどうかを確認しました。その結果、本当に見つけたものがありました。

これは ..ttf フォントではないでしょうか?このフォントを使用して暗号化されていますか?次に、まずこのフォントをダウンロードして、推測が正しいかどうかを確認してください。フォントをダウンロードした後、ttf フォントを表示するためのツールが次のとおりです: Font Creator (自分でダウンロード...) ダウンロードして開いて表示

Python クローラー --- Autohome フォントのクロール防止# 上の各文字はそのグリフとそのグリフ コードを示しているので、これら 2 つのフォントをどのように変換するかを考えずにはいられません。多くの大きなブログを調べていると、フォントの分析に特化した 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の間にあるものについて少し疑問があります。 。 関係?詳細な説明については、Zhihu を参照することをお勧めします:

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 クローラー --- Autohome フォントのクロール防止上記はすべて紹介です。皆さんが何かを得ることができれば幸いです。さらに

Python ビデオ チュートリアル

をご覧ください。 PHP 中国語 Web サイトに注意してください。




以上がPython クローラー --- Autohome フォントのクロール防止の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。