-
Notifications
You must be signed in to change notification settings - Fork 23
Expand file tree
/
Copy pathavito_parser_cli.py
More file actions
106 lines (96 loc) · 5.46 KB
/
avito_parser_cli.py
File metadata and controls
106 lines (96 loc) · 5.46 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
import argparse
from datetime import datetime
from csv import DictWriter
from avito_parser import get_all_ads
import os
import time
def to_date(string):
try:
if ':' in string:
return datetime.strptime(string, '%Y-%m-%d %H:%M')
return datetime.strptime(string, '%Y-%m-%d')
except ValueError:
raise argparse.ArgumentTypeError("Not a valid date: '{0}'.".format(string))
def print_ad_info(ad, number):
print('{}. {}'.format(number, ad['Title']))
print('Ссылка:', ad['Link'])
print('Цена:', ad['Price'] if ad['Price'] else 'Не указана')
print('Дата:', ad['Date'])
def get_query_list_from_file(filename):
with open(filename, 'r') as qfile:
return list(map(str.strip, qfile.readlines()))
def parse_args():
parser = argparse.ArgumentParser()
parser.add_argument('-u', '--output', type=str, default='output.csv',
help='Название cvs файла для вывода (например output.csv)')
parser.add_argument('-s', '--sortby', type=str, choices=['date', 'price', 'price_desc'],
default=None,
help='''date -- сортировка по дате;
price -- сортировка по цене;
price_desc -- сортировка по убыванию цены''')
parser.add_argument('-t', '--bytitle', default=False, action='store_true',
help='Поиск только в названиях объявлений')
parser.add_argument('-f', '--withimages', default=False, action='store_true',
help='Только объявления с картинками')
parser.add_argument('-w', '--owner', type=str, choices=['private', 'company'],
default=None,
help='''private -- только частные объявления;
company –- только объявления принадлежащие компаниям''')
parser.add_argument('-m', '--minprice', type=int, default=None, help='Минимальная цена')
parser.add_argument('-M', '--maxprice', type=int, default=None, help='Максимальная цена')
parser.add_argument('-d', '--startdate', type=to_date,
default=None,
help='''Только объявления новее этой даты;
Формат – 2019-01-10 или 2019-01-10 15:29''')
parser.add_argument('-e', '--enddate', type=to_date,
help='''Только объявления созданные до этой даты;
Формат – 2019-01-10 или 2019-01-10 15:29''')
parser.add_argument('-a', '--statistics', default=False, action='store_true',
help='Выводить топ 5 объявлений и общее количество')
parser.add_argument('-p', '--pause', type=float, default=2.0,
help='Задержка между запросами в секундах для защиты от бана, '
'по-умолчанию 2 секунды')
query_group = parser.add_mutually_exclusive_group(required=True)
query_group.add_argument('query', type=str, nargs='?', help='Поисковый запрос')
query_group.add_argument('-q', '--qfile', type=str,
help='Название файла с поисковыми запросами, '
'по одному запросу на строку')
return parser.parse_args()
if __name__ == '__main__':
args = parse_args()
num_of_printed_ads = 5
fieldnames = ['Title', 'Link', 'Price', 'Date']
ad_num = 0
with open(args.output, "w", newline='') as out_file:
print(os.path.abspath(args.output))
writer = DictWriter(out_file, delimiter=',', fieldnames=fieldnames)
writer.writeheader()
if args.query:
query_list = [args.query]
else:
query_list = get_query_list_from_file(args.qfile)
for query in query_list:
if args.pause is not None:
time.sleep(args.pause)
print('Поиск по запросу "{}" ...'.format(query))
for ad in get_all_ads(query, sort_by=args.sortby, by_title=args.bytitle,
with_images=args.withimages, owner=args.owner,
pause=args.pause):
if (args.minprice and not ad['Price']) or (args.minprice and \
ad['Price'] and ad['Price'] < args.minprice):
continue
if (args.maxprice and not ad['Price']) or (args.maxprice and \
ad['Price'] and ad['Price'] > args.maxprice):
continue
if args.startdate and to_date(ad['Date']) < args.startdate:
continue
if args.enddate and to_date(ad['Date']) > args.enddate:
continue
ad_num += 1
if args.statistics and ad_num <= num_of_printed_ads:
print_ad_info(ad, ad_num)
writer.writerow(ad)
if ad_num == 0:
print('Ни одно объявление не найдено')
elif args.statistics:
print('Всего объявлений:', ad_num)