<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          一次Python爬蟲(chóng)實(shí)戰(zhàn),解決反爬問(wèn)題!

          共 2979字,需瀏覽 6分鐘

           ·

          2022-02-14 01:52

          ↑?關(guān)注 + 星標(biāo)?,每天學(xué)Python新技能

          后臺(tái)回復(fù)【大禮包】送你Python自學(xué)大禮包

          隨著互聯(lián)網(wǎng)的發(fā)展,Python的崛起,很多網(wǎng)站經(jīng)常被外面的爬蟲(chóng)程序騷擾,有什么方法可以阻止爬蟲(chóng)嗎?

          阻止爬蟲(chóng)也就稱(chēng)之為反爬蟲(chóng)反爬蟲(chóng)涉及到的技術(shù)比較綜合,說(shuō)簡(jiǎn)單也簡(jiǎn)單,說(shuō)復(fù)雜也復(fù)雜,看具體要做到哪種保護(hù)程度了。

          針對(duì)于不同的網(wǎng)站,它的反爬措施不一樣,常見(jiàn)的反爬有User-Agentip代理cookie認(rèn)證,js加密等等,與之對(duì)應(yīng)所保護(hù)的數(shù)據(jù)也不一樣。比如某寶某貓等電商網(wǎng)站,那么店鋪信息用戶(hù)信息就比較重要了,像是某眼電影網(wǎng)站,它對(duì)于電影評(píng)分,票房等信息做了反爬處理。

          我們今天的采集目標(biāo)網(wǎng)站是某論壇,當(dāng)對(duì)其文章的文本數(shù)據(jù)進(jìn)行采集時(shí),但是發(fā)現(xiàn)有字體反爬措施,就是有的文本數(shù)據(jù)被替換了。

          一、需求分析

          我們是需要爬取論壇文本數(shù)據(jù),如下圖所示:

          部分網(wǎng)頁(yè)源碼展示:

          我們發(fā)現(xiàn)文本數(shù)據(jù)是在網(wǎng)頁(yè)源碼里面的。

          二、發(fā)起請(qǐng)求

          import?requests
          url?=?"https://club.autohome.com.cn/bbs/thread/665330b6c7146767/80787515-1.html"
          header?=?{"User-Agent":?"Mozilla/5.0?(Windows?NT?10.0;?Win64;?x64)?AppleWebKit/537.36?(KHTML,?like?Gecko)?Chrome/86.0.4240.75?Safari/537.36"}
          r?=?requests.get(url,?headers=header)
          html?=?etree.HTML(r.text)??
          content?=?html.xpath("http://div[@class='tz-paragraph']//text()")
          print(content)

          然后得到如下數(shù)據(jù)(部分?jǐn)?shù)據(jù)截圖):

          雖然在網(wǎng)頁(yè)源碼里面存在目標(biāo)數(shù)據(jù),但是通過(guò)requests簡(jiǎn)單請(qǐng)求之后發(fā)現(xiàn)有的文字被特殊字符替換掉了,此時(shí)再次查看Elenments對(duì)應(yīng)的標(biāo)簽里的數(shù)據(jù),如下圖所示:

          由圖可以發(fā)現(xiàn)有的字被替換掉了,所以我們需要找到漢字被替換的方式,然后替換回去。

          三、字體替換

          我們知道系統(tǒng)字體一般都是xxxx.ttf的文件形式,如下圖所示:

          通過(guò)檢查發(fā)現(xiàn)該網(wǎng)站中使用的字體對(duì)應(yīng)的是myfont,這個(gè)很明顯是網(wǎng)站為了反爬設(shè)置的自定義的字體:

          了解css的伙計(jì)應(yīng)該知道,網(wǎng)頁(yè)的字體樣式放在了style標(biāo)簽里面,如下圖所示:

          然后拿到url對(duì)應(yīng)屬性(xxx57..ttf),

          //k3.autoimg.cn/g1/M02/D0/99/wKgHFVsUz1eAH_VRAABj9PS-ubk57..ttf

          查看后發(fā)現(xiàn)是一個(gè)字體文件:

          然后打開(kāi)字體查看文件,把字體文件拖拽進(jìn)去,如下圖所示:(使用軟件為FontCreator,可以查看字體的軟件)

          如果不想使用軟件,可以打開(kāi)百度字體平臺(tái)網(wǎng)站,對(duì)應(yīng)頁(yè)面和軟件打開(kāi)是一樣的

          粗略一看其實(shí)發(fā)現(xiàn)不了什么,所以我們需要使用fontTools第三方庫(kù)查看字體文件:

          from?fontTools.ttLib?import?TTFont
          font?=?TTFont('./wKgHFVsUz1eAH_VRAABj9PS-ubk57..ttf')
          print(font.getGlyphOrder())

          結(jié)果如下圖所示:

          然后我們發(fā)現(xiàn)比如在先前的特殊字符表中,

          這三個(gè)字應(yīng)該分別對(duì)應(yīng)于,,首先大對(duì)應(yīng)的后綴為edb8,在字體文件的輸出的列表中中有一個(gè)uniEDB8,對(duì)應(yīng)于第六個(gè),然后再FontCreator軟件中剛好對(duì)應(yīng)第六個(gè)漢字,如下圖所示:

          所以規(guī)律就是這樣的。

          四、數(shù)據(jù)抓取

          1、先把對(duì)應(yīng)的漢字打出來(lái)儲(chǔ)存在一個(gè)列表中;

          word_list?=?['很',?'五',?'多',?'遠(yuǎn)',?'大',?'十',?'更',?'了',?'的',?'矮',?'不',?'少',?'九',?'三',?'八',?'一',?'右',?'壞',?'近',?'著',?'呢','左',?'是',?'長(zhǎng)',?'六',?'上',?'短',?'七',?'高',?'二',?'得',?'好',?'下',?'和',?'四',?'地',?'小',?'低']

          2、把字體文件對(duì)應(yīng)的特殊字符保存到另一個(gè)列表中,邊進(jìn)行處理;

          font?=?TTFont('wKgHFVsUz1eAH_VRAABj9PS-ubk57..ttf')
          unilist?=?font.getGlyphOrder()
          uni_list?=?[]
          for?i?in?unilist[1:]:
          ????s?=?r'\u'?+?i[3:]
          ????uni_list.append(s)
          print(uni_list)

          但是問(wèn)題出現(xiàn)了,結(jié)果如下:

          我們發(fā)現(xiàn)出現(xiàn)了兩個(gè)反斜線,所以需要使用eval函數(shù)簡(jiǎn)單修改:

          font?=?TTFont('wKgHFVsUz1eAH_VRAABj9PS-ubk57..ttf')

          unilist?=?font.getGlyphOrder()
          #?print(unilist)

          uni_list?=?[]
          for?i?in?unilist[1:]:
          ????#?print(i)
          ????s?=?eval(r"'\u"?+?i[3:]?+?"'")
          ????#?print(s)
          ????uni_list.append(s)

          3、由于之前得到的不完整的文章數(shù)據(jù)是以一個(gè)列表的形式,所以需要把他拼接為字符串,然后使用replace(old,new),進(jìn)行替換:

          #?....前面代碼省略
          html?=?etree.HTML(result)??#?result為請(qǐng)求網(wǎng)頁(yè)源碼

          content?=?html.xpath("http://div[@class='tz-paragraph']//text()")

          contents?=?''.join(content)

          4、最后進(jìn)行替換:

          for?i?in?range(len(uni_list)):
          ????contents?=?contents.replace(uni_list[i],?word_list[i])

          print(contents)

          結(jié)果如下,文字替換成功:

          五、小結(jié)

          通常在爬取一些網(wǎng)站的信息時(shí),偶爾會(huì)碰到這樣一種情況:網(wǎng)頁(yè)瀏覽顯示是正常的,用 Python 爬取下來(lái)是亂碼,F(xiàn)12用開(kāi)發(fā)者模式查看網(wǎng)頁(yè)源代碼也是亂碼。這種一般是網(wǎng)站設(shè)置了字體反爬。

          字體反爬是一種比較常見(jiàn)的反爬方式,因?yàn)楹芏嗑W(wǎng)站的文字信息是比較重要的,像是前面提到的貓眼電影電影票房評(píng)分等數(shù)據(jù),非常重要,網(wǎng)站維護(hù)者當(dāng)然會(huì)把這種數(shù)據(jù)進(jìn)行反爬處理,只要好好分析,還是能夠抓取到目標(biāo)數(shù)據(jù)。

          推薦閱讀

          1. Python實(shí)現(xiàn)經(jīng)緯度換算+計(jì)算兩地距離+地理可視化(代碼全分享)

          2. 吳恩達(dá),新冠陽(yáng)性

          3. 誰(shuí)再說(shuō)不熟悉 Linux 命令,就把這個(gè)給他扔過(guò)去!

          4. 冒死曝光這個(gè)軟件,希望不要被封殺!

          5. 用 Python 自動(dòng)化下載抖X無(wú)水印短視頻


          您看此文用???分??秒,轉(zhuǎn)發(fā)只需1秒哦~

          瀏覽 88
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  香蕉国产成人 | 国产色变性手术情片亚洲 | 爱操逼网站 | 日成人AV | 亚洲天天看 |