@ParnishkaSPB

Почему парсер не может спарсить страницу, которую ему задаю?

import requests
from bs4 import BeautifulSoup
import csv

# URL = 'https://101hotels.com/recreation/russia/sankt-peterburg/points#page=2'(Пробелы стоят нарочно)
FILE = 'Par.csv'



def get_html(url):
    r = requests.get(url)
    return r

def get_content(html):
    soup = BeautifulSoup(html, 'html.parser')
    items = soup.find_all('li', class_='item')

    objects = []
    for item in items:
        try:
            objects.append({
                'title': item.find('div', class_='item-name').text,
                'address': item.find('span', class_='item-address').text,
                'p': item.find('div', class_='item-description').text.replace('\xa0',''),
            })
        except:
            pass
    return objects


def save_file(items, path):
    with open(path, 'w', newline='') as file:
        writer = csv.writer(file, delimiter=';')
        writer.writerow(['Объект', 'Адрес', 'Описание'])
        for item in items:
            writer.writerow([item['title'], item['address'], item['p']])


def parse():
    URL = input('Введите URL: ')
    URL = URL.strip()
    html = get_html(URL)
    try:
        objects = []
        objects.extend(get_content(html.text))
        save_file(objects, FILE)
    except:
        print('Error')




parse()


Захотел сделать парсер интересных мест в СПб, всё, вроде бы, ок, но проблема в том, что страниц там много, и при парсинге он выдал результат только 1 страницы из 14, хотя продолжал парсить. Я подумал, что где-то накосячил, и убрал счётчик страниц и URL ввожу с рук. Но дилемма в том, что, даже если я просто вкину ему URL 2-ой и т.д. страницы, ничего не поменяется, результат - 1 страница. Не могли бы вы помочь мне решить проблему с парсингом оставшихся страниц?
  • Вопрос задан
  • 729 просмотров
Пригласить эксперта
Ответы на вопрос 1
Minute
@Minute
Пародирую программистов
Сайт подгружает информацию JS-ом, который отправляет запрос на сервер. Можно посмотреть, какие запросы выполняются. (Firefox - Ctrl + Shift + E)
И можно заметить, что при переходе на другую страницу выполняется какой-то запрос.
GET - https://101hotels.com/api/facility/search
Query string:
r=0.0000530041150925655330.07492892309472692
params={"city_ids":[13],"category_url":"points"}
page=2

Выполнил запрос без параметра r, и всё работает.
import requests
import json

def gen_params(page, city_ids=[13]):
    return {
        'page': page,
        'params': json.dumps({
            'city_ids': city_ids,
            'category_url': 'points'
        })
    }

data = []
for page in range(1, 6):
    r = requests.get("https://101hotels.com/api/facility/search", params=gen_params(page))
    data.extend(r.json()['response'])

print(json.dumps(data[-1], indent=4, ensure_ascii=False, sort_keys=True))
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы