iT邦幫忙

2021 iThome 鐵人賽

DAY 22
0
AI & Data

網路爬蟲,萬物皆爬 - 30 天搞懂並實戰網路爬蟲及應對反爬蟲技術系列 第 22

【Day 22】- 將朋朋的 Instagram 貼文全部按讚owo(實戰 Selenium 自動點擊 Instagram 好友貼文贊 2/2)

前情提要

前一篇帶各位透過匯入 Session 達到不必輸入帳號密碼便可登入的目的。

開始之前

今天要開始撰寫 Instagram 點擊好友貼文讚的功能。將會帶各位用開發工具分析 Instagram 中貼文的結構,以及透過 Selenium 達到自動點擊的效果。

預期效果

到達好友的個人頁面後,用 Selenium 鎖定貼文的元素。

用 for-loop 遍歷所有的貼文,並點擊貼文。

鎖定按贊的元素,並點擊該元素。

實作

首先先決定要點擊哪位好友的貼文的贊。這邊創了一個帳號。 https://www.instagram.com/beeson_owo/

來延續昨天的內容,並將目標網址更改。

from selenium import webdriver
from time import sleep
import json

if __name__ == '__main__':
    with open('cookies_jar.json') as f:
        cookies = json.load(f)
    driver = webdriver.Chrome()
    driver.get('https://www.instagram.com/beeson_owo/')

    for cookie in cookies:
        driver.add_cookie(cookie)
    driver.get('https://www.instagram.com/beeson_owo/')

接下來用開發工具來分析貼文的架構。

可以發現會是三個貼文為一個單位,這個單位的 class 為 Nnq7C weEfm

一個單位下有三個貼文,並有著 class v1Nh3 kIKUG _bz0w

接下來,我們能寫個程式來鎖定所有貼文,可以發現確實鎖定到 10 個貼文了,對應此帳號有 10 個貼文。

from selenium import webdriver
from time import sleep
import json

if __name__ == '__main__':
    with open('cookies_jar.json') as f:
        cookies = json.load(f)
    driver = webdriver.Chrome()
    driver.get('https://www.instagram.com/beeson_owo/')

    for cookie in cookies:
        driver.add_cookie(cookie)
		driver.get('https://www.instagram.com/beeson_owo/')
    sleep(2)
		# 鎖定此帳號貼文的 class name
    eles = driver.find_elements_by_class_name('v1Nh3')
    print(eles)
    print(len(eles))

'''
[<selenium.webdriver.remote.webelement.WebElement (session="ab11e2a6e736d79e6d235a6ebbcfe806", element="438ad8f3-a57d-4e07-883a-572f076c8b63")>, <selenium.webdriver.remote.webelement.WebElement (session="ab11e2a6e736d79e6d235a6ebbcfe806", element="b9858a5d-5a6f-4231-980e-7a33c14bb3d3")>, <selenium.webdriver.remote.webelement.WebElement (session="ab11e2a6e736d79e6d235a6ebbcfe806", element="7752ff18-63ee-4fc7-8699-554e30226897")>, <selenium.webdriver.remote.webelement.WebElement (session="ab11e2a6e736d79e6d235a6ebbcfe806", element="fa2d42b7-6a7a-4eef-8b94-a57ff7ecdfb0")>, <selenium.webdriver.remote.webelement.WebElement (session="ab11e2a6e736d79e6d235a6ebbcfe806", element="0d21b12e-b677-463a-9fae-1dad863cc971")>, 
<selenium.webdriver.remote.webelement.WebElement (session="ab11e2a6e736d79e6d235a6ebbcfe806", element="278e2600-64ac-4b3c-b8b2-e1d44e8292c0")>, <selenium.webdriver.remote.webelement.WebElement (session="ab11e2a6e736d79e6d235a6ebbcfe806", element="305f8b99-7e0c-47e0-a742-4bc0baf3c9c9")>, <selenium.webdriver.remote.webelement.WebElement (session="ab11e2a6e736d79e6d235a6ebbcfe806", element="83fede31-f2b2-4628-8de1-7f798418601b")>, <selenium.webdriver.remote.webelement.WebElement (session="ab11e2a6e736d79e6d235a6ebbcfe806", element="1c6bb1a6-249c-45c4-8db8-b28a8693faca")>, <selenium.webdriver.remote.webelement.WebElement (session="ab11e2a6e736d79e6d235a6ebbcfe806", element="c9ae8328-e8f1-4521-810d-a521bc2e9e4f")>]  
10
'''

接下來可以寫個 for-loop 將所有貼文的元素點擊一次。

這邊先將第一個點擊後 break 掉,因為還未撰寫點贊的功能。

from selenium import webdriver
from time import sleep
import json

if __name__ == '__main__':
    with open('cookies_jar.json') as f:
        cookies = json.load(f)
    driver = webdriver.Chrome()
    driver.get('https://www.instagram.com/beeson_owo/')

    for cookie in cookies:
        driver.add_cookie(cookie)
    driver.get('https://www.instagram.com/beeson_owo/')
    sleep(2)
    eles = driver.find_elements_by_class_name('v1Nh3')
    for ele in eles:
        ele.click()
        break

接下來透過開發工具鎖定贊元素的位置,相同地,一樣使用 click 點擊它。

發現贊是個 class 稱為 fr66n 的元素。

from selenium import webdriver
from time import sleep
import json

if __name__ == '__main__':
    with open('cookies_jar.json') as f:
        cookies = json.load(f)
    driver = webdriver.Chrome()
    driver.get('https://www.instagram.com/beeson_owo/')

    for cookie in cookies:
        driver.add_cookie(cookie)
    driver.get('https://www.instagram.com/beeson_owo/')
    sleep(2)
    eles = driver.find_elements_by_class_name('v1Nh3')
    for ele in eles:
        ele.click()
        sleep(1)
        driver.find_element_by_class_name('fr66n').click()
        break

可以看到成功點擊喜歡了,點擊完成後,要退出該頁面。退出頁面十分容易,依樣畫葫蘆地,鎖定叉叉的元素,並點擊它。

這邊用 XPath 進行定位,可以在開發工具中複製該元素的 XPath,並用 find_element_by_xpath 進行定位。

可以看到確實關閉了貼文頁面了。

from selenium import webdriver
from time import sleep
import json

if __name__ == '__main__':
    with open('cookies_jar.json') as f:
        cookies = json.load(f)
    driver = webdriver.Chrome()
    driver.get('https://www.instagram.com/beeson_owo/')

    for cookie in cookies:
        driver.add_cookie(cookie)
    driver.get('https://www.instagram.com/beeson_owo/')
    sleep(2)
    eles = driver.find_elements_by_class_name('v1Nh3')
    for ele in eles:
        ele.click()
        sleep(1)
        driver.find_element_by_class_name('fr66n').click()
        sleep(1)
        driver.find_element_by_xpath('/html/body/div[6]/div[3]/button').click()
        break

接下來我們能將 break 拿掉,看是否會成功將所有貼文按一次贊。

注意要在每次迴圈完成後 sleep 一下,讓資源載入,整體會更加穩定,讀者也能調整 sleep 的時間調配出最適合的速度。

from selenium import webdriver
from time import sleep
import json

if __name__ == '__main__':
    with open('cookies_jar.json') as f:
        cookies = json.load(f)
    driver = webdriver.Chrome()
    driver.get('https://www.instagram.com/beeson_owo/')

    for cookie in cookies:
        driver.add_cookie(cookie)
    driver.get('https://www.instagram.com/beeson_owo/')
    sleep(2)
    eles = driver.find_elements_by_class_name('v1Nh3')
    for ele in eles:
        ele.click()
        sleep(1)
        driver.find_element_by_class_name('fr66n').click()
        sleep(1)
        driver.find_element_by_xpath('/html/body/div[6]/div[3]/button').click()
        sleep(1)

可以看到成功將所有貼文點贊了。

結語

今天加入了將所有貼文點贊的功能,透過鎖定了所有貼文遍歷,每次點擊該貼文並按贊之後關閉該貼文。

明日內容

明天會帶各位實戰 Discord 的自動留言爬蟲。

補充資料

Instagram: https://www.instagram.com/

Selenium with Python docs : https://selenium-python.readthedocs.io/

Selenium docs : https://readthedocs.org/projects/selenium-python/downloads/pdf/latest/


上一篇
【Day 21】- 你的爬蟲還在用帳號密碼進行登入? 帶上 Session 吧!(實戰 Selenium 自動點擊 Instagram 好友貼文贊 1/2)
下一篇
【Day 23】- 想用個人的帳號在 Discord 自動留言? 爬蟲能做到!(實戰 Selenium 在 Discord 文字頻道內留言)
系列文
網路爬蟲,萬物皆爬 - 30 天搞懂並實戰網路爬蟲及應對反爬蟲技術30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言