分類
編碼

是否可以自動檢查 Instagram F4F(關注)狀態?

你好。

第一次學習爬行時,我也在嘗試各種事情。

這一次,我想把它應用到最近最流行的 SNS 之一的 Instagram 上。

為了讓它變得有趣,我試圖用一點人類心理學來做以下事情。

這個怎麼樣?你不想試試嗎🙂

有時人們不再關注我。 TT

現在,讓我們一步一步來。

導入所需模塊

import time
import sys
from selenium import webdriver
from bs4 import BeautifulSoup

selenium 包中的 webdriver 模塊啟動 Web 瀏覽器並允許您根據腳本命令執行操作,而 bs4 包中的 BeautifulSoup 模塊具有允許您輕鬆從 HTML DOM 數據中提取所需內容的功能。

如果 selenium 和 bs4 包不存在,請通過在命令窗口中輸入以下內容來安裝它們。

pip install bs4
pip install selenium

並且可以從下面的鏈接下載 Chrome 網絡驅動程序。

https://sites.google.com/a/chromium.org/chromedriver/downloads

其餘的是基本模塊,因此您可以立即導入和使用它們。

登錄 Instagram

現在打開 Chrome 瀏覽器並嘗試通過訪問 Instagram 地址登錄。

讓我們直接從命令窗口輸入。

例如,假設您在命令窗口中鍵入以下內容。

python crawling_instagram.py sangminem 123456

其中 sys.argv[0] 變為 crawling_instagram.py , sys.argv[1] 變為 sangminem 並且 sys.argv[2] 變為 123456 。

讓我們使用它來編寫代碼以登錄 Instagram,如下所示。

browser = webdriver.Chrome('./chromedriver')
browser.get('https://www.instagram.com/'+sys.argv[1])
browser.execute_script("document.querySelectorAll('.-nal3')[1].click();")
time.sleep(2)
browser.find_element_by_name('username').send_keys(sys.argv[1])
browser.find_element_by_name('password').send_keys(sys.argv[2])
browser.find_element_by_xpath('//*[@id="loginForm"]/div[1]/div[3]/button').submit()
time.sleep(5)
browser.find_element_by_xpath('//*[@id="react-root"]/section/main/div/div/div/div/button').click()

我使用 chromedriver 打開 Chrome 網絡瀏覽器,並通過結合 Instagram 地址和用戶名進行連接。

我使用 browser.execute_script 單擊了關注者按鈕以打開登錄窗口。

(如果您在未登錄時單擊,則會顯示登錄窗口。)

之後,我等待了 2 秒,以防加載時間更長。

接下來輸入類型找到用戶名和密碼部分,使用send_keys方法輸入用戶名和密碼。

我在帶有 xpath 的表單中找到了登錄按鈕並調用了提交方法。

您可以通過右鍵單擊要在開發人員的 Elements 選項卡中找到的元素來獲取 xpath,當您在 Chrome 中按 F12 時會出現該選項卡,然後選擇 Copy > Copy xpath。

等待 5 秒以進行下一次登錄。

這是我為稍後再次使用 xpath 單擊 Do 按鈕而編寫的代碼。

由於這部分將被簡單地跳過,因此將省略詳細說明。

獲取關注者列表

現在登錄完成,我們來實現獲取關注者數量的邏輯。

time.sleep(2)
browser.execute_script("document.querySelectorAll('.-nal3')[1].click();")
time.sleep(1)
oldHeight = -1
newHeight = -2
while oldHeight != newHeight:
    oldHeight = newHeight
    newHeight = browser.execute_script("return document.querySelectorAll('._aano')[0].scrollHeight")
    browser.execute_script("document.querySelectorAll('.isgrP')[0].scrollTo(0,document.querySelectorAll('._aano')[0].scrollHeight)")
    time.sleep(0.5)
soup = BeautifulSoup(browser.page_source, 'html.parser')
followers = soup.findAll('a',['FPmhX','notranslate','_0imsa'])
followers_text = []
for follower in followers:
    followers_text.append(follower.get_text())
print("Number of followers: " + str(len(followers_text)))

再次等待 2 秒以防止出現故障後,我再次點擊了隨從 barton。

這是等待1秒並認真獲取關注者用戶名的部分。

由於我們需要先獲取所有關注者,因此我們實現了反复降低滾動條的邏輯,以便通過 while 語句加載所有人。

如果舊滾動高度和新滾動高度不同,則意味著要加載的內容更多,因此這是一種不斷重複的語法,直到舊滾動高度和新滾動高度相同為止。

類名,也就是querySelectorAll方法參數的值,是從Developer Mode Elements選項卡中直接查看和導入的值。

加載完成後,通過 BeautifulSoup 模塊導入 html 數據,檢查標籤和用戶名的類,將它們全部提取並放入數組中。

我用 print 方法得到了數組的長度,並在屏幕上打印了關注者的數量。

獲取以下列表

接下來,讓我們獲取關注者的數量。

browser.find_element_by_xpath('/html/body/div[4]/div/div/div[1]/div/div[2]/button').click()
time.sleep(0.5)
browser.execute_script("document.querySelectorAll('.-nal3')[2].click();")
time.sleep(1)
oldHeight = -1
newHeight = -2
while oldHeight != newHeight:
    oldHeight = newHeight
    newHeight = browser.execute_script("return document.querySelectorAll('._aano')[0].scrollHeight")
    browser.execute_script("document.querySelectorAll('.isgrP')[0].scrollTo(0,document.querySelectorAll('._aano')[0].scrollHeight)")
    time.sleep(0.5)
soup = BeautifulSoup(browser.page_source, 'html.parser')
followings = soup.findAll('a',['FPmhX','notranslate','_0imsa'])
followings_text = []
for following in followings:
    followings_text.append(following.get_text())
print("Number of followings: " + str(len(followings_text)))

使用 xpath 單擊關閉按鈕以關閉跟隨窗口。

然後我等了半秒,點擊了下面的按鈕。

然後我又等了 1 秒鐘,得到了我關注的用戶名。

獲取關注者用戶名的模式幾乎相似,所以我不再贅述。

只獲取您關注的人

最後,讓我們將關注者用戶名列表與關注用戶名列表進行比較,以找到非關注者。

result = []
for following in followings_text:
    cnt = 0
    for follower in followers_text:
        if following == follower:
            cnt += 1
            break
    if cnt == 0:
        result.append(following)
print('List of people who did not F4F: '+str(result))

根據關注用戶名,我們一一查看所有關注用戶名列表,如果有,反复執行退出的邏輯。

如果計數為0,則表示我在關注但不在關注者列表中,所以我沒有F4F並將其添加到結果數組中。

最後,輸出結果數組就達到了預期的目的。

像這樣。

我追了你沒追? ㅠ

作為參考,我只關注熟人,所以不關注我的人不多。

它只是達到了它的目的。

全源共享

如果有人想要,請分享。

import time
import sys
from selenium import webdriver
from bs4 import BeautifulSoup
username = sys.argv[1]
browser = webdriver.Chrome('./chromedriver')
browser.get('https://www.instagram.com/'+username)
browser.execute_script("document.querySelectorAll('.-nal3')[1].click();")
time.sleep(2)
browser.find_element_by_name('username').send_keys(sys.argv[1])
browser.find_element_by_name('password').send_keys(sys.argv[2])
browser.find_element_by_xpath('//*[@id="loginForm"]/div[1]/div[3]/button').submit()
time.sleep(5)
browser.find_element_by_xpath('//*[@id="react-root"]/section/main/div/div/div/div/button').click()
time.sleep(5)
if len(sys.argv) > 3:
    username = sys.argv[3]
print('Account: ' + username)
browser.get('https://www.instagram.com/'+username)
time.sleep(2)
browser.execute_script("document.querySelectorAll('.-nal3')[1].click();")
time.sleep(1)
oldHeight = -1
newHeight = -2
while oldHeight != newHeight:
    oldHeight = newHeight
    newHeight = browser.execute_script("return document.querySelectorAll('.jSC57')[0].scrollHeight")
    browser.execute_script("document.querySelectorAll('.isgrP')[0].scrollTo(0,document.querySelectorAll('.jSC57')[0].scrollHeight)")
    time.sleep(0.5)
soup = BeautifulSoup(browser.page_source, 'html.parser')
followers = soup.findAll('a',['FPmhX','notranslate','_0imsa'])
followers_text = []
for follower in followers:
    followers_text.append(follower.get_text())
print("Number of followers: " + str(len(followers_text)))
browser.find_element_by_xpath('/html/body/div[4]/div/div/div[1]/div/div[2]/button').click()
time.sleep(0.5)
browser.execute_script("document.querySelectorAll('.-nal3')[2].click();")
time.sleep(1)
oldHeight = -1
newHeight = -2
while oldHeight != newHeight:
    oldHeight = newHeight
    newHeight = browser.execute_script("return document.querySelectorAll('._aano')[0].scrollHeight")
    browser.execute_script("document.querySelectorAll('.isgrP')[0].scrollTo(0,document.querySelectorAll('._aano')[0].scrollHeight)")
    time.sleep(0.5)
soup = BeautifulSoup(browser.page_source, 'html.parser')
followings = soup.findAll('a',['FPmhX','notranslate','_0imsa'])
followings_text = []
for following in followings:
    followings_text.append(following.get_text())
print("Number of followings: " + str(len(followings_text)))
result = []
for following in followings_text:
    cnt = 0
    for follower in followers_text:
        if following == follower:
            cnt += 1
            break
    if cnt == 0:
        result.append(following)
print('List of people who did not F4F: '+str(result))

下次見,有別的話題。 🙂

(注意)類名可以不時更改,所以如果程序不起作用,您可能需要自己弄清楚 Instagram 的標籤結構來修復它。

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

zh_TW繁體中文