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

来源:https://www.cnblogs.com/ss-py/archive/2019/09/22/11569976.html
-Advertisement-
Play Games

最近將萬方數據的爬取代碼進行了重構,速度大概有10w每小時吧,因為屬於公司項目,代碼暫時就不開源了,所以在這裡先說說思路和一些註意事項吧,順帶吐槽一下萬方。 先上圖: 其實邏輯也蠻簡單的,醫學類的期刊分了16個大類,那麼首先手動將這16大類所對應的唯一id拿下來拼接出該類型的url,然後翻頁請求它就 ...


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

  先上圖:

  

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

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

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

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

  這兩個版本的url是不同的,那麼如何甄別那一篇期刊是新版還是老版呢?畢竟我們現在只知道期刊的id,這裡我用的辦法是預設將每一篇期刊均視為老版,然後利用期刊id拼接出老版的url,

  如果這篇期刊真是老版,那麼就可以請求到期刊主頁,如果它是新版,那麼他就會被重定向到新版主頁,最終我們只需要觀察它的response.url就清楚了。

  為什麼說要分辨期刊屬於新版還是老版呢,以為關係到下一步請求該期刊中所有文章的問題。

  因為萬方中每一個期刊都是規則的,有一個時間樹,表明這篇文章屬於哪個期刊、哪一年、哪一期,所以我們想要獲取這個期刊中的所有文章,首先就需要解析這個期刊的時間樹,但是新版和老版時間樹是不一樣的。

  看圖:

  

  

  看到沒,這就是上一步我們要來辨別期刊是新版還是老版的原因了。

  既然知道了期刊是新版還是老版,那麼下一步我們就需要來請求時間樹以獲得這個期刊的所有年份和每一年有多少期,以為下一步請求文章內需要用到這些信息。

  本來請求到時間樹再進行解析,拿到有用信息後根據每一期每一期的請來求文章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

  

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 一 URL配置 "Django 1.11版本 URLConf官方文檔" URL配置(URLconf)就像Django 所支撐網站的目錄。它的本質是URL與要為該URL調用的視圖函數之間的映射表。你就是以這種方式告訴Django,對於這個URL調用這段代碼,對於那個URL調用那段代碼。 基本格式 註意 ...
  • 一 web框架的本質及自定義web框架 我們可以這樣理解:所有的Web應用本質上就是一個socket服務端,而用戶的瀏覽器就是一個socket客戶端,基於請求做出響應,客戶都先請求,服務端做出對應的響應,按照http協議的請求協議發送請求,服務端按照http協議的響應協議來響應請求,這樣的網路通信, ...
  • 一、創建一個學生類 每個學生都有學號信息,但是每一個學生的學號都是不同的,所以要訪問這個學號必須先創建對象,通過對象去訪問學號信息,學號信息不能直接通過“類”去訪問,所以這種成員變數又被稱為“實例變數” 註意: (1)對象又被稱為實例,實例變數又被稱為對象變數(對象級別的變數) (2)不創建對象,這 ...
  • 除了基本的docker pull、docker image、docker ps,還有一些命令及參數也很重要,在此記錄下來避免遺忘。 環境信息 以下是本次操作的環境: 1. 操作系統:CentOS Linux release 7.7.1908 2. Docker:19.03.2 假設當前環境正運行著兩 ...
  • PHP開啟目錄引索 一. 前言 不知為何對nginx情有獨鍾, 最近練習php, 為了方便寫代碼, 便想要開啟nginx的目錄索引功能, 顯然不如Apache開啟的方便, 幾次嘗試都崩了... 我這個小白確實有點看不懂nginx的配置文件. 不過最後還是成功了, 記錄一下, 萬一哪天忘了, 回來看看 ...
  • 今天開始改變寫博客風格,其他不多說. 今天題目如下: 我先寫自己的寫程式的方法,先直接看正確完整的代碼直接往下看 一開始看了題目,我發現的規律是"alex"、"name"、"hobby"由多個變成一個 因此我想到了用set集合去重 我是想要把user_list列表的鍵收集起來變成列表,然後通過set ...
  • Spring Boot 項目中使用 JSP: 項目結構:需要添加webapp文件夾用來存放目錄 jsp 文件 在配置文件application.properties中指定 jsp 的位置和尾碼。spring.mvc.view.prefix=/WEB-INF/jsp/spring.mvc.view.s ...
  • 上篇文章 "SpringBoot自動裝配原理解析" 中,我們分析了SpringBoot的自動裝配原理以及 註解的原理,本篇文章則繼續基於上篇文章中的main方法來分析 這個類 點擊 方法一路跟蹤下來,發現首先做的是實例化 對象實例 1. 首先看一下 方法 大抵意思就是根據當前項目中是否存在上方的幾個 ...
一周排行
    -Advertisement-
    Play Games
  • GoF之工廠模式 @目錄GoF之工廠模式每博一文案1. 簡單說明“23種設計模式”1.2 介紹工廠模式的三種形態1.3 簡單工廠模式(靜態工廠模式)1.3.1 簡單工廠模式的優缺點:1.4 工廠方法模式1.4.1 工廠方法模式的優缺點:1.5 抽象工廠模式1.6 抽象工廠模式的優缺點:2. 總結:3 ...
  • 新改進提供的Taurus Rpc 功能,可以簡化微服務間的調用,同時可以不用再手動輸出模塊名稱,或調用路徑,包括負載均衡,這一切,由框架實現並提供了。新的Taurus Rpc 功能,將使得服務間的調用,更加輕鬆、簡約、高效。 ...
  • 本章將和大家分享ES的數據同步方案和ES集群相關知識。廢話不多說,下麵我們直接進入主題。 一、ES數據同步 1、數據同步問題 Elasticsearch中的酒店數據來自於mysql資料庫,因此mysql數據發生改變時,Elasticsearch也必須跟著改變,這個就是Elasticsearch與my ...
  • 引言 在我們之前的文章中介紹過使用Bogus生成模擬測試數據,今天來講解一下功能更加強大自動生成測試數據的工具的庫"AutoFixture"。 什麼是AutoFixture? AutoFixture 是一個針對 .NET 的開源庫,旨在最大程度地減少單元測試中的“安排(Arrange)”階段,以提高 ...
  • 經過前面幾個部分學習,相信學過的同學已經能夠掌握 .NET Emit 這種中間語言,並能使得它來編寫一些應用,以提高程式的性能。隨著 IL 指令篇的結束,本系列也已經接近尾聲,在這接近結束的最後,會提供幾個可供直接使用的示例,以供大伙分析或使用在項目中。 ...
  • 當從不同來源導入Excel數據時,可能存在重覆的記錄。為了確保數據的準確性,通常需要刪除這些重覆的行。手動查找並刪除可能會非常耗費時間,而通過編程腳本則可以實現在短時間內處理大量數據。本文將提供一個使用C# 快速查找並刪除Excel重覆項的免費解決方案。 以下是實現步驟: 1. 首先安裝免費.NET ...
  • C++ 異常處理 C++ 異常處理機制允許程式在運行時處理錯誤或意外情況。它提供了捕獲和處理錯誤的一種結構化方式,使程式更加健壯和可靠。 異常處理的基本概念: 異常: 程式在運行時發生的錯誤或意外情況。 拋出異常: 使用 throw 關鍵字將異常傳遞給調用堆棧。 捕獲異常: 使用 try-catch ...
  • 優秀且經驗豐富的Java開發人員的特征之一是對API的廣泛瞭解,包括JDK和第三方庫。 我花了很多時間來學習API,尤其是在閱讀了Effective Java 3rd Edition之後 ,Joshua Bloch建議在Java 3rd Edition中使用現有的API進行開發,而不是為常見的東西編 ...
  • 框架 · 使用laravel框架,原因:tp的框架路由和orm沒有laravel好用 · 使用強制路由,方便介面多時,分多版本,分文件夾等操作 介面 · 介面開發註意欄位類型,欄位是int,查詢成功失敗都要返回int(對接java等強類型語言方便) · 查詢介面用GET、其他用POST 代碼 · 所 ...
  • 正文 下午找企業的人去鎮上做貸後。 車上聽同事跟那個司機對罵,火星子都快出來了。司機跟那同事更熟一些,連我在內一共就三個人,同事那一手指桑罵槐給我都聽愣了。司機也是老社會人了,馬上聽出來了,為那個無辜的企業經辦人辯護,實際上是為自己辯護。 “這個事情你不能怪企業。”“但他們總不能讓銀行的人全權負責, ...