Yad2 Scraper
February 20, 2025 · View on GitHub
A Python package for scraping listings from Yad2, Israel's leading classifieds platform. This package provides a simple and flexible interface to fetch data, filter results, and extract relevant information.
NOTE: Currently, the package primarily supports the vehicles category. Support for additional categories may be added in future updates.
Features
- Fetch Listings: Retrieve listings by category (e.g., vehicles, real-estate, etc.).
- Filter Results: Apply filters such as price range, year range, and sorting order.
- Dynamic URL Generation: Generate URLs for specific categories and filters.
- Type-Safe API: Uses Python type hints (
Literal,Optional, etc.) for better code clarity and safety. - Extensible: Easily extendable to support additional categories and filters.
Installation
Install the package using pip:
pip install yad2-scraper
Usage
Fetching Category Listings
To fetch any category, use the fetch_category function:
from yad2_scraper import fetch_category, Yad2Category
# Fetch real estate category (returns a generic Yad2Category object)
real_estate_page1 = fetch_category("https://www.yad2.co.il/realestate/forsale", page=1)
...
real_estate_page2 = fetch_category("https://www.yad2.co.il/realestate/forsale", page=2)
...
Fetching Vehicle Listings
To fetch vehicle listings for a specific category, use the fetch_vehicle_category function:
from yad2_scraper import fetch_vehicle_category, OrderVehiclesBy, Field
# Fetch cars category
cars_category = fetch_vehicle_category("cars")
for car_data in cars_category.load_next_data().get_data():
print(car_data.model(Field.ENGLISH_TEXT))
print(car_data.test_date)
print(car_data.price)
...
# Fetch motorcycles category
motorcycle_category = fetch_vehicle_category(
"motorcycles",
price_range=(5000, 15000),
year_range=(2010, 2020),
order_by=OrderVehiclesBy.PRICE_LOWEST_TO_HIGHEST
)
for motorcycle_tag in motorcycle_category.get_tags():
print(motorcycle_tag.page_link)
print(motorcycle_tag.hand)
print(motorcycle_tag.price)
...
The Scraper Object
The Yad2Scraper class is the core of the package.
It handles HTTP requests, parses responses, and provides methods to fetch and filter vehicle listings.
Creating a Scraper Instance
You can create a Yad2Scraper instance manually or use the default scraper provided by the package:
from yad2_scraper import Yad2Scraper, get_default_scraper
# Create a custom scraper instance
scraper = Yad2Scraper()
# Use the default scraper
default_scraper = get_default_scraper()
Fetching Category Listings
The fetch_category method is used to fetch listings for a specific category.
It takes a URL, a Category type, and optionally query params as arguments:
from yad2_scraper import Yad2Scraper, Yad2Category, QueryFilters, OrderBy
from yad2_scraper.vehicles import (
Yad2VehiclesCategory,
VehiclesQueryFilters,
OrderVehiclesBy,
get_vehicle_category_url
)
scraper = Yad2Scraper(request_defaults={"timeout": 5}, max_request_attempts=3)
# Fetch businesses-for-sale category with filters
url = "https://www.yad2.co.il/products/businesses-for-sale"
query_filters = QueryFilters(price_range=(10000, 250000), order_by=OrderBy.PRICE_LOWEST_TO_HIGHEST)
businesses_for_sale_category = scraper.fetch_category(url, Yad2Category, params=query_filters)
# Fetch watercraft category with filters
url = get_vehicle_category_url("watercraft")
query_filters = VehiclesQueryFilters(year_range=(2010, 2020), order_by=OrderVehiclesBy.DATE)
watercraft_category = scraper.fetch_category(url, Yad2VehiclesCategory, params=query_filters)
Features & Functionality
The Yad2Scraper class provides various attributes and methods to customize and extend its functionality.
For detailed usage and examples, refer to the code documentation.
Contributing
Contributions are welcomed! Here’s how you can get started:
- Fork the repository.
- Create a new branch for your feature or bugfix.
- Write tests for your changes.
- Submit a pull request.
License
This project is licensed under the MIT License. See the LICENSE file for details.
Support
For questions, issues, or feature requests, please open an issue on the GitHub repository.