天天看點

python3 爬取今日頭條文章(巧妙避開as,cp,_signature)

使用環境:

  • python3
  • scrapy
  • win10

爬取思路

(一)關于as、cp的生成與_signature的想法

對于今日頭條的爬蟲,網上搜尋出來的文章大多是基于崔慶才(通過搜尋爬取美女街拍的方案),怎麼說呢,類似這樣的雖說是個巧辦法,但是用到工作中卻是行不通的。在這裡,網上是搜了又搜,谷歌,百度都用上了。在這裡做一下今日頭條爬取文章的幾個方案。

  • 一個方案是:破解了as,cp,卻沒能破解_signature:

今日頭條的as、cp破解

用的技術有execjs,一個執行js代碼的架構,但是還是不能很好的把浏覽器環境(比如Node環境)嵌入進去,

  • [今日頭條爬蟲之:解析JS得到signature](http://notech.net/886.html)

使用了一個PyV8的js庫,主要的擷取_signature

給出了一段很操蛋的代碼:

def get_signature(self,user_id):
   """
   計算_signature    
   :param user_id: user_id不需要計算,對使用者可見
   :return: _signature
   """
   req = requests.Session()
   # js擷取目的
   jsurl = 'https://s3.pstatp.com/toutiao/resource/ntoutiao_web/page/profile/index_8f8a2fb.js'
   resp = req.get(jsurl,headers = self.headers)
   js =  resp.content
   effect_js = js.split("Function")
   js = 'var navigator = {};\
           navigator["userAgent"] = "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.87 Safari/537.36";\
        ' +  "Function" + effect_js[] + 
             "Function" + effect_js[] + 
        ";function result(){ return TAC.sign(" + user_id + ");} result();"
   # PyV8執行步驟
   with PyV8.JSLocker():
      self.ctxt.enter()  #已在上面初始化過
      vl5x = self.ctxt.eval(js) 
      self.ctxt.leave()
   self.LOG.info("聖誕快樂")
   return vl5x
           

PyV8這個庫在win10上死活安裝不上去,後面在centos7環境裝好了,執行這一段代碼,直接報了個記憶體不夠的錯誤好像,直接調用TAC.sign的方法卻少了Node環境(大一點講是浏覽器環境),還是報錯。可能這确實是個方法,不過在簡書上回報的人很少,不知道是我弄不出來,還是他們都弄出來了。

(二)後面索性直接用了自己的方法: 繞過_signature這個參數,直接請求網頁端(wap)的資料資訊。

右鍵檢查,點選到json一欄,選中其中一個url

URL一:

https://www.toutiao.com/pgc/ma/?page_type=1&max_behot_time=1532168614&uid=4377795668&media_id=4377795668&output=json&is_json=1&count=10&from=user_profile_app&version=2&as=A1054BF5B303CEE&cp=5B5353EC0EEE0E1&callback=jsonp5

URL二:

https://www.toutiao.com/pgc/ma/?page_type=1&max_behot_time=1532166905&uid=4377795668&media_id=4377795668&output=json&is_json=1&count=10&from=user_profile_app&version=2&as=A1C5EB457343CF5&cp=5B53839C4FC53E1&callback=jsonp6

as,cp在之前的文章中,我們已經能夠求出來了,現在需要做的就是如何拼接這一串url,

根據上面兩個url的對比,我們隻需要更換掉max_behot_time,和jsonp,

這樣整個清單頁的資料我們就擷取出來了。

python3 爬取今日頭條文章(巧妙避開as,cp,_signature)

接下來解析詳情頁的資料,大概就簡單了許多。

python3 爬取今日頭條文章(巧妙避開as,cp,_signature)

檢視網頁源代碼:

這正是我們想要的資料,使用正則擷取就可以了。

python3 爬取今日頭條文章(巧妙避開as,cp,_signature)

到這裡我們就将今日頭條的資料可以完全爬取出來了。

需要源碼的可以加小密圈:
python3 爬取今日頭條文章(巧妙避開as,cp,_signature)

更多原創部落格請通路:

徐代龍的技術專欄

https://blog.csdn.net/xudailong_blog/article/details/78762262

個人部落格

繼續閱讀