Selenium
использовать soup для получения всех атрибутов
from selenium import webdriver
from selenium.webdriver.common.by import By
from bs4 import BeautifulSoup
driver = webdriver.Firefox()
driver.get("https://www.wg-gesucht.de/1-zimmer-wohnungen-in-Muenchen.90.1.1.0.html?csrf_token=e30a4dc9d48c5137b2a74a3fdcd85f91a2536c55&offer_filter=1&city_id=90&sort_column=&sort_order=&noDeact=&dFr=&dTo=&radLat=&radLng=&clear_vu=&autocompinp=M%C3%BCnchen+(Bayern)&country_code=de&city_name=Muenchen&categories[]=1&rent_types[]=0&sMin=&rMax=&pu=&hidden_dFrDe=&hidden_dToDe=&radAdd=&radDis=&wgSea=&wgMnF=&wgMxT=&wgAge=&wgSmo=&rmMin=&rmMax=&fur=&pet=&sin=&exc=&kit=&flo=&pagination=1")
html = driver.page_source
soup = BeautifulSoup(html, 'html.parser')
- Выберите целевые атрибуты и создайте массивы строк для каждого из них.
Создайте def getStrings(soup) для извлечения содержимого из каждого целевого тега.
all_title = []
all_price = []
all_space = []
all_time = []
all_district = []
all_address = []
all_rooms = []
all_link = []
# получить все атрибуты из одной страницы (soup)
def getStrings(soup):
# заголовок
div_title_container = soup.find_all('h3', class_='truncate_title noprint')
for d in div_title_container:
items_title = d.find_all('a')
for t in items_title:
all_title.append(t.contents[0].strip().replace('\n', '').replace(' ', ''))
# цена
div_container = soup.find_all(lambda tag: tag.name == 'div' and tag.get('class') == ['col-xs-3'])
for d in div_container:
items_price = d.find_all('b')
for p in items_price:
all_price.append(p.contents[0].replace(' €', ''))
# площадь
div_space_container = soup.find_all('div', class_='col-xs-3 text-right')
for d in div_space_container:
items_space = d.find_all('b')
for s in items_space:
all_space.append(s.contents[0].replace(' m²', ''))
# время
div_time_container = soup.find_all('div', class_='col-xs-5 text-center')
for d in div_time_container:
all_time.append(d.contents[0].strip().replace('\n', '').replace('ab', '').replace(' ', ''))
# комната, район, адрес
div_district_container = soup.find_all('div', class_='col-xs-11')
for d in div_district_container:
items_district = d.find_all('span')
for di in items_district:
all_rooms.append(di.contents[0].strip().replace('\n', '').replace('ab', '').replace(' ', '').split("|")[0])
all_district.append(di.contents[0].strip().replace('\n', '').replace('ab', '').replace(' ', '').split("|")[1])
all_address.append(di.contents[0].strip().replace('\n', '').replace('ab', '').replace(' ', '').split("|")[2])
# ссылка
div_link_container = soup.find_all('h3', class_='truncate_title noprint')
for l in div_link_container:
items_link = l.find_all('a', href=True)
for a in items_link:
all_link.append(a['href'])
Скрейпим первую страницу, затем вы можете видеть, что каждый массив содержит строки первой страницы.
# атрибуты первой страницы
getStrings(soup)
Используйте цикл for для повторения задачи для количества страниц, которые вы хотите спарсить.
Здесь в цикле for нам нужно дождаться загрузки страницы, иначе он не пройдет успешно через каждую страницу.
Чтобы нажать кнопку, нам нужно использовать execute_script().
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as ec
from selenium.common.exceptions import TimeoutException
from selenium.webdriver.support import expected_conditions as EC
import time
# переход к следующим 5 страницам, нажимая кнопку "следующая"
for i in range(5):
wait = WebDriverWait(driver, 20)
button = driver.find_element(by=By.XPATH, value='//a[@class="page-link next"]')
# драйвер нажимает кнопку "следующая" для перехода на следующую страницу
driver.execute_script("arguments[0].click();", button)
time.sleep(5) # ждем три секунды, чтобы страница загрузилась
html = driver.page_source # теперь у нас есть новые отзывы на странице
soup = BeautifulSoup(html, 'html.parser') # теперь у вас снова есть суп, но с новыми отзывами
getStrings(soup)
- Затем мы можем экспортировать эти массивы атрибутов в csv-файл, используя writer
from csv import writer
# экспорт всех атрибутов в csv-файл
with open('housing.csv', 'w', encoding='utf8', newline='') as f:
thewriter = writer(f)
header = ['Название', 'Район', 'Цена €', 'Площадь м²', 'Комнаты', 'Доступно с', 'URL']
thewriter.writerow(header)
for x in range(len(all_title)):
t = all_title[x]
d = all_district[x]
p = all_price[x]
s = all_space[x]
r = all_rooms[x]
a = all_time[x]
l = "https://www.wg-gesucht.de" + all_link[x]
info = [t, d, p, s, r, a, l]
thewriter.writerow(info)
driver.quit()
После запуска кода вы увидите, что появился csv-файл.
Готово!!!