教你用Python爬取動態加載的數據

例子1:爬取豆瓣電影中的電影詳情數據

url:https://movie.douban.com/

1.什麼是動態加載的數據:

我們通過requests模塊進行數據爬取無法每次都是可見即可得,有些數據是通過非瀏覽器地址欄中得url請求到的地址。而是其他請求請求到的數據,那麼這些通過其他請求請求到的數據就是動態加載的數據。(猜測有可能是js代碼當咱們訪問此頁面時就會發送得get請求,到其他url中獲取數據)

2.如何檢測網頁中是否存在動態加載得數據

在當前頁面中打開抓包工具,捕獲到地址欄中的url對應的數據包,在該數據包的response選項卡搜索我們想要爬取的數據,如果搜索到了結果則表示數據不是動態加載的,否則表示數據爲動態加載的

3.如果數據爲動態加載,那麼我們如何捕獲到動態加載的數據?

基於抓包工具進行全局搜索。

在這裏插入圖片描述
定位到動態加載數據對應的數據包,從該數據包中就可以提取出

  • 請求的url
  • 請求方式
  • 請求攜帶的參數
  • 看到響應數據

然後要分析參數跟url的關係。發現他有 ‘start’: ‘0’,‘limit’: ‘20’, 在url中有攜帶此參數,此參數start就是從哪個電影開始。limit就是從開始之後顯示多少個。例如爬取前30個電影數據,就是start :0 到 limit :30 ,例如start :2 到 limit :12,就是從第二個電影,再往後獲取12個電影

所以我們開始寫代碼:爬取從第10個開始後面的50個電影

'''
遇到問題沒人解答?小編創建了一個Python學習交流QQ羣:579817333 
尋找有志同道合的小夥伴,互幫互助,羣裏還有不錯的視頻學習教程和PDF電子書!
'''
url = 'https://movie.douban.com/j/chart/top_list'
params = {
    'type': '5',
    'interval_id': '100:90',
    'action': '',
    'start': '10',
    'limit': '50',
}
response = requests.get(url=url,params=params,headers=headers)
#.json()將獲取的字符串形式的json數據序列化成字典或者列表對象
page_text = response.json()
#解析出電影的名稱+評分
for movie in page_text:
    name = movie['title']
    score = movie['score']
    print(name,score)

例子2:分頁爬取肯德基餐廳位置數據

分頁數據的爬取操作
爬取肯德基的餐廳位置數據
url:http://www.kfc.com.cn/kfccda/storelist/index.aspx

分析:
1.在錄入關鍵字的文本框中錄入關鍵字按下搜索按鈕,發起的是一個ajax請求
當前頁面刷新出來的位置信息一定是通過ajax請求請求到的數據
2.基於抓包工具定位到該ajax請求的數據包,從該數據包中捕獲到:

  • 請求的url
  • 請求方式
  • 請求攜帶的參數
  • 看到響應數據
#爬取的是第一頁的數據
url = 'http://www.kfc.com.cn/kfccda/ashx/GetStoreList.ashx?op=keyword'
data = {
    'cname': '',
    'pid': '',
    'keyword': '北京',
    'pageIndex': '1',
    'pageSize': '10',
}
#data參數是post方法中處理參數動態化的參數
get的參數用params,他會顯示在url上。post用data!!!!
response = requests.post(url=url,headers=headers,data=data)
page_text = response.json()
for dic in page_text['Table1']:
    title = dic['storeName']
    addr = dic['addressDetail']
    print(title,addr)
    
#爬取多頁的話
分析之後處理data數據即可,pageIndex就是顯示的頁數。for循環,請求每一頁的。
for page in range(1,9):
    data = {
        'cname': '',
        'pid': '',
        'keyword': '北京',
        'pageIndex': str(page),
        'pageSize': '10',
    }
    response = requests.post(url=url,headers=headers,data=data)
    page_text = response.json()
    for dic in page_text['Table1']:
        title = dic['storeName']
        addr = dic['addressDetail']
        print(title,addr)

例子3:藥監總局每頁的詳情數據

url = http://125.35.6.84:81/xk/

我們get請求當前url,response選項卡中並未有各個企業的數據,通過抓包工具搜索,發現是post請求了其他網址獲取的數據,所以我們通過這個post請求獲取url發送請求

在這裏插入圖片描述
在這裏插入圖片描述

在這裏插入圖片描述
然後我們發請求獲取到每頁的數據。但是我們需要每頁中每個企業的詳情頁內容

我們點開詳情頁,發現get請求此頁面response選項卡中沒有數據,後來我們發現此頁面也是動態加載的數據。有個post請求發送獲取數據

在這裏插入圖片描述
在這裏插入圖片描述
經過分析發現他是通過id來查詢結果的,此ID在獲取頁面Json數據時每個企業都有
結果以上。我們寫代碼獲取前3頁所有企業的詳情信息

'''
遇到問題沒人解答?小編創建了一個Python學習交流QQ羣:579817333 
尋找有志同道合的小夥伴,互幫互助,羣裏還有不錯的視頻學習教程和PDF電子書!
'''
url = "http://125.35.6.84:81/xk/itownet/portalAction.do?method=getXkzsList"
for i in range(3):
    data={'on': 'true',
    'page': '1',
    'pageSize': '15',
    'productName': '',
    'conditionType': i,
    'applyname': '',
    'applysn': '',}
    response = requests.post(url=url,data=data).json()
    for w in response["list"]:
         print(w)
        data = {"id":w["ID"]}
        url =' http://125.35.6.84:81/xk/itownet/portalAction.do?method=getXkzsById'
        response = requests.post(url=url,data=data).json()
        print(response)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章