你好。
第一次學習爬行時,我也在嘗試各種事情。
這一次,我想把它應用到最近最流行的 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 的標籤結構來修復它。