爬取網(wǎng)站:http://output.nsfc.gov.cn/projectQuery
網(wǎng)站特點(diǎn):需要根據(jù)輸入的表單信息進(jìn)行檢索,返回的信息在html里不直接顯示,并且在翻頁(yè)的時(shí)候url不變化。
這種情況就是需要我們向服務(wù)器發(fā)送請(qǐng)求,然后拿到數(shù)據(jù)之后,網(wǎng)站就會(huì)把各種數(shù)據(jù)填充到頁(yè)面上,因?yàn)槭峭ㄟ^js填充的,所以html代碼里并不會(huì)出現(xiàn)。
比如我們需要搜的是[植物學(xué),面上項(xiàng)目,結(jié)題年度2009]

在chrome里可以右鍵檢查。數(shù)據(jù)請(qǐng)求都是XHR類型的。我們點(diǎn)到XHR,我們按檢索后可以在Name中發(fā)現(xiàn)新的一條更新記錄。

點(diǎn)到Response

發(fā)現(xiàn)就是我們需要的json文件。接下來寫腳本開爬。
import requests
import json
def getProject(expert, code, projectType, ratifyYear):
url = "http://output.nsfc.gov.cn/baseQuery/data/conclusionQueryResultsData"
#url就是在Headers里的Request URL
#data就是我們需要提交的表單信息Headers里的Request Playload
data = {
"ratifyNo":"",
"projectName":"",
"personInCharge":"",
"dependUnit":"",
"code":"F02", # 申請(qǐng)代碼
"projectType":"218", # 面上項(xiàng)目
"subPType":"",
"psPType":"",
"keywords":"", # 項(xiàng)目主題詞
"ratifyYear":"2010", # 批準(zhǔn)年度
"conclusionYear":"",
"beginYear":"",
"endYear":"",
"checkDep":"",
"checkType":"",
"quickQueryInput":"",
"adminID":"",
"pageNum":1, # 頁(yè)碼,從0開始
"pageSize":5, # 頁(yè)面大小
"queryType":"input",
"complete":"true"
}
data['code'] = code
data['personInCharge'] = expert
data['projectType'] = projectType
data['ratifyYear'] = ratifyYear
payload = json.dumps(data)
# headers就是Request Headers 我們要偽裝成自己的瀏覽器去發(fā)送請(qǐng)求
headers = {
'origin': "http://output.nsfc.gov.cn",
'accept-encoding': "gzip, deflate",
'accept-language': "zh-CN,zh;q=0.9,en;q=0.8",
'user-agent': "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.103 Safari/537.36",
'content-type': "application/json",
'accept': "*/*",
'referer': "http://output.nsfc.gov.cn/projectQuery",
'x-requested-with': "XMLHttpRequest",
'connection': "keep-alive",
'cache-control': "no-cache",
}
response = requests.request("POST", url, data=payload, headers=headers)#發(fā)送請(qǐng)求并獲得返回?cái)?shù)據(jù)
print(response.text) #打印爬下來的數(shù)據(jù)