#! /usr/bin/env python
# -*- coding: utf-8 -*-
import
re
import
time
from
urllib
import
*
class
Http_Request:
def
getURL(
self
,url):
# Загрузка страницы
return
str
(urlopen(url).read())
class
YaBot(Http_Request):
def
get_ya_page(
self
, request, page, region
=
1
):
# Создание поискового запроса
page
=
page
-
1
# страницы Яндекса начинаются с 0
request
+
\
'&p='
+
\
str
(page)
+
\
'&lr='
+
\
str
(region)
# Возвращаем страницу поиска
return
self
.getURL(url)
def
site_place(
self
,
site,
# сайт, который ищем в поиске
request,
# поисковый запрос для анализа
to_page,
# кол-во страниц поиска для анализа
per_page
=
10
,
# кол-во результатов на странице
region
=
1
):
# регион поиска, подробнее тут:
for
page
in
range
(
1
, to_page
+
1
):
# Запрос очередной страницы поиска
data
=
self
.get_ya_page(request, page, region)
# Подготовка регулярных выражений для поиска на
# странице результатов Яндекса
# Номера позиций
position_regex
=
re.
compile
(r
'<b class="b-serp-item__number">([0-9]+)</b>'
)
# Адреса страниц (пока не используется)
search_url_regex
=
re.
compile
(r
'<a class="b-serp-item__title-link" tabindex.+href="([^"]+)'
)
# Адреса сайтов
url_regex
=
re.
compile
(
'<a class="b-serp-item__title-link" tabindex.+href="http[s]?://([^"/]+\.[a-z]{2,4})'
)
# Каптча
captcha_regex
=
re.
compile
(
'<div class="b-captcha">'
)
# Поиск на странице результатов Яндекса
positions
=
position_regex.findall(data)
# search_urls = search_url_regex.findall(data)
urls
=
url_regex.findall(data)
captcha
=
captcha_regex.findall(data)
if
captcha:
return
-
2
for
position
in
positions[:per_page]:
if
urls[
int
(position)
-
((page
-
1
)
*
per_page)
-
1
].upper()
=
=
site.upper():
return
position
time.sleep(
3
)
# Антикаптча
return
-
1
def
main():
ya
=
YaBot()
request
=
'диван'
region
=
1
# Москва
site_position
=
ya.site_place(site, request,
5
, region
=
region)
if
site_position
=
=
-
1
:
print
'Сайт в поиске не найден'
elif
site_position
=
=
-
2
:
print
'CAPTCHA'
else
:
print
'Позиция: '
+
str
(site_position)
if
__name__
=
=
"__main__"
:
main()
No comments:
Post a Comment