Stack Overflow на русском Asked by SmokeTamer on August 4, 2020
у меня проблема, я пытаюсь спарсить количество страниц на сайте (EKATALOG), и код вроде бы находит что нужно, но данные берутся совсем другие. Подскажите пожалуйста в чем причина и как это исправить?
Мой код:
import requests
from bs4 import BeautifulSoup
URL = "https://ek.ua/list/189/"
HEADERS = {'User-Agent':"Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Mobile Safari/537.36", "accept":"*/*"}
def get_html(url, page="", params=None):
req = requests.get(url+str(page)+"/", headers=HEADERS, params=params)
return req
def get_pages_amount(html):
soup = BeautifulSoup(html, 'html.parser')
pagination = (soup.find_all('div', class_="page-num"))[-1].find_all('a', class_='ib')
print(pagination)
print(pagination[-1])
if pagination:
return int(pagination[-1].get_text())
else:
return 1
html = get_html(URL)
if html.status_code == 200:
pages_count = get_pages_amount(html.text)
print(pages_count)
print(f"Парсинг страницы 1 из {pages_count}...")
html = get_html(URL)
for page in range(1, pages_count+1):
print(URL+str(page)+"/")
print(f"Парсинг страницы {page+1} из {pages_count}...")
html = get_html(URL,page)
else:
print("ОШИБОЧКА!!!")
Вывод:
[<a class="ib select" href="/list/189/">1</a>, <a class="ib" href="/list/189/1/" id="pager_1">2</a>, <a class="ib" href="/list/189/2/" id="pager_2">3</a>, <a class="ib" href="/list/189/3/" id="pager_3">4</a>, <a class="ib" href="/list/189/4/" id="pager_4">5</a>, <a class="ib" href="/list/189/10/" id="pager_dots">...</a>, <a class="ib" href="/ek-list.php?katalog_=189&page_=45" id="pager_45">46</a>]
<a class="ib" href="/ek-list.php?katalog_=189&page_=45" id="pager_45">46</a>
amount: 46
А вот что по факту есть в html-коде:
По факту страниц больше чем нужно и вообще не понятно откуда bs4 это взяло
Можно с нулевой страницы каталога получать последнее число на ней, пример ниже или, например, считать переходы, пока "> / след. страница" не пропадет.
import requests
from bs4 import BeautifulSoup
headers = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:45.0) Gecko/20100101 Firefox/45.0'}
def get_html(url):
r = requests.get(url, headers=headers)
if r.ok:
return r.text
print(r.status_code)
def main():
pattern = 'https://ek.ua/list/185/'
url = pattern
get_page_data(get_html(url))
def get_page_data(html):
soup = BeautifulSoup(html, "lxml")
pages = str(soup.find_all("div", class_="ib page-num")).split('</a>')
last_page = pages[-2]
index_of_symbol = last_page.rfind('>')
print(last_page[index_of_symbol + 1:])
if __name__ == "__main__":
main()
Correct answer by Drewleks on August 4, 2020
Get help from others!
Recent Questions
Recent Answers
© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP