From 4ca7ad4c1fc52bfdb5d571820b19797d2899800e Mon Sep 17 00:00:00 2001 From: Harminder Singh Nijjar <110620707+harmindersinghnijjar@users.noreply.github.com> Date: Thu, 2 Mar 2023 22:44:13 -0800 Subject: [PATCH] Add files via upload --- logo.png | Bin 0 -> 38820 bytes main.py | 199 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 199 insertions(+) create mode 100644 logo.png create mode 100644 main.py diff --git a/logo.png b/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..cf92a91d6c6eb53ce9e79f6b87ea107bfc9cd668 GIT binary patch literal 38820 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 G`{jQCb#6ZZ literal 0 HcmV?d00001 diff --git a/main.py b/main.py new file mode 100644 index 0000000..7707305 --- /dev/null +++ b/main.py @@ -0,0 +1,199 @@ +# Author: harmindersinghnijjar +# Date: 2023-03-02 +# Version: 1.0.0 +# Usage: python main.py + +# Import the necessary libraries. +import PyQt5 +from selenium import webdriver +from selenium.webdriver.chrome.options import Options +from selenium.webdriver.common.by import By +from selenium.webdriver.support.ui import WebDriverWait +from selenium.webdriver.support import expected_conditions as EC +from selenium.common.exceptions import TimeoutException +from selenium.common.exceptions import NoSuchElementException +from time import sleep +from webdriver_manager.chrome import ChromeDriverManager +from bs4 import BeautifulSoup +import getpass +import openai +import os +import time +import sqlite3 +import sys +import tkinter as tk +from tkinter import messagebox + +# Set username. +USER = getpass.getuser() + +# Declare global variables. +ELECTRONICS = 'https://www.facebook.com/marketplace/category/electronics?deliveryMethod=local_pick_up&exact=false' +APPLIANCES = 'https://www.facebook.com/marketplace/category/appliances?deliveryMethod=local_pick_up&exact=false' +FURNITURE = 'https://www.facebook.com/marketplace/category/furniture?deliveryMethod=local_pick_up&exact=false' +LOCATIONS = ['pullman', 'colfax', 'moscow'] + +# Define a Selenium class to automate the browser. +class Selenium(): + # Define a method to initialize the browser. + def __init__(self): + # Close the Chrome instance if it is already running. + os.system("taskkill /f /im chrome.exe") + # Set the options for the Chrome browser. + chrome_options = Options() + # chrome_options.add_argument("--headless") + # Add a user data directory as an argument for options. + chrome_options.add_argument( + f"--user-data-dir=C:\\Users\\{USER}\\AppData\\Local\\Google\\Chrome\\User Data") + chrome_options.add_argument("profile-directory=Default") + chrome_options.add_argument("--disable-dev-shm-usage") + chrome_options.add_argument("--no-sandbox") + + # Initialize the Chrome browser using the ChromeDriverManager. + self.browser = webdriver.Chrome( + ChromeDriverManager().install(), options=chrome_options) + + # Define a method to get the page source using Selenium. + def get_page_source(self, url): + # Try to get the page source. + try: + # Load the URL. + self.browser.get(url) + + # Wait for the page to load. + WebDriverWait(self.browser, 10).until(EC.presence_of_element_located( + (By.CSS_SELECTOR, "div[class=' x1gslohp x1e56ztr']"))) + + for i in range(1, 5): + # Scroll down to the bottom of the page to load all items. + self.browser.execute_script( + "window.scrollTo(0, document.body.scrollHeight);") + + # Wait for the page to finish loading. + sleep(5) + + + # Get the page source. + page_source = self.browser.page_source + + return page_source + + # Catch any exceptions. + except TimeoutException: + print("Timed out waiting for page to load.") + return None + + except NoSuchElementException: + print("Element not found.") + return None + + # Define a method to close the browser. + def close_browser(self): + self.browser.quit() + + # Define a method tp scrape the Facebook Marketplace page using Selenium, BeautifulSoup, and SQLite. + def scrape_facebook_marketplace(self): + # Initialize the Selenium class. + # sel = Selenium() + # Initialize the database connection. + conn = sqlite3.connect("facebook_marketplace.db") + c = conn.cursor() + + # Create the tables if they don't exist. + c.execute('''CREATE TABLE IF NOT EXISTS facebook_marketplace_posts + (id INTEGER PRIMARY KEY, title TEXT, price TEXT, location TEXT, category TEXT, url TEXT, date_added TIMESTAMP DEFAULT CURRENT_TIMESTAMP)''') + + # TODO: Remove these two loops and replace them with a single loop that iterates 3 times. However, the code below works for now and trying to fix it is not a priority. + for location in LOCATIONS: + for category, url in {'Electronics': ELECTRONICS, 'Appliances': APPLIANCES, 'Furniture': FURNITURE}.items(): + # Keeping the number of iterations below 5 for now to avoid getting blocked by Facebook and also to keep the results from being too far away from Pullman. + for i in range (1, 5): + # Scroll down to the bottom of the page to load all items. + self.browser.execute_script( + "window.scrollTo(0, document.body.scrollHeight);") + # Sleep for 5 seconds then scroll again. + time.sleep(1) + + # Get the page source using Selenium. + page_source = self.get_page_source(url) + + # Parse the page source using BeautifulSoup. + soup = BeautifulSoup(page_source, 'html.parser') + + # Get the items. + div = soup.find_all('div', class_='x9f619 x78zum5 x1r8uery xdt5ytf x1iyjqo2 xs83m0k x1e558r4 x150jy0e xnpuxes x291uyu x1uepa24 x1iorvi4 xjkvuk6') + + # Iterate through the items. + for d in div: + try: + # Get the item image. + image = d.find('img', class_='xt7dq6l xl1xv1r x6ikm8r x10wlt62 xh8yej3')['src'] + # Get the item title from span. + title = d.find('span', 'x1lliihq x6ikm8r x10wlt62 x1n2onr6').text + # Get the item price. + price = d.find('span', 'x193iq5w xeuugli x13faqbe x1vvkbs x1xmvt09 x1lliihq x1s928wv xhkezso x1gmr53x x1cpjm7i x1fgarty x1943h6x xudqn12 x676frb x1lkfr7t x1lbecb7 x1s688f xzsf02u').text + # Get the item URL. + url = d.find('a', class_='x1i10hfl xjbqb8w x6umtig x1b1mbwd xaqea5y xav7gou x9f619 x1ypdohk xt0psk2 xe8uvvx xdj266r x11i5rnm xat24cr x1mh8g0r xexx8yu x4uap5 x18d9i69 xkhd6sd x16tdsg8 x1hl2dhg xggy1nq x1a2a7pz x1heor9g x1lku1pv')['href'] + # Get the item location. + location = d.find('span', 'x1lliihq x6ikm8r x10wlt62 x1n2onr6 xlyipyv xuxw1ft x1j85h84').text + + # Print the item information. + print(f"Image: {image}") + print(f"Price: {price}") + print(f"Title: {title}") + print(f"Location: {location}") + print(f"Category: {category}") + url = (f"www.facebook.com{url}") + print(f"URL: {url}") + print("------------------------") + c.execute("INSERT INTO facebook_marketplace_posts (title,price, location, category, url)VALUES (?, ?, ?, ?, ?)", + (title, price,location, category,url)) + conn.commit() + except: + pass + + # Close the database connection. + conn.close() + + # Close the browser. + self.close_browser() + +class MainWindow(tk.Tk): + def __init__(self): + super().__init__() + + # Set the window title and size. + self.title("Facebook Marketplace Scraper") + self.geometry("350x200") + + # Add a label to the window. + self.label = tk.Label(self, text="Click the button to start scraping Facebook Marketplace.") + self.label.pack(pady=10) + + # Add a button to the window. + self.button = tk.Button(self, text="Scrape Marketplace", command=self.scrape_marketplace) + self.button.pack(pady=10) + + # Add a label to write "Developed by" to the window. + self.label = tk.Label(self, text="Developed by:") + self.label.pack(pady=2) + + + # Add Logo to the window. + self.logo = tk.PhotoImage(file="logo.png") + self.logo = self.logo.subsample(2, 2) + self.label = tk.Label(self, image=self.logo) + self.label.pack(pady=10) + + # Define a method to scrape Facebook Marketplace. + def scrape_marketplace(self): + # Initialize the Selenium class. + sel = Selenium() + # Call the scrape_facebook_marketplace method. + sel.scrape_facebook_marketplace() + +if __name__ == "__main__": + app = MainWindow() + app.mainloop() + + \ No newline at end of file