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
15 changes: 9 additions & 6 deletions webscraper/api/EbayAPI.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
from dotenv import load_dotenv
import os
import logging
from webscraper.api.interface import EbayABC
from webscraper.api.interface import ScraperAPIInterface

# Load environment variables and configure logging
load_dotenv()
Expand All @@ -23,7 +23,7 @@ def __init__(self, name, price, currency, url, date, user_id=None):
self.date = date
self.user_id = user_id

class EbayAPI(EbayABC):
class EbayAPI(ScraperAPIInterface):
client_secret_key = os.getenv("clientsecret")
client_id_key = os.getenv("clientid")
get_user_key = HTTPBasicAuth(client_id_key, client_secret_key)
Expand Down Expand Up @@ -86,18 +86,21 @@ def retrieve_access_token() -> str:
raise

@staticmethod
def retrieve_ebay_response(httprequest: str, query: str) -> dict:
def retrieve_ebay_response(httprequest: str, query: str, category_id: int = 0) -> dict:
"""Perform GET request to eBay API."""
auth = EbayAPI.retrieve_access_token()
logger.info(f"Making GET request to eBay API: {httprequest} with query: {query}")
logger.info(f"Making GET request to eBay API: {httprequest} with query: {query} and category_id: {category_id}")
try:
response = requests.get(
httprequest,
headers={
"Authorization": f"Bearer {auth}",
"Content-Type": "application/json"
},
params={"q": query, "category_tree_id": 0}
params={
"q": query,
"category_ids": category_id if category_id else None # send only if nonzero
}
)
if response.status_code == 429:
logger.warning("Rate limit exceeded.")
Expand All @@ -107,4 +110,4 @@ def retrieve_ebay_response(httprequest: str, query: str) -> dict:
return response.json()
except requests.exceptions.RequestException as e:
logger.exception("Error retrieving eBay response.")
raise Exception(f"Error retrieving eBay response: {str(e)}") from e
raise Exception(f"Error retrieving eBay response: {str(e)}") from e
2 changes: 1 addition & 1 deletion webscraper/api/interface.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
from accounts.models import Product


class EbayABC(ABC):
class ScraperAPIInterface(ABC):

@abstractmethod
def get_scraped_data(self, paths: list[str]) -> Product:
Expand Down
29 changes: 29 additions & 0 deletions webscraper/api/routes.py
Original file line number Diff line number Diff line change
@@ -1,9 +1,38 @@
import sys
import os
sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), '..', '..')))
import django
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'cheaper.settings')
django.setup()

from flask import Flask, jsonify, request
from webscraper.src.Cheaper_Scraper import CheaperScraper
from flask import Blueprint, request, jsonify
from webscraper.api.EbayAPI import EbayAPI

ebay_bp = Blueprint("ebay", __name__, url_prefix="/api/ebay")

@ebay_bp.route("/category", methods=["GET"])
def get_items_by_category():
query = request.args.get("q")
category_id = request.args.get("category_id", default=0, type=int)

if not query:
return jsonify({"error": "Missing required query parameter 'q'"}), 400

try:
results = EbayAPI.retrieve_ebay_response(
"https://api.sandbox.ebay.com/buy/browse/v1/item_summary/search",
query,
category_id
)
return jsonify(results)
except Exception as e:
return jsonify({"error": str(e)}), 500

app = Flask(__name__)
app.register_blueprint(ebay_bp)


app = Flask(__name__)
scraper = CheaperScraper(base_url="https://books.toscrape.com")
Expand Down
9 changes: 9 additions & 0 deletions webscraper/src/Cheaper_Scraper.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,12 @@
from webscraper.src.fetch_utils import cached_get
from functools import lru_cache
from webscraper.api.EbayAPI import EbayItem
import os
import django
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'cheaper.settings') # adjust if needed
django.setup()
from accounts.models import Product




Expand Down Expand Up @@ -108,3 +114,6 @@ def scrape(self, paths: List[str]) -> Dict[str, List[str]]:
def get_scraped_data(self, paths: List[str]) -> Dict[str, List[str]]:
return self.scrape(paths)

def search_item(self, query: str) -> Product:
raise NotImplementedError("search_item not implemented yet")