分类
编码

是否可以自动检查 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_CN简体中文