> 백엔드 개발 > 파이썬 튜토리얼 > Python 크롤러---Autohome 글꼴 크롤링 방지

Python 크롤러---Autohome 글꼴 크롤링 방지

云罗郡主
풀어 주다: 2019-01-21 11:13:28
원래의
4756명이 탐색했습니다.





# 🎜 🎜#이 기사에서 제공하는 내용은 Python 크롤러---오토홈 글꼴 역방향 크롤링에 대한 것입니다. 필요한 친구가 참고할 수 있기를 바랍니다.

대상 웹사이트: Autohome

대상 웹사이트: https://club.autohome.com.cn/bbs/thread/2d8a42404ba24266/77486027-1.html#pvareaid =2199101

이유:

오늘 제 옛 동료가 "Auto Home"이라는 웹사이트를 보라고 했습니다. 처음에는 등반 방지 조치가 없어야 한다고 생각했지만. 실제로 작업 중에 해당 글꼴이 크롤링 방지 및 암호화된 것으로 밝혀졌습니다.

소스 코드 보기:

Python 크롤러---Autohome 글꼴 크롤링 방지

놀랄 수밖에 없습니다. UTF-8로 인코딩된 텍스트인가요? 그래서

Python 크롤러---Autohome 글꼴 크롤링 방지

으로 온라인으로 변환했는데, 받은 글꼴이 여전히 가짜 글꼴인 것을 발견했습니다. 믿을 수 없어서 기사를 다시 NotePad++에 붙여넣었고 다음을 발견했습니다.

Python 크롤러---Autohome 글꼴 크롤링 방지

이 글꼴은 붙여넣을 수 없는 것으로 나타났습니다. 글쎄, 우리는 글꼴 설정이 크롤링 방지라는 점만 고려할 수 있습니다. 소스코드에

가 있어서 혹시 찾을 수 있을까 해서 myfont 를 살펴봤습니다. 그 결과 정말 뭔가를 발견했습니다

이거...ttf 폰트 아닌가요? 이 글꼴을 사용하여 암호화됩니까? 그런 다음 먼저 이 글꼴을 다운로드하여 추측이 올바른지 확인하세요. 글꼴을 다운로드한 후 다음과 같은 도구를 사용하여 ttf 글꼴을 볼 수 있습니다. 글꼴 생성기(직접 다운로드...) 다운로드하고 열어서 보세요.

#🎜 🎜#

Python 크롤러---Autohome 글꼴 크롤링 방지 위의 각 문자는 해당 문자와 ​​문자 코드를 표시하므로 이에 대해 생각하지 않을 수 없습니다. 이 두 글꼴은 어떻게 변환됩니까? 여러 대형 블로그를 뒤지다가 글꼴 분석을 전문으로 하는 Python 패키지, FontTools를 발견했습니다. pip installfonttools를 직접 설치하십시오. 참조 링크: 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과 약간의 의심이 있습니다. 유니코드. 그게 무슨 상관이야? 자세한 설명은 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 중국어 홈페이지를 주목해주세요.




# 🎜 🎜#

위 내용은 Python 크롤러---Autohome 글꼴 크롤링 방지의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:csdn.net
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿