1. 程式人生 > >python爬蟲練習--爬上海法院開庭公告資訊

python爬蟲練習--爬上海法院開庭公告資訊

本次練習的物件是上海法院開庭公告資訊。資料來源如下:


該網站是上海法院的官方網站,網站內會公示未來已確定的開庭資訊。


如上圖所示,網站顯示共有資料30528條。這些資料就是本次爬蟲的目標。

(一)分析頁面

1. 開啟google瀏覽器開發者工具,點選頁面下一頁,觀察網路請求可以發現,目標資料是這個請求返回的:


2. 下一步,觀察上面這個請求的具體內容:

觀察得出以下結論,這是一個post請求,具體引數含義為:

yzm                             暫時不清楚來源

ktrqks: 2018-06-19       這是查詢的起始時間,也就是當天

ktrqjs: 2018-07-19        這是查詢的結束時間

pagesnum:2               猜測可知,這是頁面所在頁數

3. 尋找引數yzm的來源

在網頁原始碼中搜索,可以看到,yzm的值是寫死到js裡面的。


此時,還需要確定,該引數的值是固定的,還是會變化。

多次重新整理頁面可知,該引數值每次都不一樣。

4. 至此,頁面基本分析完畢。只需要首先請求頁面拿到引數yzm的值,然後構造post引數,不斷翻頁請求資料即可。

(二)核心程式碼實現

import requests
from requests.exceptions import RequestException
from pyquery import PyQuery as pq
from lxml.etree import XMLSyntaxError
import re
import csv
from concurrent.futures import ThreadPoolExecutor

1. 獲取引數yzm的部分

s = requests.Session()
headers = {
	"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.181 Safari/537.36",
	"Referer": "http://www.hshfy.sh.cn/shfy/gweb2017/ktgg_search.jsp?zd=splc",
	"Upgrade-Insecure-Requests":"1",
	"Connection":"keep-alive",
	"Host":"www.hshfy.sh.cn"
}
def get_yzm_html():
	url = "http://www.hshfy.sh.cn/shfy/gweb2017/ktgg_search.jsp?zd=splc"
	r = s.get(url, headers=headers)
	return r.text

def find_yzm(html):
    try:
    	if re.findall(r'(?:var yzm=")(\w+)(?:";)', html):
    		return re.findall(r'(?:var yzm=")(\w+)(?:";)', html)[0]
    except XMLSyntaxError:
        return None

2. 獲取目標資料的部分

def get_data_html(yzm, num):
	form_data = {
		"yzm":	yzm,
		"ft":"",	
		"ktrqks":	"2018-06-19",
		"ktrqjs":	"2020-07-11",
		"spc":"",	
		"yg":"",	
		"bg":"",	
		"ah":"",	
		"pagesnum":	str(num)
	}
	url = "http://www.hshfy.sh.cn/shfy/gweb2017/ktgg_search_content.jsp"
	try:
		response = s.post(url, headers=headers, json=form_data)
		if response.status_code == 200:
			parse_data(response.text)
			print("解析第{}頁".format(num))
		return None
	except RequestException:
		print("請求發生錯誤:", url)
		return None

3. 解析目標資料的部分

def parse_data(html):
    try:
        doc = pq(html)
        for i in range(2, 17):
        	row = []
        	for j in range(1, 10):
        		td = doc("#report > tbody > tr:nth-child("+str(i)+") > td:nth-child("+str(j)+")")
        		if td:
        			row.append(td.text().strip(" *\n"))
        	return row
    except:
        print("解析頁面傳送錯誤")
        return None

(三) 結果展示

本次練習共拿到2萬多條資料,可是頁面顯示資料有30528條。經多方推測,應該是頁面顯示資料量有誤。