Я строю скребок для Ebay. Я пытаюсь найти способ манипулирования частью номера страницы URL-адреса Ebay до go до следующей страницы, пока не останется больше страниц (если бы вы были на странице 2, часть номера страницы выглядела бы как "_pgn = 2 «). Я заметил, что если вы введете любое число, превышающее максимальное количество страниц в списке, страница будет перезагружена до последней страницы, а не выдаст ошибку, как будто страницы не существует. (Если в листинге 5 страниц, то часть URL-адреса номера последней страницы _pgn = 5 будет перенаправлена на ту же страницу, если часть URL-адреса номера страницы будет _pgn = 100). Как я могу реализовать способ начать с первой страницы, получить суп html страницы, получить все необходимые данные из супа, затем загрузить следующую страницу с новым номером страницы и начать процесс снова, пока нет никаких новых страниц, чтобы выскрести? Я попытался получить количество результатов, которое имеет листинг, используя selenium xpath и math.ceil, являющиеся частным от количества результатов и 50 (число записей по умолчанию для макс. Списков на странице), и использую этот коэффициент в качестве моей max_page, но я получаю сообщения об ошибках: элемент не существует, хотя он и существует. self.driver.findxpath ( 'XPath'). Текст. Это 243 - это то, что я пытаюсь получить с помощью xpath.
class EbayScraper(object):
def __init__(self, item, buying_type):
self.base_url = "https://www.ebay.com/sch/i.html?_nkw="
self.driver = webdriver.Chrome(r"chromedriver.exe")
self.item = item
self.buying_type = buying_type + "=1"
self.url_seperator = "&_sop=12&rt=nc&LH_"
self.url_seperator2 = "&_pgn="
self.page_num = "1"
def getPageUrl(self):
if self.buying_type == "Buy It Now=1":
self.buying_type = "BIN=1"
self.item = self.item.replace(" ", "+")
url = self.base_url + self.item + self.url_seperator + self.buying_type + self.url_seperator2 + self.page_num
response = requests.get(url)
soup = BeautifulSoup(response.text, 'html.parser')
return soup
def getInfo(self, soup):
for listing in soup.find_all("li", {"class": "s-item"}):
raw = listing.find_all("a", {"class": "s-item__link"})
if raw:
raw_price = listing.find_all("span", {"class": "s-item__price"})[0]
raw_title = listing.find_all("h3", {"class": "s-item__title"})[0]
raw_link = listing.find_all("a", {"class": "s-item__link"})[0]
raw_condition = listing.find_all("span", {"class": "SECONDARY_INFO"})[0]
condition = raw_condition.text
price = float(raw_price.text[1:])
title = raw_title.text
link = raw_link['href']
print(title)
print(condition)
print(price)
if self.buying_type != "BIN=1":
raw_time_left = listing.find_all("span", {"class": "s-item__time-left"})[0]
time_left = raw_time_left.text[:-4]
print(time_left)
print(link)
print('\n')
if __name__ == '__main__':
item = input("Item: ")
buying_type = input("Buying Type (e.g, 'Buy It Now' or 'Auction'): ")
instance = EbayScraper(item, buying_type)
page = instance.getPageUrl()
instance.getInfo(page)