· 9 years ago · Oct 14, 2016, 03:02 PM
1# -*- coding: utf-8 -*-
2import re, requests, time, argparse
3
4# заголовки Ð´Ð»Ñ Ð¸Ð¼Ð¸Ñ‚Ð°Ñ†Ð¸Ð¸ запроÑа от браузера
5headers = {
6 'Cache-Control': 'max-age=0',
7 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
8 'Accept-Encoding': 'gzip, deflate, sdch',
9 'Accept-Language': 'ru-RU,ru;q=0.8,en-US;q=0.6,en;q=0.4',
10 'User-Agent' : 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.71 Safari/537.36',
11 'Connection': 'keep-alive',
12 'Host': 'yandex.ru',
13 'Content-Type': 'text/html;charset=utf-8',
14}
15
16# Ñоздание парÑера командной Ñтроки
17def create_parser ():
18 parser = argparse.ArgumentParser()
19 parser.add_argument('input_text', nargs='?')
20 parser.add_argument('input_num', nargs='?')
21
22 return parser
23
24# получение данных Ñ Ð¾Ð´Ð½Ð¾Ð¹ Ñтраницы
25def get_page(text,page):
26 url = "https://yandex.ru/search/?text=%s&lr=2&p=%d" % (text,page) # lr - регион(в данном Ñлучае - СПб)
27
28 try :
29 request = requests.get(url, headers=headers , verify=False)
30 except Exception as detail :
31 return 'Возникла ошибка при оÑущеÑтвлении запроÑа: %s' % detail
32
33 request.encoding = 'utf-8'
34
35 html = request.text.encode('utf-8')
36
37 # проверка на код ответа Ñтраницы и блокировку ÑндекÑом
38 if request.status_code != 200 :
39 return request.status_code
40 if re.search('action=\"\/checkcaptcha\"',request.text.encode('utf-8')) :
41 return 'Ð¯Ð½Ð´ÐµÐºÑ Ð¾Ð±Ð½Ð°Ñ€ÑƒÐ¶Ð¸Ð» автоматичеÑкий запроÑ'
42
43 # выделÑем нужные фрагменты
44 match = re.findall(r"<li class=\"serp-item\" data-cid=\"[0-9]+\">(.*?)link organic__url link link_cropped_no\" target=\"_blank\" href=\"(.*?)\"(.*?)</i></span>(.*?)</a>(.*?)text-container organic__text\">(.*?)</div>(.*?)<\/li>", html)
45
46 return match
47
48
49# вывод результатов Ñ Ð¾Ð´Ð½Ð¾Ð¹ Ñтраницы
50def get_results(match,num):
51 i = 0
52 for item in match :
53 if i < num :
54 print re.sub(r'<[a-z\"\/= ]{2,}>', '', item[3]) # выражение
55 print item[1] # url
56 print re.sub(r'<[a-z\"\/=_ ]{1,}>', '', item[5]) # текÑÑ‚
57 print ''
58 i += 1
59 else :
60 break
61
62 return i
63
64
65def move(text,result_num,page=0):
66 match = get_page(text,page) # получаем данные Ñо Ñтраницы
67
68 # проверка типа полученных данных
69 match_type = type(match)
70 if match_type == int :
71 print 'Страница вернула код %d' % match # еÑли получили код ответа не 200
72 elif type(match) == list :
73 # проверка на нулевой результат
74 if (page == 0) and (len(match) == 0) :
75 print 'Результаты не найдены'
76 else :
77 result_num -= get_results(match,result_num) # получаем оÑтаток результатов поÑле обработки текущей Ñтраницы
78
79 # еÑли нужны еще результаты, запрашиваем Ñледующую Ñтраницу
80 if result_num > 0 :
81 time.sleep(1) # на вÑÑкий Ñлучай Ñделал задержку перед запроÑом Ñледующей Ñтраницы, а то ÑÐ½Ð´ÐµÐºÑ Ð½Ðµ оÑобо любит автоматичеÑкие запроÑÑ‹
82 move(text,result_num,page+1)
83 else :
84 return True
85 else :
86 print match
87
88
89if __name__ == '__main__':
90
91 # разбор аргументов коммандной Ñтроки
92 parser = create_parser()
93 namespace = parser.parse_args()
94
95 if namespace.input_text and namespace.input_num :
96 move(namespace.input_text,int(namespace.input_num)) # к примеру, move('мрт позвоночника',12)
97 else :
98 print 'Ðе задан один из параметров'