PAGENATION. Пагинация python
Здраствуйте. Делаю парсинг страницы (ajax). Нужно листать страницы. Для перехода след страницу нужно делать шаг +str(count)+, где count=10 в URL.
from datetime import datetime
import requests
from bs4 import BeautifulSoup
user_agent = ''
URL = 'https://example.com/page='+str(count)+'&start=10' # URL для парсинга
nonce = str(round(datetime.now().timestamp())) # Бесполезная строка
headers = {
"user-agent": user_agent,
"accept": '*/*'
}
def save_data():
with open('parse_info.txt', 'a') as file:
file.write(f'{title}\n')
def get_html(URL, params=None):
r = requests.get(URL, headers=headers, params=params)
return r
def get_content(html): # Получаем контент
for i in range(1, 5): # На месте 5 будет предположительное количество страниц указ. пользователем
soup = BeautifulSoup(html, "html.parser")
items = soup.find_all('a', class_='market_listing_row_link')
weapons = []
for item in items: # Ищем нужные элементы
weapons.append({
'title': item.find('span', class_='market_listing_item_name').get_text(strip=True),
'price': item.find('span', class_='sale_price').get_text(strip=True).replace('$', '').replace('USD', '').replace(' ', ''),
})
print(weapons)
global weapon
global original_price
global title
for weapon in weapons: # Получаем нужные ключи. И записываем в ТХТ
title = weapon['title']
price = weapon['price']
original_price = float(price)
if 0.2 < original_price < 15:
print(f'{title} -> {original_price}')
save_data()
#print(weapon['title'])
def parse():
html = get_html()
if html.status_code == 200:
get_content(html.text)
else:
print("error")
parse()
Вопрос:
Как реализовать пaгинацию через URL с шагом count+=10 каждый раз после цикла for и повторный парсинг?
Ответы (1 шт):
Автор решения: Georgiy
→ Ссылка
В методе range можно указать шаг итерации, нужно указать начало, конец и шаг:
for i in range(0, 11, 5):
print(i)
...
0
5
10
А на практике примерно будет так выглядеть парсер:
def get_html(page_count):
url = 'https://example.com/page=' + str(page_count) + '&count=10'
r = requests.get(url, headers=headers)
return r
def parse():
page_start, page_end = 0, 100
for i in range(page_start, page_end, 10):
html = get_html(i)
if html.status_code == 200:
get_content(html.text)
#...
Или можно обернуть функцию получения страниц в генератор и по нему итерировать, сэкономив немного строк кода:
def get_html(page_start, page_end, step=10):
for page in range(page_start, page_end, step):
url = 'https://example.com/page=' + str(page) + '&count=10'
yield requests.get(url, headers=headers)
def parse():
page_start,page_end = 0, 100
for html in get_html(page_start, page_end):
if html.status_code == 200:
get_content(html.text)
#...