Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Empty file removed .env
Empty file.
54 changes: 54 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
# === Python build artifacts ===
*.pyc
*.pyo
*.pyd
__pycache__/
*.log

# === SQLite & output files ===
*.sqlite3
*.db
output.json

# === Environment variables ===
.env
.env.*
*.env

# === Virtual environments ===
venv/
.venv/
.env/

# === VSCode project settings ===
.vscode/

# === macOS system files ===
.DS_Store

# === Pytest and test cache ===
htmlcov/
.coverage
.cache/
pytest_cache/
.tox/

# === Jupyter Notebook ===
.ipynb_checkpoints/

# === Django migration artifacts (optional to ignore) ===
# Uncomment the lines below if you want to regenerate migrations often
# **/migrations/*.py
# **/migrations/*.pyc
# !**/migrations/__init__.py

# === FastAPI-specific artifacts ===
fastapi_email/email_db.sqlite3

# === IDE-specific ===
.idea/
*.sublime-project
*.sublime-workspace

# === GitHub Codespaces or devcontainers ===
.devcontainer/
14 changes: 14 additions & 0 deletions .vscode/settings.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
{
"python.analysis.extraPaths": [
"./webscraper/ABC"
],
"python.testing.unittestArgs": [
"-v",
"-s",
"./webscraper",
"-p",
"*test*.py"
],
"python.testing.pytestEnabled": false,
"python.testing.unittestEnabled": true
}
Binary file removed accounts/__pycache__/__init__.cpython-312.pyc
Binary file not shown.
Binary file removed accounts/__pycache__/admin.cpython-312.pyc
Binary file not shown.
Binary file removed accounts/__pycache__/apps.cpython-312.pyc
Binary file not shown.
Binary file removed accounts/__pycache__/models.cpython-312.pyc
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file removed cheaper/__pycache__/__init__.cpython-312.pyc
Binary file not shown.
Binary file removed cheaper/__pycache__/settings.cpython-312.pyc
Binary file not shown.
Binary file removed cheaper/__pycache__/urls.cpython-312.pyc
Binary file not shown.
15 changes: 15 additions & 0 deletions webscraper/ABC/Ebay_API.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
from abc import ABC,abstractmethod

class EbayApi(ABC):

@abstractmethod
def retrieve_access_token() -> str:
""" retrieves the user access token for sandbox environment it's a long line
of text, numbers, symbols
"""
pass

@abstractmethod
def retrieve_ebay_response(httprequest:str,query:str) -> dict:
""" retrieves a json of large data with category ids, names, parentcategorynodes """
pass
Binary file not shown.
55 changes: 55 additions & 0 deletions webscraper/api/EbayAPI.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
import requests
from requests.auth import HTTPBasicAuth
from dotenv import load_dotenv
import os


load_dotenv() #initialize

class EbayAPI:

client_secret_key = os.getenv("clientsecret")
client_id_key = os.getenv("clientid")

get_user_key = HTTPBasicAuth(client_id_key, client_secret_key)


def retrieve_access_token():
try:
response = requests.post("https://api.sandbox.ebay.com/identity/v1/oauth2/token",
headers = {"Content-Type":"application/x-www-form-urlencoded"},
data = {
"grant_type": "client_credentials",
"scope": "https://api.ebay.com/oauth/api_scope"
},
auth=EbayAPI.get_user_key
)
access_token = response.json().get("access_token")
status_code = response.status_code
if(status_code == 404):
raise Exception("404 error here")
return access_token
except Exception as e:
raise e

def retrieve_ebay_response(httprequest:str,query:str):
auth = EbayAPI.retrieve_access_token()
try:
response = requests.get(httprequest,
headers={
"Authorization": f"Bearer {auth}",
"Content-Type": "application/json"
},
params= {
"q": query,
"category_tree_id": 0
}
)
status_code = response.status_code
if(status_code == 404):
raise Exception("not found 404 error")

return response.json()
except Exception as e:
raise e

Binary file removed webscraper/api/__pycache__/interface.cpython-311.pyc
Binary file not shown.
Binary file removed webscraper/api/__pycache__/routes.cpython-311.pyc
Binary file not shown.
Binary file not shown.
35 changes: 35 additions & 0 deletions webscraper/api/tests/test_ebay_api.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
import unittest
from unittest.mock import patch,Mock
import requests
from webscraper.api.EbayAPI import EbayAPI

class EbayTestApi(unittest.TestCase):

def setUp(self):
self.EbayAPI = EbayAPI


def test_retrieve_access_token(self):
self.EbayAPI.retrieve_access_token()
self.assertEqual(type(self.EbayAPI.retrieve_access_token()),str)

@patch("webscraper.api.EbayAPI.requests.post")
def test_retrieve_access_token_invalid(self,mock_post):
mock_response = Mock()
mock_response.status_code = 404
mock_response.json.return_value ={"error": "not found"}
mock_post.return_value = mock_response

with self.assertRaises(Exception):
self.EbayAPI.retrieve_access_token()



@patch("webscraper.api.EbayAPI.requests.get")
def test_retrieve_ebay_response_invalid(self,mock_get):
self.EbayAPI.retrieve_ebay_response("https://test","item")
self.assertRaises(Exception)


if __name__ == '__main__':
unittest.main()
12 changes: 7 additions & 5 deletions webscraper/src/main.py → webscraper/main.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@

import json
#import time // for testing
# i added htese imports below becasue when i ran it it wasnt finding the folders
Expand All @@ -9,16 +8,19 @@


def main():




# Set up the scraper for a simple legal-to-scrape website
scraper = CheaperScraper("https://books.toscrape.com",
user_agent="CheaperBot/0.1",
delay=2.0)

user_agent="CheaperBot/0.1",
delay=2.0)
# Define which pages you want to scrape (you can use "/" for homepage)
pages = ["/"]

# Use the scraper to fetch and parse the pages
results = scraper.scrape(pages)
results = CheaperScraper.scraper.scrape(pages)

# Show the output in the terminal
for path, items in results.items():
Expand Down
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file removed webscraper/src/__pycache__/__init__.cpython-311.pyc
Binary file not shown.
Binary file not shown.
Binary file removed webscraper/src/__pycache__/robot_check.cpython-39.pyc
Binary file not shown.
Binary file not shown.