如何使用 Python 和 InstaPy 制作 Instagram 机器人

目录

什么SocialCaptainKickstaInstavast,和许多其他公司有什么共同点?它们都可以帮助您在几乎动弹不得的情况下,吸引更多受众、获得更多关注者并在 Instagram 上获得更多赞。他们通过自动化来完成这一切,人们为此支付了很多钱。但是您可以使用 InstaPy 免费做同样的事情!

在本教程中,您将学习如何使用PythonInstaPy构建机器人,InstaPyTim Großmann的库,可自动执行您的 Instagram 活动,以便您以最少的手动输入获得更多关注者和喜欢。在此过程中,您将了解Selenium 的浏览器自动化和页面对象模式,它们共同作为 InstaPy 的基础。

在本教程中,您将学习:

  • 如何Instagram的机器人工作
  • 如何使用Selenium自动化浏览器
  • 如何使用页面对象模式获得更好的可读性和可测试性
  • 如何使用InstaPy构建 Instagram 机器人

在构建 Instagram 机器人之前,您将首先了解 Instagram 机器人的工作原理。

重要提示:在实施任何类型的自动化或抓取技术之前,请务必查看Instagram 的使用条款

Instagram 机器人的工作原理

自动化脚本如何让您获得更多关注者和喜欢?在回答这个问题之前,先想想一个真实的人是如何获得更多粉丝和喜欢的。

他们通过在平台上始终保持活跃来做到这一点。他们经常发帖,关注其他人,喜欢其他人的帖子并发表评论。机器人的工作方式完全相同:它们根据您设置的标准在一致的基础上关注、点赞和评论。

你设定的标准越好,你的结果就会越好。您要确保针对正确的群体,因为您的机器人在 Instagram 上与之互动的人更有可能与您的内容互动。

例如,如果你卖的妇女对Instagram的服装,那么你就可以指导你的机器人喜欢,发表评论,并按照其中大部分是妇女或型材,其职位包括井号标签,例如#beauty#fashion#clothes。这使您的目标受众更有可能注意到您的个人资料、关注您并开始与您的帖子互动。

但是,它在技术方面如何运作?您不能使用Instagram Developer API,因为它在此用途上相当有限。进入浏览器自动化。它的工作方式如下:

  1. 你为它提供你的凭据。
  2. 您可以设置关注谁、留下什么评论以及喜欢哪种类型的帖子的标准。
  3. 您的机器人打开浏览器,在https://instagram.com地址栏上输入,使用您的凭据登录,然后开始执行您指示它执行的操作。

接下来,您将构建 Instagram 机器人的初始版本,它会自动登录到您的个人资料。请注意,您暂时不会使用 InstaPy。

如何自动化浏览器

对于此版本的 Instagram 机器人,您将使用Selenium,它是 InstaPy 在幕后使用的工具。

首先,安装 Selenium。在安装过程中,请确保您还安装了Firefox WebDriver,因为最新版本的InstaPy 不再支持 Chrome。这也意味着您需要在计算机上安装Firefox 浏览器

现在,创建一个 Python 文件并在其中写入以下代码:

 1from time import sleep
 2from selenium import webdriver
 3
 4browser = webdriver.Firefox()
 5
 6browser.get('https://www.instagram.com/')
 7
 8sleep(5)
 9
10browser.close()

运行代码,您将看到 Firefox 浏览器打开并将您定向到 Instagram 登录页面。这是代码的逐行细分:

  • 第 1 行和第 2 行导入sleepwebdriver.
  • 第 4 行初始化 Firefox 驱动程序并将其设置为browser.
  • 第 6行在https://www.instagram.com/地址栏上键入并点击Enter
  • 第 8 行等待 5 秒钟,以便您可以看到结果。否则,它会立即关闭浏览器。
  • 第 10 行关闭浏览器。

这是 Selenium 版本的Hello, World. 现在您已准备好添加登录到您的 Instagram 个人资料的代码。但首先,请考虑如何手动登录您的个人资料。您将执行以下操作:

  1. https://www.instagram.com/
  2. 单击登录链接。
  3. 输入您的凭据。
  4. 点击登录按钮。

上面的代码已经完成了第一步。现在更改它,使其点击 Instagram 主页上的登录链接:

 1from time import sleep
 2from selenium import webdriver
 3
 4browser = webdriver.Firefox()
 5browser.implicitly_wait(5)
 6
 7browser.get('https://www.instagram.com/')
 8
 9login_link = browser.find_element_by_xpath("//a[text()='Log in']")
10login_link.click()
11
12sleep(5)
13
14browser.close()

请注意突出显示的行:

  • 第 5 行设置了 5 秒的等待时间。如果 Selenium 找不到元素,它会等待 5 秒钟以允许所有内容加载并再次尝试。
  • 第 9 行查找<a>文本等于的元素Log in。它使用XPath执行此操作,但您可以使用其他一些方法
  • 第 10 行单击找到<a>的登录链接元素。

运行脚本,您将看到您的脚本正在运行。它将打开浏览器,转到 Instagram,然后单击登录链接以转到登录页面。

在登录页面上,有三个重要元素:

  1. 用户名输入
  2. 密码输入
  3. 登录按钮

接下来,更改脚本以找到这些元素,输入您的凭据,然后单击登录按钮:

 1from time import sleep
 2from selenium import webdriver
 3
 4browser = webdriver.Firefox()
 5browser.implicitly_wait(5)
 6
 7browser.get('https://www.instagram.com/')
 8
 9login_link = browser.find_element_by_xpath("//a[text()='Log in']")
10login_link.click()
11
12sleep(2)
13
14username_input = browser.find_element_by_css_selector("input[name='username']")
15password_input = browser.find_element_by_css_selector("input[name='password']")
16
17username_input.send_keys("<your username>")
18password_input.send_keys("<your password>")
19
20login_button = browser.find_element_by_xpath("//button[@type='submit']")
21login_button.click()
22
23sleep(5)
24
25browser.close()

以下是更改的细分:

  1. 第 12 行休眠两秒钟以允许页面加载。
  2. 第 14 和 15 行通过 CSS 查找用户名和密码输入。您可以使用任何其他您喜欢的方法
  3. 第 17 行和第 18行在各自的输入中键入您的用户名和密码。不要忘记填写<your username><your password>
  4. 第 20 行通过 XPath 查找登录按钮。
  5. 第 21 行单击登录按钮。

运行脚本,您将自动登录到您的 Instagram 个人资料。

你的 Instagram 机器人有了一个良好的开端。如果您继续编写此脚本,那么其余部分将非常相似。你可以通过向下滚动你的提要找到你喜欢的帖子,通过 CSS 找到喜欢按钮,点击它,找到评论部分,发表评论,然后继续。

好消息是所有这些步骤都可以由 InstaPy 处理。但是在开始使用 Instapy 之前,您还应该了解另一件事以更好地了解 InstaPy 的工作原理:页面对象模式

如何使用页面对象模式

现在您已经编写了登录代码,您将如何为其编写测试?它看起来像下面这样:

def test_login_page(browser):
    browser.get('https://www.instagram.com/accounts/login/')
    username_input = browser.find_element_by_css_selector("input[name='username']")
    password_input = browser.find_element_by_css_selector("input[name='password']")
    username_input.send_keys("<your username>")
    password_input.send_keys("<your password>")
    login_button = browser.find_element_by_xpath("//button[@type='submit']")
    login_button.click()

    errors = browser.find_elements_by_css_selector('#error_message')
    assert len(errors) == 0

你能看出这段代码有什么问题吗?它不遵循DRY 原则。也就是说,代码在应用程序和测试代码中都是重复的。

在这种情况下,重复代码尤其糟糕,因为 Selenium 代码依赖于 UI 元素,而 UI 元素往往会发生变化。当它们发生变化时,您希望在一处更新您的代码。这就是页面对象模式的用武之地。

使用此模式,您可以为最重要的页面或片段创建页面对象类,这些页面或片段提供易于编程的接口并隐藏窗口中的底层小部件。考虑到这一点,您可以重写上面的代码并创建一个HomePage类和一个LoginPage类:

from time import sleep

class LoginPage:
    def __init__(self, browser):
        self.browser = browser

    def login(self, username, password):
        username_input = self.browser.find_element_by_css_selector("input[name='username']")
        password_input = self.browser.find_element_by_css_selector("input[name='password']")
        username_input.send_keys(username)
        password_input.send_keys(password)
        login_button = browser.find_element_by_xpath("//button[@type='submit']")
        login_button.click()
        sleep(5)

class HomePage:
    def __init__(self, browser):
        self.browser = browser
        self.browser.get('https://www.instagram.com/')

    def go_to_login_page(self):
        self.browser.find_element_by_xpath("//a[text()='Log in']").click()
        sleep(2)
        return LoginPage(self.browser)

除了主页和登录页面表示为类之外,代码是相同的。这些类封装了在 UI 中查找和操作数据所需的机制。也就是说,有一些方法和访问器允许软件做任何人类可以做的事情。

需要注意的另一件事是,当您使用页面对象导航到另一个页面时,它会返回新页面的页面对象。注意 的返回值go_to_log_in_page()。如果您有另一个名为的类FeedPage,则该类将返回一个实例:。login()LoginPagereturn FeedPage()

以下是如何使用页面对象模式:

from selenium import webdriver

browser = webdriver.Firefox()
browser.implicitly_wait(5)

home_page = HomePage(browser)
login_page = home_page.go_to_login_page()
login_page.login("<your username>", "<your password>")

browser.close()

看起来好多了,上面的测试现在可以改写成这样:

def test_login_page(browser):
    home_page = HomePage(browser)
    login_page = home_page.go_to_login_page()
    login_page.login("<your username>", "<your password>")

    errors = browser.find_elements_by_css_selector('#error_message')
    assert len(errors) == 0

通过这些更改,如果 UI 中的某些内容发生变化,您将不必接触您的测试。

有关页面对象模式的更多信息,请参阅官方文档Martin Fowler 的文章

既然您已经熟悉了 Selenium 和页面对象模式,那么您就会对 InstaPy 感到宾至如归。接下来,您将使用它构建一个基本的机器人。

注意:Selenium 和页面对象模式都广泛用于其他网站,而不仅仅是 Instagram。

如何使用 InstaPy 构建 Instagram 机器人

在本节中,您将使用 InstaPy 构建一个 Instagram 机器人,它会自动点赞、关注和评论不同的帖子。首先,您需要安装 InstaPy:

$ python3 -m pip install instapy

这将安装instapy在您的系统中。

注意:最佳实践是为每个项目使用虚拟环境,以便隔离依赖项。


重要功能

现在您可以使用 InstaPy 重写上面的代码,以便您可以比较这两个选项。首先,创建另一个 Python 文件并将以下代码放入其中:

from instapy import InstaPy

InstaPy(username="<your_username>", password="<your_password>").login()

用你的用户名和密码替换用户名和密码,运行脚本,瞧!只需一行代码,您就获得了相同的结果

即使您的结果相同,您也可以看到行为并不完全相同。除了简单地登录您的个人资料外,InstaPy 还会执行其他一些操作,例如检查您的互联网连接和 Instagram 服务器的状态。这可以直接在浏览器或日志中观察到:

INFO [2019-12-17 22:03:19] [username]  -- Connection Checklist [1/3] (Internet Connection Status)
INFO [2019-12-17 22:03:20] [username]  - Internet Connection Status: ok
INFO [2019-12-17 22:03:20] [username]  - Current IP is "17.283.46.379" and it's from "Germany/DE"
INFO [2019-12-17 22:03:20] [username]  -- Connection Checklist [2/3] (Instagram Server Status)
INFO [2019-12-17 22:03:26] [username]  - Instagram WebSite Status: Currently Up

一行代码就很不错了,不是吗?现在是时候让脚本做比登录更有趣的事情了。

出于本示例的目的,假设您的个人资料都是关于汽车的,并且您的机器人旨在与也对汽车感兴趣的人的个人资料进行交互。

首先,您可以喜欢一些被标记#bmw#mercedes使用的帖子like_by_tags()

 1from instapy import InstaPy
 2
 3session = InstaPy(username="<your_username>", password="<your_password>")
 4session.login()
 5session.like_by_tags(["bmw", "mercedes"], amount=5)

在这里,您为该方法提供了一个要喜欢的标签列表以及每个给定标签要喜欢的帖子数量。在这种情况下,您指示它喜欢十个帖子,两个标签中的每一个五个。但是看看运行脚本后会发生什么:

INFO [2019-12-17 22:15:58] [username]  Tag [1/2]
INFO [2019-12-17 22:15:58] [username]  --> b'bmw'
INFO [2019-12-17 22:16:07] [username]  desired amount: 14  |  top posts [disabled]: 9  |  possible posts: 43726739
INFO [2019-12-17 22:16:13] [username]  Like# [1/14]
INFO [2019-12-17 22:16:13] [username]  https://www.instagram.com/p/B6MCcGcC3tU/
INFO [2019-12-17 22:16:15] [username]  Image from: b'mattyproduction'
INFO [2019-12-17 22:16:15] [username]  Link: b'https://www.instagram.com/p/B6MCcGcC3tU/'
INFO [2019-12-17 22:16:15] [username]  Description: b'Mal etwas anderes \xf0\x9f\x91\x80\xe2\x98\xba\xef\xb8\x8f Bald ist das komplette Video auf YouTube zu finden (n\xc3\xa4here Infos werden folgen). Vielen Dank an @patrick_jwki @thehuthlife  und @christic_  f\xc3\xbcr das bereitstellen der Autos \xf0\x9f\x94\xa5\xf0\x9f\x98\x8d#carporn#cars#tuning#bagged#bmw#m2#m2competition#focusrs#ford#mk3#e92#m3#panasonic#cinematic#gh5s#dji#roninm#adobe#videography#music#bimmer#fordperformance#night#shooting#'
INFO [2019-12-17 22:16:15] [username]  Location: b'K\xc3\xb6ln, Germany'
INFO [2019-12-17 22:16:51] [username]  --> Image Liked!
INFO [2019-12-17 22:16:56] [username]  --> Not commented
INFO [2019-12-17 22:16:57] [username]  --> Not following
INFO [2019-12-17 22:16:58] [username]  Like# [2/14]
INFO [2019-12-17 22:16:58] [username]  https://www.instagram.com/p/B6MDK1wJ-Kb/
INFO [2019-12-17 22:17:01] [username]  Image from: b'davs0'
INFO [2019-12-17 22:17:01] [username]  Link: b'https://www.instagram.com/p/B6MDK1wJ-Kb/'
INFO [2019-12-17 22:17:01] [username]  Description: b'Someone said cloud? \xf0\x9f\xa4\x94\xf0\x9f\xa4\xad\xf0\x9f\x98\x88 \xe2\x80\xa2\n\xe2\x80\xa2\n\xe2\x80\xa2\n\xe2\x80\xa2\n#bmw #bmwrepost #bmwm4 #bmwm4gts #f82 #bmwmrepost #bmwmsport #bmwmperformance #bmwmpower #bmwm4cs #austinyellow #davs0 #mpower_official #bmw_world_ua #bimmerworld #bmwfans #bmwfamily #bimmers #bmwpost #ultimatedrivingmachine #bmwgang #m3f80 #m5f90 #m4f82 #bmwmafia #bmwcrew #bmwlifestyle'
INFO [2019-12-17 22:17:34] [username]  --> Image Liked!
INFO [2019-12-17 22:17:37] [username]  --> Not commented
INFO [2019-12-17 22:17:38] [username]  --> Not following

默认情况下,除了您的amount价值之外,InstaPy 还会喜欢前九个热门帖子。在这种情况下,这会使每个标签的总点赞数达到 14(九个热门帖子加上您在 中指定的五个amount)。

另请注意,InstaPy 会记录其执行的每个操作。正如你在上面看到的,它提到了它喜欢的帖子以及它的链接、描述、位置,以及机器人是否对帖子发表了评论或关注了作者。

您可能已经注意到,几乎每次操作后都会出现延迟。那是设计使然。它可以防止您的个人资料在 Instagram 上被禁止。

现在,您可能不希望您的机器人喜欢不适当的帖子。为了防止这种情况发生,您可以使用set_dont_like()

from instapy import InstaPy

session = InstaPy(username="<your_username>", password="<your_password>")
session.login()
session.like_by_tags(["bmw", "mercedes"], amount=5)
session.set_dont_like(["naked", "nsfw"])

通过此更改,将不会喜欢包含文字nakednsfw描述中的帖子。您可以标记您希望机器人避免的任何其他单词。

接下来,您可以告诉机器人不仅喜欢这些帖子,还可以关注这些帖子的一些作者。你可以这样做set_do_follow()

from instapy import InstaPy

session = InstaPy(username="<your_username>", password="<your_password>")
session.login()
session.like_by_tags(["bmw", "mercedes"], amount=5)
session.set_dont_like(["naked", "nsfw"])
session.set_do_follow(True, percentage=50)

如果您现在运行该脚本,那么机器人将关注其喜欢的帖子的 50% 的用户。像往常一样,每一个动作都会被记录下来。

您还可以对帖子发表一些评论。您需要做两件事。首先,启用评论set_do_comment()

from instapy import InstaPy

session = InstaPy(username="<your_username>", password="<your_password>")
session.login()
session.like_by_tags(["bmw", "mercedes"], amount=5)
session.set_dont_like(["naked", "nsfw"])
session.set_do_follow(True, percentage=50)
session.set_do_comment(True, percentage=50)

接下来,告诉机器人要留下什么评论set_comments()

from instapy import InstaPy

session = InstaPy(username="<your_username>", password="<your_password>")
session.login()
session.like_by_tags(["bmw", "mercedes"], amount=5)
session.set_dont_like(["naked", "nsfw"])
session.set_do_follow(True, percentage=50)
session.set_do_comment(True, percentage=50)
session.set_comments(["Nice!", "Sweet!", "Beautiful :heart_eyes:"])

运行脚本,机器人将在与其交互的一半帖子上留下这三个评论之一。

现在您已经完成了基本设置,最好用end()以下命令结束会话:

from instapy import InstaPy

session = InstaPy(username="<your_username>", password="<your_password>")
session.login()
session.like_by_tags(["bmw", "mercedes"], amount=5)
session.set_dont_like(["naked", "nsfw"])
session.set_do_follow(True, percentage=50)
session.set_do_comment(True, percentage=50)
session.set_comments(["Nice!", "Sweet!", "Beautiful :heart_eyes:"])
session.end()

这将关闭浏览器、保存日志并准备一份您可以在控制台输出中看到的报告。

InstaPy 中的附加功能

InstaPy 是一个相当大的项目,它有许多完整记录的功能。好消息是,如果您对上面使用的功能感到满意,那么其余的应该感觉非常相似。本节将概述 InstaPy 的一些更有用的功能。

配额主管

你不能每天都在 Instagram 上爬。该服务会很快注意到您正在运行机器人并禁止其某些操作。这就是为什么最好为机器人的某些操作设置配额的原因。以以下为例:

session.set_quota_supervisor(enabled=True, peak_comments_daily=240, peak_comments_hourly=21)

机器人将继续评论,直到达到每小时和每天的限制。配额期过后,它将恢复评论。

无头浏览器

此功能允许您在没有浏览器 GUI 的情况下运行您的机器人。如果您想将机器人部署到您可能没有或不需要图形界面的服务器,这将非常有用。它的 CPU 密集度也较低,因此可以提高性能。你可以像这样使用它:

session = InstaPy(username='test', password='test', headless_browser=True)

请注意,您在初始化InstaPy对象时设置了此标志。

使用人工智能分析帖子

之前您看到了如何忽略描述中包含不当词语的帖子。如果描述很好但图像本身不合适怎么办?您可以将 InstaPy 机器人与ClarifAI集成,后者提供图像和视频识别服务:

session.set_use_clarifai(enabled=True, api_key='<your_api_key>')
session.clarifai_check_img_for(['nsfw'])

现在你的机器人不会喜欢或评论 ClarifAI 认为NSFW 的任何图像。您每月可获得 5,000 次免费 API 调用。

关系界限

与拥有大量粉丝的人的帖子互动通常是在浪费时间。在这种情况下,最好设置一些关系边界,这样您的机器人就不会浪费您宝贵的计算资源:

session.set_relationship_bounds(enabled=True, max_followers=8500)

有了这个,您的机器人将不会与拥有超过 8,500 个关注者的用户的帖子互动。

有关 InstaPy 中的更多功能和配置,请查看文档

结论

InstaPy 允许您以最少的麻烦和努力自动化您的 Instagram 活动。这是一个非常灵活的工具,具有许多有用的功能。

在本教程中,您学习了:

  • 如何Instagram的机器人工作
  • 如何使用Selenium自动化浏览器
  • 如何使用页面对象模式使您的代码更易于维护和测试
  • 如何使用InstaPy构建一个基本的 Instagram 机器人

阅读InstaPy 文档并使用您的机器人进行一些试验。很快,您将开始以最少的努力获得新的关注者和喜欢。在编写本教程时,我自己获得了一些新的追随者。如果您更喜欢视频教程,还有由 InstaPy Tim Großmann的创建者提供的Udemy 课程

如果您有什么想问或想分享的,请在下面的评论中联系我们。

(完)