<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>

          爬蟲,反爬蟲,反反爬蟲,這之間的斗爭(zhēng)恢宏壯闊...

          共 1405字,需瀏覽 3分鐘

           ·

          2020-02-13 23:26

          作者:申玉寶

          https://www.zhihu.com/question/28168585/answer/74840535


          爬蟲(Spider),反爬蟲(Anti-Spider),反反爬蟲(Anti-Anti-Spider),這之間的斗爭(zhēng)恢宏壯闊...


          Day 1


          小莫想要某站上所有的電影,寫了標(biāo)準(zhǔn)的爬蟲(基于HttpClient庫),不斷地遍歷某站的電影列表頁面,根據(jù) Html 分析電影名字存進(jìn)自己的數(shù)據(jù)庫。

          這個(gè)站點(diǎn)的運(yùn)維小黎發(fā)現(xiàn)某個(gè)時(shí)間段請(qǐng)求量陡增,分析日志發(fā)現(xiàn)都是 IP(1.1.1.1)這個(gè)用戶,并且 useragent 還是 JavaClient1.6 ,基于這兩點(diǎn)判斷非人類后直接在Nginx 服務(wù)器上封殺。


          Day 2


          小莫電影只爬了一半,于是也針對(duì)性的變換了下策略:1. useragent 模仿百度("Baiduspider..."),2. IP每爬半個(gè)小時(shí)就換一個(gè)IP代理。小黎也發(fā)現(xiàn)了對(duì)應(yīng)的變化,于是在 Nginx 上設(shè)置了一個(gè)頻率限制,每分鐘超過120次請(qǐng)求的再屏蔽IP。同時(shí)考慮到百度家的爬蟲有可能會(huì)被誤傷,想想市場(chǎng)部門每月幾十萬的投放,于是寫了個(gè)腳本,通過 hostname 檢查下這個(gè) ip 是不是真的百度家的,對(duì)這些 ip 設(shè)置一個(gè)白名單。


          Day 3


          小莫發(fā)現(xiàn)了新的限制后,想著我也不急著要這些數(shù)據(jù),留給服務(wù)器慢慢爬吧,于是修改了代碼,隨機(jī)1-3秒爬一次,爬10次休息10秒,每天只在8-12,18-20點(diǎn)爬,隔幾天還休息一下。

          小黎看著新的日志頭都大了,再設(shè)定規(guī)則不小心會(huì)誤傷真實(shí)用戶,于是準(zhǔn)備換了一個(gè)思路,當(dāng)3個(gè)小時(shí)的總請(qǐng)求超過50次的時(shí)候彈出一個(gè)驗(yàn)證碼彈框,沒有準(zhǔn)確正確輸入的話就把 IP 記錄進(jìn)黑名單。


          Day 4


          小莫看到驗(yàn)證碼有些傻臉了,不過也不是沒有辦法,先去學(xué)習(xí)了圖像識(shí)別(關(guān)鍵詞 PIL,tesseract),再對(duì)驗(yàn)證碼進(jìn)行了二值化,分詞,模式訓(xùn)練之后,識(shí)別了小黎的驗(yàn)證碼(關(guān)于驗(yàn)證碼,驗(yàn)證碼的識(shí)別,驗(yàn)證碼的反識(shí)別也是一個(gè)恢弘壯麗的斗爭(zhēng)史,這里先不展開....),之后爬蟲又跑了起來。


          小黎是個(gè)不折不撓的好同學(xué),看到驗(yàn)證碼被攻破后,和開發(fā)同學(xué)商量了變化下開發(fā)模式,數(shù)據(jù)并不再直接渲染,而是由前端同學(xué)異步獲取,并且通過 js 的加密庫生成動(dòng)態(tài)的 token,同時(shí)加密庫再進(jìn)行混淆(比較重要的步驟的確有網(wǎng)站這樣做,參見微博的登陸流程)。


          Day5


          混淆過的加密庫就沒有辦法了么?當(dāng)然不是,可以慢慢調(diào)試,找到加密原理,不過小莫不準(zhǔn)備用這么耗時(shí)耗力的方法,他放棄了基于 HttpClient的爬蟲,選擇了內(nèi)置瀏覽器引擎的爬蟲(關(guān)鍵詞:PhantomJS,Selenium),在瀏覽器引擎中js 加密腳本算出了正確的結(jié)果,又一次拿到了對(duì)方的數(shù)據(jù)。

          小黎:.....


          爬蟲與發(fā)爬蟲的斗爭(zhēng)還在繼續(xù)。

          不過實(shí)際應(yīng)用時(shí)候,一般大家做到根據(jù) IP 限制頻次就結(jié)束了,除非很核心的數(shù)據(jù),不會(huì)再進(jìn)行更多的驗(yàn)證,畢竟工程的問題一半是成本的問題。


          至于高效部分,一些 Tips:


          1.盡量減少請(qǐng)求次數(shù),能抓列表頁就不抓詳情頁

          2.不要只看 Web 網(wǎng)站,還有 App 和 H5,他們的反爬蟲措施一般比較少

          3.如果真的對(duì)性能要求很高,可以考慮多線程(一些成熟的框架如 scrapy都已支持),甚至分布式


          ---END---想加小猿微信,可以加一下,每天最多同意100人▲長按加好友
          瀏覽 74
          點(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>
                  黄色一级a片网站 | 三级网站在线视频 | 免费看日韩黄色电影 | 国产精品扒开腿 | 亚洲视频完整版在线观看 |