採集萬方醫藥方向的期刊+文章+做者信息(數據量千萬級)

  最近將萬方數據的爬取代碼進行了重構,速度大概有10w每小時吧,由於屬於公司項目,代碼暫時就不開源了,因此在這裏先說說思路和一些注意事項吧,順帶吐槽一下萬方。html

  先上圖:redis

  

  其實邏輯也蠻簡單的,醫學類的期刊分了16個大類,那麼首先手動將這16大類所對應的惟一id拿下來拼接出該類型的url,而後翻頁請求它就能夠得到該類型下的每一篇期刊的信息。json

  而後咱們拿到了每一個期刊的id,就能夠拼接出每個期刊的主頁url,可是這時就會發現,萬方中的期刊主頁路由是有兩套的:我將其稱之爲新版/老版微信

  新版:http://www.wanfangdata.com.cn/sns/user/qkzgf4cookie

  老版:http://www.wanfangdata.com.cn/perio/detail.do?perio_id=zgjhmyurl

  這兩個版本的url是不一樣的,那麼如何甄別那一篇期刊是新版仍是老版呢?畢竟咱們如今只知道期刊的id,這裏我用的辦法是默認將每一篇期刊均視爲老版,而後利用期刊id拼接出老版的url,代理

  若是這篇期刊真是老版,那麼就能夠請求到期刊主頁,若是它是新版,那麼他就會被重定向到新版主頁,最終咱們只須要觀察它的response.url就清楚了。code

  爲何說要分辨期刊屬於新版仍是老版呢,覺得關係到下一步請求該期刊中全部文章的問題。orm

  由於萬方中每個期刊都是規則的,有一個時間樹,代表這篇文章屬於哪一個期刊、哪一年、哪一期,因此咱們想要獲取這個期刊中的全部文章,首先就須要解析這個期刊的時間樹,可是新版和老版時間樹是不同的。htm

  看圖:

  

  

  看到沒,這就是上一步咱們要來辨別期刊是新版仍是老版的緣由了。

  既然知道了期刊是新版仍是老版,那麼下一步咱們就須要來請求時間樹以得到這個期刊的全部年份和每年有多少期,覺得下一步請求文章內須要用到這些信息。

  原本請求到時間樹再進行解析,拿到有用信息後根據每一期每一期的請來求文章json應該是美滋滋的事情,可是獲得的反饋卻並不怎麼好,由於我發現最終請求到的文章只有不多一部分,其餘的都請求不到,返回空json,

  我百思不得其解,而後就各類開始搗鼓,像什麼換代理啊,換UA啊,加cookie啊是一頓操做,結果是一頓操做猛如虎,一看結果250,這就很尷尬,最終折騰了很久終於被我發現了問題得關鍵所在,那就是這個:

  

  看到沒,時間樹解析下來2019年共出了7期文章,給的是01,02直到07, 可是在請求時倒是 1到 7,0沒了。。。因此致使請求的結果都是空的。

  但即便是這樣,在請求每一期文章時還會有問題,只是這個問題只在老版本中出現,那就是在解析時間樹後一期一期請求文章,按理說請求的結果都會是一個json,

  可是在老版本這兒會是否是返回一個html,致使我程序報錯,由於我都是將返回結果按照json來處理的,直到如今我都沒搞明白爲何回忽然不返回json而返回html,我猜應該是請求過快了吧。

  因此我多加了一部處理,當發現返回的不是json時就將這個期刊的id+年份+期數放到redis中,而後另起一個job來從redis中將其取出來再此進行請求,請求到json就其從set中去除,否則就又將其放到set中,循環請求。

  這樣最終再解析請求到的這一期的文章json就獲得文章內容了,文章的做者信息也在這個json中。

  這就是整個流程了。 接下來是吐槽環節:

  不得不說萬方真的是太愛改版了,最開始叫萬方醫學,後來改成了萬方數據,而後好巧不巧在我此次採集期間又又又改版了,並且被我當場發現了,而且從中發現了一個接口:

  http://www.wanfangdata.com.cn/perio/page.do   

  這個接口是在萬方改版期間出現的,改版前沒有,改版後也沒有,就只出現了一小會兒,如今網頁中是看不到它的

  這個接口是用來請求那16個大類中又哪些期刊的,返回的json中包含了各個期刊的全部信息,比期刊主頁展現的信息要全的多,而且有兩點對個人工做有了很大的幫助,自己每一個期刊的時間樹都是要請求一次的,這樣無疑會拖慢爬蟲的速度,並且會出現請求不到的狀況,在這個接口中卻包含了期刊的時間樹,還有一個就是自己想要獲取這個期刊的影響因子的話,是須要請求期刊主頁來解析頁面的,如今也不用了,json中也有了,省了很多事兒,可是這個接口是不在萬方官網中顯示的,說明他們如今展現時用的不是這個接口,當初只是臨時用了一下子,之後會不會消失,不清楚。

  這是請求這個接口的formdata:  (code_name是那16大類的惟一標識)

  

 

 

   最後,打個廣告: 想了解更多Python關於爬蟲、數據分析的內容,獲取大量爬蟲爬取到的源數據,歡迎你們關注個人微信公衆號:悟道Python

  

相關文章
相關標籤/搜索