Вопрос по парсингу сайтов на Python
Всем привет, помогите с парсингом сайта https://2gis.ru/moscow,я сделал парсер, который работал с одной страницой (или ссылкой), и вроде как удачно парсил. И там на сайте идет постраничная навигация, путем добавление в конце /page/номер страницы . Ну я решил сделать так, чтоб парсило определенное число страниц, которое укажет пользователь. Но у меня не вышло, не могу понять как это сделать, код ниже по моему должен работать, но он не работает и все, либо в циклах проблема, либо запрос session.get не отправляется, не знаю. Помогите пожалуйста.
import requests
from bs4 import BeautifulSoup as BS
from time import sleep
class Client:
def __init__(self):
self.session = requests.Session()
self.session.headers = {'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.89 Safari/537.36'}
def load_page(self):
url_list = []
town = input('Введите название города на английском в нижнем регистре : ')
category = input('Введите название категории : ')
pages = int(input('Введите примерное число страниц :'))
for page in range(1, pages + 1):
url = 'https://2gis.ru/' + town + '/search/' + category + '/page/' + str(page)
url_list.append(url)
print(url_list)
for url in url_list:
res = self.session.get(url=url)
sleep(2)
res.raise_for_status()
text = res.text
self.parse_page(text = text)
def parse_page(self, text):
soup = BS(text, 'lxml')
container = soup.select('div._awwm2v > div > div._y3rccd')
for block in container:
self.parse_block(block=block)
def parse_block(self, block):
name = block.select_one('span._hc69qa').text
name_zav = block.select_one('span._oqoid').text
location = block.select_one('span._tluih8').text
print(name,' - ',name_zav,' - ',location)
if __name__ == '__main__':
parser = Client()
parser.load_page()
Ответы (1 шт):
Думаю, что поскольку страница прогружается скриптами, то requests в данном случае не поможет. Ниже привожу решение с использованием selenium.
Перед запуском скрипта скачайте geckodriver для своей OS. (в скрипте использовался браузер Firefox поэтому
geckodriver. если захотите запилить под Chrome, скрипт нужно будет адаптировать под него и драйвер соответственно нужен будет другой). Поместите распакованныйgeckodriverв папку со скриптом. И не забудьте установить сам Firefox
# pip install selenium (если не установлен)
from bs4 import BeautifulSoup as Soup
from selenium.webdriver import Firefox, FirefoxOptions
opt = FirefoxOptions()
opt.headless = True
site = Firefox(options=opt)
site.implicitly_wait(10)
class Client:
def __init__(self):
pass
def load_page(self):
town = input('Введите название города на английском в нижнем регистре : ')
category = input('Введите название категории : ')
pages = int(input('Введите примерное число страниц :'))
url_list = ['https://2gis.ru/{town}/search/{category}/page/{page}'.format(
page=page,
town=town,
category=category
) for page in range(1, pages + 1)]
print(url_list)
for url in url_list:
site.get(url)
table = site.find_element_by_tag_name('body')
text = table.get_attribute('outerHTML')
self.parse_page(text=text)
def parse_page(self, text):
soup = Soup(text, 'html.parser')
container = soup.find_all('div', class_='_y3rccd')
for block in container:
self.parse_block(block=block)
def parse_block(self, block):
name = block.find('span', class_='_hc69qa').text
name_zav = block.find('span', class_='_oqoid').text
location = block.find('span', class_='_tluih8').text
print(name, ' - ', name_zav, ' - ', location)
if __name__ == '__main__':
parser = Client()
parser.load_page()
site.close()
site.quit()
Не очень понятно зачем Вы создавали класс в данном случае.