1. 程式人生 > >Python 解決Ajax動態載入問題(二十六)

Python 解決Ajax動態載入問題(二十六)

(一)Ajax基礎

1.簡介

  • AJAX = Asynchronous JavaScript and XML(非同步的 JavaScript 和 XML)
  • AJAX 不是新的程式語言,而是一種使用現有標準的新方法
  • AJAX 是與伺服器交換資料並更新部分網頁的藝術,在不重新載入整個頁面的情況下
  • AJAX 可以用於建立快速動態的網頁
  • AJAX 是一種在無需重新載入整個網頁的情況下,能夠更新部分網頁的技術

2.AJAX 工作原理

如圖所示:
這裡寫圖片描述

這裡寫圖片描述

1.AJAX是基於現有的Internet標準,並且聯合使用它們:

  • XMLHttpRequest 物件 (非同步的與伺服器交換資料)
  • JavaScript/DOM (資訊顯示/互動)
  • CSS (給資料定義樣式)

4.Python採集Ajax和動態HTML資料的兩種方法:

  • 直接從javascript程式碼中採集內容
  • 用python的第三方庫執行javascript,比如(Selenium)

(二)爬取豆瓣電影,解決動態載入問題

首先要告訴你的是,這種動態載入的頁面,一般資料會在Network的 JS或者 XHR 類目裡。
這裡寫圖片描述

開啟動態載入的json檔案:滑鼠右擊>檢查>network>XHR>選中url>滑鼠右擊>open in new tab,瀏覽器開啟後的json檔案格式比較亂,在Chrome瀏覽器上安裝jsonview外掛格式化json檔案。

載入了兩次,不出意料地又加載出了兩頁 XHR 資訊,於是,滿懷期待地分別開啟它們。新載入的兩個頁面,和網頁顯示的電影資訊完全相同。
這裡寫圖片描述
這裡寫圖片描述
這裡寫圖片描述

1.XHR 載入的這幾個頁面的 url:

#第二頁
https://movie.douban.com/j/new_search_subjects?sort=T&range=0,10&tags=&start=20

#第三頁
https://movie.douban.com/j/new_search_subjects?sort=T&range=0,10&tags=&start=40

#第四頁
https://movie.douban
.com/j/new_search_subjects?sort=T&range=0,10&tags=&start=60 注:start資料的變化成等差數列

2.使用start資料的變化,遍歷頁面爬取資料:

for a in range(3):    
  url='https://movie.douban.com/j/new_search_subjects?sort=T&range=0,10&tags=&start={}'.format(a*20)

  # 用 a*20 表示每個頁面按 20 的步長遞增,只示例3個頁面,你可以按需求增加。

3.根據規律可以爬取任意頁的資料,下面演示爬取前10次載入的資料:

import requests
import time
count=0 #定義count變數統計爬取電影總數
for a in range(10):
    url_visit = 'https://movie.douban.com/j/new_search_subjects?sort=T&range=0,10&tags=&start={}'.format(a*20)
    file = requests.get(url_visit).json()   #這裡跟之前的不一樣,因為返回的是 json 檔案
    time.sleep(2)

    for i in range(20):
        dict=file['data'][i]   #取出字典中 'data' 下第 [i] 部電影的資訊
        urlname=dict['url']
        title=dict['title']
        rate=dict['rate']
        cast=dict['casts']
        count+=1
        print('{}  {}  {}  {}\n'.format(title,rate,' '.join(cast),urlname))
print("爬取的電影總數:"+str(count))

4.注意事項

01.之前我們用的 .text 是需要網頁返回文字的資訊,而這裡返回的是 json檔案所以用 .json()

file = requests.get(url).json() 

02.取出字典中的值,需要在方括號中指明值對應的鍵

dict=file['data'][i] 
urlname=dict['url']

03.因為有多名演員,這裡用了 join() 函式,在字串中間加入空格分隔。
04.字串處理方法

'   '.join(cast)

5.將資料寫入CSV檔案

import requests
import time
import csv
count=0
for a in range(10):
    url_visit = 'https://movie.douban.com/j/new_search_subjects?sort=T&range=0,10&tags=&start={}'.format(a*20)
    file = requests.get(url_visit).json()   #這裡跟之前的不一樣,因為返回的是 json 檔案
    time.sleep(2)
    with open("D:\movie.csv", "w",encoding="utf-8",newline="")as f:
        writer = csv.writer(f)
        #寫入前20部電影
        for i in range(20):
            dict = file['data'][i]  # 取出字典中 'data' 下第 [i] 部電影的資訊
            urlname = dict['url']
            title = dict['title']
            rate = dict['rate']
            cast = dict['casts']
            count += 1
            writer.writerow((title, rate, ' '.join(cast), urlname))
print("資料成功寫入csv檔案")
print("爬取的電影總數:"+str(count))

結果演示:
這裡寫圖片描述

6.使用pandas庫把資料寫入Excel檔案

import pandas as pd
names=["張三","李四","王五"]
professions=["銷售經理","銀行經理","產品經理"]
salary=[1200,20000,15000]
dic={"姓名":names,"職稱":professions,"薪酬":salary}
df=pd.DataFrame(dic)
df.to_excel("Test.xlsx",index=False)

結果如圖所示:
這裡寫圖片描述