你好。
第一次学习爬行时,我也在尝试各种事情。
这一次,我想把它应用到最近最流行的 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 的标签结构来修复它。