【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/


<<:  云端资安之GCP篇(Google Cloud Platform)

>>:  【DAY 23】制作属於你的第一个应用程序 - Microsoft Power Apps

[DAY 1]前言

我主要身分是软件工程师,参赛ARM主题纯粹是兴趣,毕竟隔行如隔山,软件、韧体、硬体差异太大。希望在这...

Day6 建立 Next.js 专案 - 使用 create-next-app

今天我们要来建立 Next.js 专案,目标是能在自己电脑上成功开启 Next.js 网页。 我预设...

#10-帮网页加上黑暗模式!日夜开关(CSS变数&Media Query)

这几年手机、电脑有黑暗模式,很多网页也加上像电灯一样的开关啦! 黑暗模式可以降低亮度,减少对眼睛的压...

Day 26-Unit Test 应用於 Async Code-2 (情境及应用-6)

Unit Test 应用於 Async Code-2 - 用程序码讲故事(测试码 Exception...

[Day 15] 将专案放上GitHub

今天来把专案上到GitHub啦~ 老实说Git就是那种学校没教,但是你工作又90%会用到的重要东东 ...