Python 解決Ajax動態載入問題(二十六)
阿新 • • 發佈:2019-01-30
(一)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)
結果如圖所示: