python爬蟲練習--爬上海法院開庭公告資訊
阿新 • • 發佈:2019-01-27
本次練習的物件是上海法院開庭公告資訊。資料來源如下:
該網站是上海法院的官方網站,網站內會公示未來已確定的開庭資訊。
如上圖所示,網站顯示共有資料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條。經多方推測,應該是頁面顯示資料量有誤。