首先訪問這個頁面 url = 'http://125.35.6.84:81/xk/'
我們的目標是抓取這里的每一個企業的詳情頁數據,但是可以發現這里只有企業的簡介信息,所以這就意味着我們要發送兩次get請求。
在寫代碼之前,我們可以大概看一下我們想要的數據大概在什么位置。
1. 我們打開一個公司的詳情頁
2. 右擊檢查,通過Response查找對應的目標數據
從這里我們可以看出,當前的數據是通過ajax請求動態加載出來的
3.查看頭信息,以及參數信息
我們可以看出,當前的請求是post請求,所需要的參數是id,但是從以上的數據來看我們並沒有發現哪里有id這個參數。因為我們將目光聚焦到首頁。
4. 分析首頁所返回的數據
同樣是右擊檢查,打開抓包工具
從這里我們可以看出首頁的數據也是通過ajax動態加載出來的,並且通過觀察我們可以發現在ID的蹤跡,至此我們就可以形成一條完整的思路。
5.我們可以看看首頁的請求方式,與是否攜帶了參數
6. 思路:拿到首頁的響應數據的ID,並以此為參數向詳情頁發送post請求,拿到每個詳情頁的詳情數據。
7.代碼實現:
import requests import json if __name__ == '__main__': # 獲取各個企業id id_list = [] # 這里的url並非是首頁的url 首頁中的所有企業信息都是通過ajax動態請求的 因此應查看對應包中的url url = 'http://125.35.6.84:81/xk/itownet/portalAction.do?method=getXkzsList' header = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.92 Safari/537.36' } # 獲取前五頁的數據 for page in range(1, 5): page = str(page) # 首頁請求所需參數 data = { 'on': 'true', 'page': page, 'pageSize': '15', 'productName': '', 'conditionType': '1', 'applyname': '', 'applysn': '' } # 向首頁發送請求 response = requests.post(url=url, data=data, headers=header) # 拿到json格式的數據 info = response.json() # 拿到所有企業信息的列表 target_id = info['list'] for i in target_id: # 獲取所有企業的id id_list.append(i['ID']) # 獲取企業詳情信息 ret_list = [] url = 'http://125.35.6.84:81/xk/itownet/portalAction.do?method=getXkzsById' # 獲取所有企業的詳情數據 for i in id_list: data = { 'id': i } ret = requests.post(url=url, data=data, headers=header) ret_list.append(ret.json()) # 持久化存儲 fileName = 'files/葯監總局.json' with open(fileName, 'w', encoding='utf-8') as f: f.write(json.dumps(ret_list, ensure_ascii=False)) print('work is done')