Sponsor Me On GitHub!

Python Automation With Selenium

BC

Benjamin Carlson / April 29, 2020

5 min read––– views

Introduction

Recently I make two YouTube videos detailing how to use Python and Selenium to code an Instagram Bot. Today, I am taking those videos and putting them into article format so you can follow along and copy/paste code! Just like the videos, I will be splitting these articles into 2 parts. You can watch the first video here:

Prerequisites

The following are items you need installed before you begin.

Python

  • Navigate to https://www.python.org/downloads/ and download the latest version.

Virtualenv

  • Run the following command:
pip install virtualenv

(Note: you need pip installed to run the command)

Selenium

WebDriver for Chrome

mv ~Downloads/chromedriver /usr/local/bin

(Note: There is a space after …chromedriver and /usr…)

After you have those three things, we are ready to start!

Setting Up The Environment

We will be using a Python virtual environment to keep this project and its dependancies separate from other projects on your machine.

Make a new folder where you want to store this project, move into that folder, and then create a new virtual environment.

mkdir <projectName>
cd <projectName>
virtualenv -p python3 <venvName>

Next, activate the virtual environment.

source <venvName>/bin/activate

Next, let’s install Selenium. Selenium is our one dependency for this project and it allows us to automate web browsers.

pip install selenium

Finally, open those files in a code editor of your choice.

Time To Code!

I mentioned that we are going to be making an Instagram bot. More specifically, we will be writing code to automate logging in to Instagram, searching a hashtag from the explore page, and liking and commenting on each picture.

Create a file named bot.py at the same level as your vitualenv.

Inside this file, write the following code:

from selenium import webdriver
from time import sleep
from selenium.webdriver.common.keys import Keys
from random import randint

We will use each of these imports and discuss what they each do when we use them.

Next, let’s declare some standard Python boilerplate code:

class Bot(): 
    def __init__(self):
        self.login('benscstutorials')
   
    def login(self, username):
        print('hi')
def main():
    my_bot = Bot()
if __name__ == '__main__':
    main()

The above code will print hi if you run it.

Next, lets declare an instance of our webdriver. The following code will all be written in the login def.

self.driver = webdriver.Chrome()

We can now user driver to call various methods that webdriver gives us access to. First, we need to open instagram. We can do that with the get method.

self.driver.get('https://www.instagram.com/')

If we run this with python -i bot.py, you will see an automated webbrowser window open up and navigate to Instagram.

Pretty cool, right!

Next, we need to wait for Instagram to open. This is where sleep comes in. We can use sleep to make our code go idle for a specified number of seconds.

sleep(5)

Now, we need to insert our username and password into the form and hit login. To do this we can get each element by xpath, and use the send_keys() method to send text!

To get the element xpath, right click on the element and click inspect. This will bring you to the source code. Next, right click on the source code for that element. Towards the bottom you will see copy, copy xpath.

Python

Do this for both username and password. Then, in your editor write the following code in the login method:

username_input = self.driver.find_element_by_xpath("//input[@name='username']")
username_input.send_keys(username)
password_input = self.driver.find_element_by_xpath("//input[@name='password']")
password_input.send_keys(pw)

You will notice that i am sending the variable pw instead of my actual password. This is for security reasons. Make a new file called secrets.py and inside it, declare your password as such:

secrets.py
pw = 'XXXXXX'

Then, at the top of bot.py write

bot.py
from secrets import pw

The next step is to click login.

To do this, copy the xpath of the submit button and use the click() method.

submit_btn = self.driver.find_element_by_xpath(//button[@type=’submit’])
submit_btn.click()

This should log us in!

You will notice that a popup appears when you log in asking you if you want to turn on notifications.

Python

We want to hit not now. Again copy the xpath and use the click() method.

sleep(5)
not_now_btn = self.driver.find_element_by_xpath(/html/body/div[4]/div/div/div[3]/button[2])
not_now_btn.click()

Be sure to add sleep(5). If you don’t instagram will not be loaded fully and your code will fail!

Your final code should look like such:

from selenium import webdriver
from time import sleep
from secrets import pw
from selenium.webdriver.common.keys import Keys
from random import randint
class Bot():
    def __init__(self):
        self.login('benscstutorials')
    
    def login(self, username):
        self.driver = webdriver.Chrome()   
        self.driver.get('https://www.instagram.com/')
        sleep(5)
        username_input = self.driver.find_element_by_xpath(
            "//input[@name='username']")
        username_input.send_keys(username)
        password_input = self.driver.find_element_by_xpath(
            "//input[@name='password']")
        password_input.send_keys(pw)
        submit_btn = self.driver.find_element_by_xpath(
            "//button[@type='submit']")
        submit_btn.click()
        sleep(5)
        not_now_btn = self.driver.find_element_by_xpath(
            '/html/body/div[4]/div/div/div[3]/button[2]')
        not_now_btn.click()
def main():
    my_bot = Bot()
if __name__ == '__main__':
    main()

Conclusion

That’s it! In the next post I will continue this and discuss how to like and comment on posts by hashtag.

Share on TwitterEdit on GitHub

Sponsor Benjamin Carlson on GitHub Sponsors

Hi 👋 I'm Benjamin Carlson, a senior college student studying computer science. I post weekly tutorial videos on my YouTube channel and build cool open source projects!