iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 19
0
自我挑戰組

資料蒐集與分散式運算 30 天系列 第 19

[Day 19] Intagram - 無限捲軸爬蟲

歡迎來到第 19 天,今天要承接昨天所提到 IG 的無限捲軸爬蟲。

由於 IG 是一個典型的非同步網頁,在使用者觸發了某個事件後,會產生新的 XHR 進行非同步更新,也就是因為這個原因,我們昨天的靜態爬蟲只爬到了一進頁面後的前幾張照片。

觀察

首先同樣的步驟,先手動的進行搜尋功能,並觀察觸發事件後的 Network 狀態,在進入搜尋結果的頁面後,往下滾動會發現 Network 產生出新的 XHR 的資料傳遞(可以點選 Network 中的 XHR 標籤,鎖定顯示這類活動的紀錄)

https://ithelp.ithome.com.tw/upload/images/20201002/20128931GwdEtEgk8H.png

在這個 GET 的請求中,會發現他的參數應該是經過雜湊的轉換,因此並不方便透過靜態爬蟲的方式直接進行請求,因此還是會使用 Selenium 進行爬蟲。

寫扣

這裡將會省略模擬登入的步驟,如需閱覽模擬登入,請參考 [Day 17] Instagram - 模擬登入。首先先轉移至目標頁面,這次直接用 GET 進入柴犬 Maru 的 IG 頁面,接下來透過 Selenium 的 execute 方式在 Chrome 中執行 Javascript 程式碼操作頁面下滑,並在之後讀取所有照片的位置,並使用 requests.get() 的方式取得照片。

# 省略以上登入程序及 import 程式碼
driver.get("https://www.instagram.com/marutaro/?hl=zh-tw")
driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
photo_tag = driver.find_elements_by_xpath("//div[@class='KL4Bh']/img")
for i, photo in enumerate(photo_tag):
    with open(f'{os.getcwd()}/maru/maru_{i}.png','wb') as f:
        f.write(requests.get(photo.get_attribute("src")).content)
    

這樣就完成了無限捲軸的圖片爬蟲!當然可以搭配前幾天提過的 WebDriverWait 方式及迴圈進行更多的圖片下載。

那今天就到這裡!我們明天見!


上一篇
[Day 18] Instagram - Hashtag 搜尋
下一篇
[Day 20] Instagram - 模擬發文 - 1
系列文
資料蒐集與分散式運算 30 天30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言