Сегодня Я покажу свой парсер. У меня был заказ, создать парсер, который будет собирать ссылки с сайта olx, на товары, авторы которых выкладывали только один товар на сайт.
Для этого мне потребуется библиотека request и bs4
Импортируем нужные модули
import os
import time
import requests
from bs4 import BeautifulSoup
Далее Мы создадим переменные которые будут хранить в себе ссылку на сайт, какую страницу мы будем обрабатывать и категорию товаров + создадим список в котором будут храниться ссылки в будущем.
url = "https://www.olx.ro/"
electronice = "electronice-si-electrocasnice/"
page = "?page="
number = 1
url_list = []
Создаем цикл, который будет перебирать страницы и собирать блоки которые хранят ссылку на товар. Всего 25 страниц у сайта olx, по этому Мы указываем это в цикле. Мы отправляем запрос на сайт, затем читаем ответ как html страницу и ищем нужный нам класс. В данном классе должны храниться блоки с нужными нам ссылками.
while number != 24:
response = requests.get(url + electronice + page + str(number))
soup = BeautifulSoup(response.text, 'lxml')
quotes = soup.find_all(class_='fixed offers breakword redesigned')
olx_url = quotes[0].find_all('a', class_='marginright5 link linkWithHash detailsLink')
url_list_page = 1
Далее мы перебираем каждый блок и берем ссылку, при переборе блоков , бывают попадаются рекламные блоки из-за которых программа сдает сбой, по этому мне пришлось использовать try:
while url_list_page != 30:
try:
response2 = requests.get(olx_url[url_list_page]['href'])
soup2 = BeautifulSoup(response2.text, 'lxml')
quotes2 = soup2.find_all('div', class_='offerfooter')
olx_url2 = quotes2[0].find_all(class_='gallerywide clr normal')
except Exception as e:
url_list_page += 1
response2 = requests.get(olx_url[url_list_page]['href'])
soup2 = BeautifulSoup(response2.text, 'lxml')
quotes2 = soup2.find_all('div', class_='offerfooter')
olx_url2 = quotes2[0].find_all(class_='gallerywide clr normal')
После того как Мы собрали все ссылки на товары, нам нужно как то разделить авторов на тех кто уже публиковал вещи на продажу и тех у кого это была первая его публикация. Как нам это сделать? Все просто, на странице с товаром внизу есть блок в котором показывается публикации от человека, в случае если он опубликовал на продажу только одну какую-то вещь, то данный блок будет пустой и спрятан от глаз посетителя. но в html странице он присутствует, просто он пустой.
if olx_url2 == []:
url_list.append(olx_url[url_list_page]['href'])
elif olx_url2 != []:
pass
os.system('cls')
print(f'Страница {number} из 25')
print(f'Блок {url_list_page} из 39')
url_list_page += 1
number += 1
После чего Мы все записываем в файл url_list.txt
with open('url_list.txt', 'w') as file:
for line in url_list:
file.write(line + '\n')
exit()
Ссылка на весь код, с подробными коментариями: КЛИК