
鄭重申明:本文僅為研究學習使用,
文章目錄
- 網頁分析
- 代碼實作
- 優化小思路
網頁分析
網址:http://wjt.a.101.com/activity/2020/gaokaotool/search-km.shtml

目前是有八個省的資料,但是其他幾個省的資料都有Excel直接下載了,所以就選擇福建的啦,
能簡單就簡單嘛,
可以看到頁面中有兩個下拉框和一個“開始查詢”按鈕,且讓我們點擊一下查詢按鈕看情況,
點擊之后發現,依舊是一個動態網頁,

所以我們熟練地點開網路抓包工具:
就一個包,沒什么好說的,點開看:
url:
https://wjt-subject-tool-api.sdp.101.com/v1/actions/manage?page_size=30&page=1&f_subject=%E7%89%A9%E7%90%86%E6%88%96%E5%8E%86%E5%8F%B2%E5%9D%87%E5%8F%AF&s_subject=%E4%B8%8D%E6%8F%90%E5%86%8D%E9%80%89%E7%A7%91%E7%9B%AE%E8%A6%81%E6%B1%82
這個url是經過編碼的,看起來很亂,但是你放到網址查詢框里決議出中文之后你就明白是什么意思了,
page:頁面大小
f_subject:首選科目
s_subject:再選科目
接下來,就是一個難點出現了:咱不知道它有多少頁,咱也不想去看它有多少頁,
但是就算是個空頁面,也是可以被爬下來的,只不過爬到的是空資料,
在決議的時候就會卡住,
最后想了個土辦法才解決掉,但是感覺不是很好,
但是,今天我又重新審視了一下,發現了網址中的另一個引數:page_size,
只要我給一個足夠大的page_size,我管你幾頁到底啊?反正就都在一頁給我到底,
開個玩笑啊,適當調節頁面大小就好了,該判斷還是判斷一下,因為我爬完發現,這些不同的選項搭配,獲取的資料量天差地別,
代碼實作
# #coding:utf-8
import requests
from lxml import etree
import random
user_agent_list = [
"Mozilla/5.0 (Macintosh; U; PPC Mac OS X 10.5; en-US; rv:1.9.2.15) Gecko/20110303 Firefox/3.6.15",
]
def get_html(url,times):
'''
這是一個用戶獲取網頁源資料的函式
:param url: 目標網址
:param times: 遞回執行次數
:return: 如果有,就回傳網頁資料,如果沒有,回傳None
'''
try:
res = requests.get(url = url,headers = {
"User-Agent":random.choice(user_agent_list)
}) #帶上請求頭,獲取資料
if res.status_code>=200 and res.status_code<=300: #兩百打頭的識別符號標識網頁可以被獲取
return res
else:
return None
except Exception as e:
print(e) # 顯示報錯原因(可以考慮這里寫入日志)
if times>0:
get_html(url,times-1) # 遞回執行
def get_data(html_data, Xpath_path):
'''
這是一個從網頁源資料中抓取所需資料的函式
:param html_data:網頁源資料 (單條資料)
:param Xpath_path: Xpath尋址方法
:return: 存盤結果的串列
'''
data = html_data.content
data = data.decode().replace("<!--", "").replace("-->", "") # 洗掉資料中的注釋
tree = etree.HTML(data) # 創建element物件
el_list = tree.xpath(Xpath_path)
return el_list
import json
fsubject_name = ["物理或歷史均可","僅物理","僅歷史"]
ssubject_name = ['不提再選科目要求','地理必須選考方可報考','化學、地理均須選考方可報考','化學、地理選考其中一門即可報考','化學、生物均須選考方可報考','化學、生物選考其中一門即可報考','化學、思想政治選考其中一門即可報考','化學必須選考方可報考','生物、地理均須選考方可報考','生物、地理選考其中一門即可報考','生物、思想政治選考其中一門即可報考','生物必須選考方可報考','思想政治、地理均須選考方可報考','思想政治、地理選考其中一門即可報考','思想政治必須選考方可報考']
res = get_html('https://wjt-subject-tool-api.sdp.101.com/v1/actions/manage?page_size=30&page=' + str(1) + '&f_subject='+'物理或歷史均可'+'&s_subject='+'化學、地理均須選考方可報考',2)
j_data = json.loads(res.content)
import openpyxl
wb = openpyxl.Workbook()
ws = wb.active
with open("新高考選科工具.txt",'w+') as w:
for f in fsubject_name:
for s in ssubject_name:
cs = wb.create_sheet(f+'+'+s, 0)
i = 1
while (1):
res = get_html('https://wjt-subject-tool-api.sdp.101.com/v1/actions/manage?page_size=30&page=' + str(i) + '&f_subject='+f+'&s_subject='+s,2)
j_data = json.loads(res.content)
if (j_data["items"] == []):
print("空界面,跳出")
break
for data in j_data["items"]:
print([data['school_name'],data['subject_name'],data['fsubject'],data['ssubject']])
cs.append([data['school_name'],data['subject_name'],data['fsubject'],data['ssubject']])
#w.write(str([data['school_name'],data['subject_name'],data['fsubject'],data['ssubject']]))
# df = pd.DataFrame([data['school_name'],data['subject_name'],data['fsubject'],data['ssubject']])
# df.to_excel('新高考選科工具.xlsx',sheet_name=f+'+'+s)
i += 1
wb.save('新高考選科工具.xlsx')
wb.close()

優化小思路
我準備將爬取和存盤解耦合,放在不同的執行緒中執行,以提高效率,
這可以作為我《精寫15篇,學會Python爬蟲》的一個專案來做,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/277000.html
標籤:其他
