爬蟲實(shí)戰(zhàn)2.1 解決CSS字體加密—大眾點(diǎn)評(píng)店鋪信息采集

從現(xiàn)在開始连舍,會(huì)隨機(jī)對(duì)各大網(wǎng)站的一些信息進(jìn)行分析采集

1.目標(biāo)

今天采集大眾點(diǎn)評(píng)碘橘。先從簡單點(diǎn)的開始:采集大眾點(diǎn)評(píng)的美食類商家店鋪信息。其中包括類別驳糯、店名涛漂、圖片赏表、星級(jí)、點(diǎn)評(píng)數(shù)匈仗、人均消費(fèi)瓢剿、口味評(píng)分、環(huán)境評(píng)分悠轩、服務(wù)評(píng)分间狂、地址、推薦菜火架。

2.請求分析

首先先看一下鏈接跟頁面:
http://www.dianping.com/guangzhou/ch10/g103

采集頁面一覽

這里不同的類別下均有很多店鋪鉴象,由于看其他頁信息需登錄忙菠,所以這里我們先采集第一頁。
再看該頁的請求頭信息:
請求頭信息

這是一個(gè)get請求纺弊,而且沒有傳遞參數(shù),比較簡單
到這里基本的請求分析已經(jīng)完成了只搁,下面我們開始采集。

3.采集

首先俭尖,通過請求起始url,我們拿到所有類別的地址

    def get_response(self, req_url):
        """
        請求
        :param req_url:
        :return:
        """
        response = requests.get(f'{req_url}', headers=self._headers)
        if response.status_code == 200:
            return response.content.decode('utf-8')
        return None
    def run(self):
        # 1. 獲取所有類別地址
        response = self.get_response(self._start_url)
        content = etree.HTML(response)
        url_list = content.xpath('//div[@id="classfy"]//a/@href')

然后洞翩,通過請求這些地址稽犁,逐個(gè)去解析頁面,在這里問題來了骚亿,我們先看一下其中一個(gè)商家的相關(guān)信息:

店鋪圖片跟名稱

店鋪其他信息

從這里已經(jīng)找到了我們所有需要采集的信息了已亥,但是除了店鋪圖片名稱来屠、星級(jí)虑椎、推薦菜之外,其他的信息都是通過不同的符號(hào)來表示的俱笛,沒有顯示出真正的信息出來捆姜。到這里,我們可能就想到了反爬迎膜,其中的主要信息都被加密處理了泥技,那這種是怎樣加密的呢?這里就牽扯到了一種加密方法:CSS字體加密磕仅,先來簡單了解下珊豹。

CSS字體加密

css字體加密是一種自定義字體映射加密,簡單來說就是通過自定義的字體文件來渲染網(wǎng)頁中的文字榕订,網(wǎng)頁上看到的文字店茶,在網(wǎng)頁源碼中不再用文字表示,而是用相應(yīng)的字體編碼來表示劫恒。我們從頁面上復(fù)制也復(fù)制不出來贩幻,以此達(dá)到了反爬的效果。

那這種反爬怎樣去解決呢兼贸,接下來我們通過大眾點(diǎn)評(píng)的小例子來分析一下段直。
首先要解決css字體反爬,要先找到他在哪溶诞,我們來看一下:

字體加密文件

開放字體格式地址

通過上面我們可以看出加密的標(biāo)簽svgmtsi對(duì)應(yīng)有個(gè)class屬性鸯檬,點(diǎn)擊這個(gè)標(biāo)簽,可以看到對(duì)應(yīng)的css樣式螺垢,最上面有個(gè)字體類型的屬性也就是font-family喧务,我們進(jìn)入相應(yīng)的css文件中看到后面有個(gè).woff的文件url地址赖歌,.woff后綴的文件就是一種開放字體格式文件,同時(shí)功茴,我們也看到前面有.eot后綴的文件庐冯,這也是一種字體格式文件,不過他是支持ie的坎穿,我們這里用的google展父,所以使用后面一種。
那么玲昧,找到這個(gè)文件后栖茉,我們將它下載下來,同時(shí)用FontCreator這個(gè)軟件可以打開此類文件孵延,打開后就是這樣子的吕漂,通過對(duì)比發(fā)現(xiàn),跟網(wǎng)頁上的編碼是對(duì)應(yīng)的尘应。
字體文件內(nèi)容

上面初步認(rèn)識(shí)了一下css字體加密惶凝,接下來繼續(xù)我們采集的代碼:
前面我們到了信息提取這一部分,又通過css字體加密的分析犬钢,可以以以下步驟來完成解析(以點(diǎn)評(píng)數(shù)為例,附核心操作代碼):

  • 1.找到加密標(biāo)簽對(duì)應(yīng)的css文件苍鲜,文件中找到對(duì)應(yīng)的字體文件,下載
            response = self.get_response(url)
            content = etree.HTML(response)

            # 找到相關(guān)css文件
            css_path = content.xpath('//link[contains(@href, "svgtextcss")]/@href')[0]
            time.sleep(3)
            css_content = self.get_response(f'http:{css_path}')

            # 點(diǎn)評(píng)數(shù)
            self.parse_review_num(css_content, content.xpath('//a[@class="review-num"]'))
  • 2.對(duì)字體文件轉(zhuǎn)換娜饵,這里用到了fontTools庫坡贺,可以將.woff文件中的字體編碼提取出來
        # 下載字體文件,如沒有則下載箱舞,已存在則直接解析
        if not os.path.exists(woff_path):
            # 下載字體文件
            response = requests.get(f'http:{woff_url[0]}.woff', headers=self._headers)
            with open(woff_path, 'wb') as f:
                f.write(response.content)
            # 這里轉(zhuǎn)為xml格式是為了前期的分析跟后面的信息提取
            time.sleep(2)
            # 解析成xml文件
            font_content = TTFont(woff_path)
            font_content.saveXML(xml_path)
            # 獲取字體對(duì)應(yīng)的編碼列表
            uni_list = font_content['cmap'].tables[0].ttFont.getGlyphOrder()
            uni_list = [uni_code for uni_code in uni_list if uni_code.startswith('uni')]
  • 3.將字體文件轉(zhuǎn)換為xml文件后遍坟,通過xml文件跟woff文件對(duì)部分加密文字跟對(duì)應(yīng)編碼一一映射
        # 判斷拿到的編碼在不在字體編碼列表中
        if f'uni{str(code_one, encoding="utf-8")[2:]}' in uni_list:
            # 如存在,則解析對(duì)應(yīng)的xml文件
            DOMTree = parse(xml_path)
            rootNode = DOMTree.documentElement
            # 找到字體文件的坐標(biāo)標(biāo)簽
            contentNodes = rootNode.getElementsByTagName("glyf")[0].getElementsByTagName('TTGlyph')[1:]
  • 4.根據(jù)映射關(guān)系將頁面源碼中的編碼替換為相應(yīng)的文字晴股,至此解析完成

看下解析成功后的結(jié)果(內(nèi)容較多愿伴,拿出一條來舉例):

# 解析之前的編碼
[b'\\ue7e9', b'\\uecd9', b'\\uf1eb', b'\\uf350']
# 解析完成之后的真實(shí)數(shù)據(jù)
['2', '5', '6', '3']

最最后,看下存到MongoDB中的結(jié)果


最終結(jié)果

至此电湘,CSS字體文件加密已經(jīng)基本上分析完成隔节,上面紅框的部分信息不全的原因是字體映射我只做了其中一部分,所以有些加密的字體還沒有做映射寂呛,有興趣的可以自己研究一下怎诫。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市贷痪,隨后出現(xiàn)的幾起案子幻妓,更是在濱河造成了極大的恐慌,老刑警劉巖劫拢,帶你破解...
    沈念sama閱讀 222,000評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件肉津,死亡現(xiàn)場離奇詭異强胰,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)妹沙,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,745評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門偶洋,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人距糖,你說我怎么就攤上這事玄窝。” “怎么了悍引?”我有些...
    開封第一講書人閱讀 168,561評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵哆料,是天一觀的道長。 經(jīng)常有香客問我吗铐,道長,這世上最難降的妖魔是什么杏节? 我笑而不...
    開封第一講書人閱讀 59,782評(píng)論 1 298
  • 正文 為了忘掉前任唬渗,我火速辦了婚禮,結(jié)果婚禮上奋渔,老公的妹妹穿的比我還像新娘镊逝。我一直安慰自己,他們只是感情好嫉鲸,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,798評(píng)論 6 397
  • 文/花漫 我一把揭開白布撑蒜。 她就那樣靜靜地躺著,像睡著了一般玄渗。 火紅的嫁衣襯著肌膚如雪座菠。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,394評(píng)論 1 310
  • 那天藤树,我揣著相機(jī)與錄音浴滴,去河邊找鬼。 笑死岁钓,一個(gè)胖子當(dāng)著我的面吹牛升略,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播屡限,決...
    沈念sama閱讀 40,952評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼品嚣,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了钧大?” 一聲冷哼從身側(cè)響起翰撑,我...
    開封第一講書人閱讀 39,852評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎拓型,沒想到半個(gè)月后额嘿,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體瘸恼,經(jīng)...
    沈念sama閱讀 46,409評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,483評(píng)論 3 341
  • 正文 我和宋清朗相戀三年册养,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了东帅。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,615評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡球拦,死狀恐怖靠闭,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情坎炼,我是刑警寧澤愧膀,帶...
    沈念sama閱讀 36,303評(píng)論 5 350
  • 正文 年R本政府宣布,位于F島的核電站谣光,受9級(jí)特大地震影響檩淋,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜萄金,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,979評(píng)論 3 334
  • 文/蒙蒙 一蟀悦、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧氧敢,春花似錦日戈、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,470評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至唯袄,卻和暖如春弯屈,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背恋拷。 一陣腳步聲響...
    開封第一講書人閱讀 33,571評(píng)論 1 272
  • 我被黑心中介騙來泰國打工季俩, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人梅掠。 一個(gè)月前我還...
    沈念sama閱讀 49,041評(píng)論 3 377
  • 正文 我出身青樓酌住,卻偏偏與公主長得像,于是被迫代替她去往敵國和親阎抒。 傳聞我的和親對(duì)象是個(gè)殘疾皇子酪我,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,630評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容