Spaces:
Sleeping
Sleeping
| import gradio as gr | |
| import os | |
| import zipfile | |
| import instaloader | |
| from selenium import webdriver | |
| from selenium.webdriver.common.by import By | |
| from selenium.webdriver.common.keys import Keys | |
| import time | |
| # Function to log in to Instagram using Selenium | |
| def instagram_login(username, password): | |
| chrome_options = webdriver.ChromeOptions() | |
| chrome_options.add_argument("--headless") # Uncomment this to run in headless mode | |
| driver = webdriver.Chrome(options=chrome_options) | |
| driver.get("https://www.instagram.com/accounts/login/") | |
| time.sleep(3) | |
| # Locate and input username and password | |
| username_input = driver.find_element(By.NAME, "username") | |
| password_input = driver.find_element(By.NAME, "password") | |
| username_input.send_keys(username) | |
| password_input.send_keys(password) | |
| # Submit login form | |
| password_input.send_keys(Keys.RETURN) | |
| time.sleep(5) # Adjust sleep time as needed | |
| return driver | |
| # Function to get posts, followers, and following using Instaloader | |
| def get_instagram_data(username, password, folder_name): | |
| # Log in to Instagram with Selenium | |
| driver = instagram_login(username, password) | |
| # Set up Instaloader | |
| L = instaloader.Instaloader(dirname_pattern=folder_name + "/{target}") | |
| L.login(username, password) | |
| # Fetch profile data | |
| profile = instaloader.Profile.from_username(L.context, username) | |
| # Create directory if not exists | |
| if not os.path.exists(folder_name): | |
| os.makedirs(folder_name) | |
| # Get posts data | |
| posts_data = [] | |
| for post in profile.get_posts(): | |
| post_data = { | |
| 'caption': post.caption, | |
| 'likes': post.likes, | |
| 'comments': post.comments, | |
| 'date': post.date, | |
| 'url': post.url, | |
| 'video': post.is_video | |
| } | |
| posts_data.append(post_data) | |
| # Download post image/video | |
| L.download_post(post, target=username) | |
| # Get followers | |
| followers = [follower.username for follower in profile.get_followers()] | |
| # Get following | |
| following = [followee.username for followee in profile.get_followees()] | |
| # Save posts data, followers, and following into text files | |
| with open(os.path.join(folder_name, 'posts_data.txt'), 'w') as file: | |
| for i, post in enumerate(posts_data, 1): | |
| file.write(f"Post {i}\n") | |
| for key, value in post.items(): | |
| file.write(f"{key.capitalize()}: {value}\n") | |
| file.write("\n") | |
| with open(os.path.join(folder_name, 'followers.txt'), 'w') as file: | |
| for follower in followers: | |
| file.write(f"{follower}\n") | |
| with open(os.path.join(folder_name, 'following.txt'), 'w') as file: | |
| for followee in following: | |
| file.write(f"{followee}\n") | |
| # Create a ZIP file | |
| zip_filename = f"{folder_name}.zip" | |
| with zipfile.ZipFile(zip_filename, 'w') as zipf: | |
| for root, dirs, files in os.walk(folder_name): | |
| for file in files: | |
| zipf.write(os.path.join(root, file), | |
| arcname=os.path.relpath(os.path.join(root, file), | |
| os.path.join(folder_name, '..'))) | |
| driver.quit() | |
| return zip_filename | |
| # Gradio Interface | |
| def main(username, password, folder_name): | |
| if username and password: | |
| zip_file = get_instagram_data(username, password, folder_name) | |
| success_message = f"Data saved and compressed into ZIP file: `{zip_file}`" | |
| return zip_file, success_message | |
| else: | |
| return None, "Please enter both username and password." | |
| # Create Gradio interface | |
| iface = gr.Interface( | |
| fn=main, | |
| inputs=[ | |
| gr.Textbox(label="Instagram Username"), | |
| gr.Textbox(label="Instagram Password", type="password"), | |
| gr.Textbox(label="Folder Name to Save Data", value="instagram_data") | |
| ], | |
| outputs=["file", "text"], | |
| title="Snap Crawler", | |
| description="Extracts posts, followers, and following from an Instagram account and saves them in a ZIP file." | |
| ) | |
| if __name__ == "__main__": | |
| iface.launch() | |