-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathParserPythonAvito.py
More file actions
110 lines (80 loc) · 4.16 KB
/
Copy pathParserPythonAvito.py
File metadata and controls
110 lines (80 loc) · 4.16 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
# - Parsing avito
# - Created Vecnik88
# - 25.01.2017
# Скрипт парсера на авито, собирает все объявления о продаже автомобилей марки VOLVO
# и сохраняет их в файл компьютера
# можно его подстроить под любой запрос на авито, путем изменения url адреса
# также можно добавить различные другие фильтры, парсить со всех страниц и тд
import requests
from bs4 import BeautifulSoup
import csv
# ### Порядок работы ###
# - посчитать количество страниц
# - сформировать адреса сайтов на страницы выдачи
# - собрать данные
def get_html(url): # <---. считывает url, возвращает ввиде текста
r = requests.get(url)
return r.text # <---. возвращает html код заданной страницы
###########################################################################################################
def get_total_pages(html): # <---. определяет количество страниц
soup = BeautifulSoup(html, 'lxml')
pages = soup.find('div', class_='pagination-pages').find_all('a',class_='pagination-page')[-1].get('href')
total_pages = pages.split('=')[1].split('&')[0] # <---. делим наш запрос и в конце получаем номер страницы
return int(total_pages) # <---. возвращает количество страниц по данному запросу
###########################################################################################################
def write_csv(data):
with open('avito.csv','a') as f:
writer = csv.writer(f)
# считываем в файл
writer.writerow((data['title'],
data['price'],
data['metro'],
data['url']))
############################################################################################################
def get_page_data(html):
soup = BeautifulSoup(html, 'lxml')
# получаем список всех item_table
ads = soup.find('div', class_='catalog-list').find_all('div', class_='item_table')
for ad in ads:
# title, price, metro, url
name = ad.find('div', class_='description').find('h3').text.strip().lower()
if 'volvo' in name: # <---. если есть вольво в заголовке, то парсим, иначе продолжаем цикл
try:
title = ad.find('div', class_='description').find('h3').text.strip()
except:
title =''
try:
url = 'https://www.avito.ru' + ad.find('div', class_='description').find('h3').find('a').get('href')
except:
url =''
try:
price = ad.find('div', class_='about').text.strip()
except:
price =''
try:
metro = ad.find('div', class_'date').find_all('p')[-1].text.strip()
except:
metro =''
data = {'title': title,
'price': price,
'metro': metro,
'url': url}
write_csv(data)
else:
continue
###########################################################################################################
def main():
# https://www.avito.ru/moskva/avtomobili?p=1&q=volvo <---. url parsing
url = 'https://www.avito.ru/moskva/avtomobili?p=1&q=volvo'
base_url = 'https://www.avito.ru/moskva/avtomobili?' # <---. неизменная часть запроса
page_part = 'p=' # <---. сюда будем подставлять номер страницы
query_part = '&q=volvo' # <---. отвечает за запрос, запрос у нас постоянен
total_pages = get_total_pages(get_html(url))
for i in range(1,3): # <---. ограничимся двумя страницами, если нужны все - то до total_pages
url_gen = base_url + page_part + str(i) + query_part # <---. создаем наш запрос
# print(url_gen)
html = get_html(url_gen)
get_page_data(html)
###########################################################################################################
if __name__ == '__main__': # <---. вызывает ф-цию main
main()