用Python抓取新版裁判文書網(附代碼,針對初學者修訂)
本文首發於審判研究,內容略有不同。
引:
曾聽一個理科同學說他同事的逸事。這位同事對佔用時間超過5秒,不必用腦又必須做的事情,都會寫個小程序替他解決。工作郵件來往就不用說了,連在討論項目的工作群里,也是自動處理。檢測到某人說話、內容與自己工作相關、又或是有人@了自己之類後,連接一個語句庫自動回復。
聽過之後甚是羨慕,如果我們司法人員也會一點編程技巧,將可以節省大量時間。比方說把填入辦案系統、摘錄證據等事交給電腦,既可以節省時間,又可以減少錯誤,還可以省下時間好好分析下證據材料和法律關係。
帶著對程序員的艷羨,再加上各種機緣巧合,我開始了自己的Python之旅。現在稍微嘗到了點編程的好處,比方說我們工作中要查詢很多法律文件和文書,如果只是一兩份我們在網頁上直接下載就可以,但如果有很多份需要操作,將很不方面。而爬蟲功能,可以很方便地替我們實現這一需求,而且還可以順帶刪除掉各種廣告和無關內容。
下面以法律人都會接觸到的裁判文書網為例,簡單介紹下爬蟲功能的實現。
正文:
一、準備工作
開始前,先簡單介紹下Python和一些基礎問題。
Python是一種語法簡單、模塊多的電腦語言,可以很方便地實現很多功能;而且不用去操心具體如何實現,只要找到合適的模塊,告訴它去做就可以,很適合非程序員入手。比如說從網上抓取數據,如果用別的語言來寫程序,要很多行,但如果用Python,可以幾行就解決問題。
再選擇Python之後,有語言版本和模塊兩個問題。語言版本方面,主要有2.7和3兩種。2.7的優勢是有歷史「悠久」,可以用的模塊多;3的優勢是它是未來的發展方向,而且大多數我們用得上的模塊都已經支持3,並且3對中文的支持要好得多。所以,個人建議用直接上3。當然,這些對我們外行人來說並不是很重要,兩者都差不多,能用就行,不要捲入程序員之間的口水戰。
除此之外就是模塊問題。模塊就像日常工作中的筆墨紙硯之類的工具,它省去我們自己去「造工具」的時間。這裡推薦Anaconda,它像普通軟體一樣,大家只要在Google一下就它的官方網址進行下載安裝,你的電腦就可以用Python一樣進行編程了。我們用得上的模塊,它都已經一起打包安裝,省去了我們去找模塊、裝模塊和處理模塊之間兼容性的時間,可以說是工具的工具。
總結一下,準備工作就是一句話,搜索Anaconda,下載,安裝,DONE!
二、上手爬蟲
互聯網是網,而在網上替我們搜索資料的程序,就是爬蟲。
我們要動手的裁判文書網跟一般的網站複雜一點,無法直接用網址進行抓取。因此,我們首先弄明白兩個問題,一是網上顯示的文書內容是哪發過來的,二是網站要滿足什麼條件才會向我們發送這些內容。
1. n跟蹤網頁
直接搜索「執行」兩個字,這是我們在瀏覽器上可以看到的網址,但直接抓不到內容,需要用軟體網頁進行跟蹤。這個軟體不用安裝,無論是IE,還是Chrome,你按F12的話,這個軟體都會蹦出來。下面以chrome為例。
按F12後,右邊就彈出了軟體的界面。選中上面的network的大項,刷新下網頁。瀏覽器與網站的所有交互內容,就出現在下面的name小項中,裡面就藏著我們要的內容。在這個網頁里,內容藏在劃圈的Listcontent項下。
我們選中Listcontent,從右邊Headers的詳情可以看到,請求方式是POST,而Request URL後跟著的,就是真正的內容請求地址。
下面我們解決第二個問題,我們要發送什麼內容,這個網址才會返回我們需要的信息?同樣在這個界面下,我們繼續往下翻,可以看到Form Data內容(如下圖)。
我們可以看到,信息內容分別是:搜索條件「全文檢索:執行」,Index:1(第一頁),Page:5(每頁出現5個文書,最大值為20,我們可以直接在程序里設為20),order:法院層級(按法院層次來排序),最後一個參數是解碼的,照抄即可。也就是說,我們給網頁必發送的檢索要求是:全文內容含有「執行」二字,如果有符合條件的按這個格式給網頁發送內容,就可以取得我們想要的資料了。
2.代碼
知道用什麼格式發送信息、發送到哪之後,就該寫代碼了。下面我們打開剛剛提到的軟體Anaconda項下的Spyder。兩者的關係就好比Anaconda是win系統,spyder是記事本。Spyder是負責寫編碼的工具。
就會出現下面這個界面。
在左側,我們就可以開始自己寫代碼了。在進入具體代碼前針對初學者再啰嗦兩句。
- l 一是心理問題。初學者一般有兩個問題,1)會不由自主地想為什麼這麼寫?這樣寫的「法理基礎」是什麼?這種問題是程序員中的精英考慮的,一般的程序員都沒琢磨明白。我們非專業人員奉行的應該是拿來主義,能用就行。法律主業搞好了,還有興趣再研究不遲。要是興趣太大一不小心徹底轉行了,那……恭喜你加入了一個高薪行業(一般的Python程序員月薪中位數在18000左右),哈哈。2)想搞懂一個例子里涉及的所有問題,這種鑽究態度是好的,但在初上手時會成為你的障礙。學編程其實就是學語言,只不過是跟電腦說的語言。想想我們在初學一門外語時是怎麼做的?背!所以,初學編程,最簡單有效地辦法是,我們先把代碼一個字不差的,一行一行的自己敲進電腦里。敲完了,你就懂了。
- l 二是技術問題。也是兩個:1)「#」後跟的是注釋,用來給大家解釋代碼,無須輸入電腦,輸入了也會被電腦忽略掉,不影響程序運行。2)代碼這東西,錯一個地方電腦就不認,特別是符號不能錯,格式不能錯。①所有的符號,除了被英文單引號、雙引號包起來的內容,都必須是英文輸入法下的符號;②所有代碼頂格寫,但如果有從屬關係,注意在空四個空格(下面要講的代碼涉及到一個while的循環語句就涉及這個問題,我會在代碼里進一步解釋)。如果有一句太長了可以回車,電腦看得懂,不影響程序運行。
現在開始上正菜,以下代碼的作用是,搜索全文含有「執行」二字的案件,並將其時間、案號、案件名稱提取出來放在excel表裡。
#到"""之前這一段是打開spyder的界面就會自動添加的內容,一般不用去動。
#這一句是告訴電腦解碼方式是UTF-8碼,我們可以簡單地理解為可以在代碼里加中文,建議每次編程都加上。
#到"""之前這一段是打開spyder的界面就會自動添加的內容,一般不用去動。n#這一句是告訴電腦解碼方式是UTF-8碼,我們可以簡單地理解為可以在代碼里加中文,建議每次編程都加上。n# -*- coding: utf-8 -*-nn#用(""" """)包起來的這一部分電腦也是忽略掉的,主要是給人看的部分,分別是代碼首次編寫時間和作者,屬於可寫可不寫的部分。n"""nCreated on Sun Jul 24 23:11:55 2016nn@author: 檢n"""nnn#這裡是導入模塊,以下模塊分別用於抓取網頁、數據處理保存、時間、正則表達式nimport requests as reqnimport pandas as pdnimport timenimport renn#這是剛才我們通過F12查找到的網頁nurl=http://wenshu.court.gov.cn/List/ListContentnn#這是頁數、程序休息時間的定義和三個空的列表用來裝篩選後的數據。nIndex=1nSleepNum = 3ndates=[]ntitles=[]nnums=[]nn#循環模塊,因為有很多頁,當小於這個數時,不斷地傳數據,相當於點下一頁的功能。最後一句的意思是每執行一次,index加1,就是翻到下一頁。具體頁數也可以用變數實現。nwhile Index < 123:nn #這是請求頭,偽裝成瀏覽器訪問網站,以免被網站屏蔽n my_headers={User-Agent:User-Agent:Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.95 Safari/537.36 Core/1.50.1280.400,}nn #這一行就是我們搞定的搜索條件,可以按自己要求設置,比如:「法院名稱:北京市人 民法院,案件類型:執行案件,裁判日期:2016-01-01 TO 2016-10-08」。n #如果實在不會設置,可以在文書網上搜索好,再通過F12查看到的內容複製粘貼到代碼中加紅的區域即可。n data={Param:全文檢索:執行, Index: Index,Page:20,Order:裁判日期,Direction:asc}nn #將網址、請求頭、搜索條件等數據上傳並取得內容n r=req.post(url, headers=my_headers, data = data)nn #用 json解碼取得的網頁內容n raw=r.json()nn#用正則表達式將我們需要的內容提取出來,正則表達式真的很有用,要想真正用好westlaw等資料庫,這一關也得過n#大意是定義篩選標準,把(「裁判日期」:)後,()前的內容截取出來。n pattern1 = re.compile("裁判日期":"(.*?)", re.S)n date = re.findall(pattern1,raw)n pattern2 = re.compile("案號":"(.*?)", re.S)n num = re.findall(pattern2,raw)n pattern3 = re.compile("案件名稱":"(.*?)", re.S)n title = re.findall(pattern3,raw)nn#把篩選出的數據添加到開始的三個空列表裡n dates+=daten titles+=titlen nums+=numnn#這一行是讓程序休息,做事留點餘地比較好。通過網頁編碼可知,文書網是有驗證碼功能的,如果你抓的太狠中招莫怪。n time.sleep(SleepNum)n Index += 1n#這裡我們可以看到,從while開始到此,所有的代碼都縮進了四個空格。這是因為要告訴電腦,這一段代碼構成一個相對獨立的組,當index小於123時,不斷地從這個組第一句代碼執行到最後一句代碼,而不涉及到本文涉及的其他代碼。nn#這裡代碼又是頂格寫。n#用pandas模塊將篩選出的內容轉成dataframe格式,並保存到Excel。ndf=pd.DataFrame({時間:dates,案號:nums, 案件名稱:titles})ndf.to_excel(C:result.xlsx)n
好,工作結束,保存一下,點擊軟體界面上的綠色小三角形或者按F5運行下,過一會我們就會發現在C盤裡安靜地躺著一個名稱為result的excel表,裡面存放著我們想要的資料。以後我們都不用打開編程軟體Spyder,把代碼另存為放在桌面上,雙擊一下,它就會自動的按設定的搜索條件把相關的文書案號找好,保存為excel,不用再登陸那個響應緩慢的文書網了,是不是很方便?
如果只是想要結果的話,直接粘貼到Spyder左側的框里就可以直接運行。(但是如果你看完本文後對編程想進一步學習的話,個人強烈不建議這樣做。因為很多細節你不自己輸入進去,是注意不到的。比方說剛提到的while語句,在回車下一行之前是有個「:」號,光看代碼是很容易忽略掉的。當然,Spyder這個編程軟體很智能,會替我們補全,但我們不能依賴機器對吧。)
其他的補充:
首先,編程的益處很多。它可以提高我們工作的效率(像上文中的代碼,運行2、3分鐘,可以下載幾千份的法律文書);而且因為編程很像教一個什麼都不懂的小孩怎麼做事,有一個前提沒交代清楚,它就做不下去了,所以它的邏輯性很強,可以反哺法律工作,比方說分析法律關係時,編程的思維方式可以幫助我們意識到自己忽略掉的隱含前提。
其次,編程並不難。這種層次的編程,不用考慮機器怎麼會明白我寫的是什麼意思這種問題,更像是在做遊戲的高級設置選項,多數代碼直接就是英文單詞,可以看成是寫一篇英文小作文。我們的困難主要在於不習慣,絕不是理解不了,多敲幾遍代碼就可以解決這個問題。
nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn最後,如果這篇文章有幸激起了你學Python的興趣,可以到這個網站學習下基礎知識,通俗易懂,每一小節還隨帶小練習,很適合初學者(課後練習一定要做啊,寫出來才是真的會了)。
推薦閱讀: