http://it-profity.ru/avtorizatsiya-i-dobavlenie-sayta-v-yandex-webmaster-s-pomoshhyu-python-i-urllib2
АВТОРИЗАЦИЯ И ДОБАВЛЕНИЕ САЙТА В YANDEX WEBMASTER С ПОМОЩЬЮ PYTHON И URLLIB2
Здравствуйте. В этой статье я постараюсь подробно рассказать о работе urllib2 с cookie на примере авторизации и добавления сайта в Yandex Webmaster. Писал код при создании автоматизированного seo комплекса.
Ну что ж, приступим.
Первым этапом необходимо перехватить все запросы браузера к серверу. Для этого я пользовался всем известным дополнением firebug для firefox. Можно использовать и другие средства, например, live http headers для того же firefox. Думаю, с этим вопросов не возникнет.
После получения всей необходимой информации, можно приступать к написанию программы.
Первоначально импортируем необходимые модули и подготавливаем urllib2 к работе с cookie:import urllib
import urllib2
import re
import cookielib
cookieJar = cookielib.CookieJar()
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cookieJar))
headers = {"User-Agent":"Mozilla/5.0 (X11; U; Linux i686; ru; rv:1.9.2.6) Gecko/20100628 Ubuntu/10.04 (lucid) Firefox/3.6.6", "Accept":"text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", "Keep-Alive": "115", "Connection":"keep-alive"}
Теперь мы можем открывать страницы таким образом:params=urllib.urlencode({ словарь переменных и значений })
req=urllib2.Request('http://test.com', params, headers) #headers - из предыдущего листинга; представляемся серверу браузером а не роботом
opener.open(req) #собственно, открываем страницу с параметрами
Теперь проходим авторизацию:account=['yandex_login', 'yandex_password'] #ваши логин и пароль от аккаунта Яндекса
params = urllib.urlencode({'login':account[0], 'passwd':account[1], 'twoweeks':'yes', 'retpath':'http://webmaster.yandex.ru'})
req = urllib2.Request('http://pda-passport.yandex.ru/passport?mode=mauth', params, headers)
opener.open(req)
И все! urllib2 предоставляет очень высокоуровневые методы работы с сайтами. Если вы посмотрите всю процедуру авторизации в Яндексе, то увидите, что она состоит из множества шагов, с переадресациями и прочими сложностями. А urllib2 все это делает автоматически.
Теперь выложу сразу всю функцию добавления сайта с пояснениями. Думаю, там все понятно.def getUniq(data):
d=re.compile('(.*?)')
res=re.findall(d, data)
return res[0]
"""После добавления сайта в панель Вебмастера необходимо пройти процедуру верификации сайта путем создания пустого файла в корне сайта. Функция getUniq() получает имя этого файла.
Наверно, удобнее использовать BeautifulSoup для этой цели, но и решение с regexp имеет место быть."""
def addSite(your_site):
try:
params = urllib.urlencode({'hostname': your_site, 'do':'add'})
req = urllib2.Request('http://webmaster.yandex.ru/site/add.xml?'+params, headers=headers)
f=opener.open(req)
data=f.read()
url=f.geturl()
query=urlparse.urlparse(url).query.split('&')
HOST=-1
for i in query:
if 'host=' in i:
HOST=urllib.splitvalue(i)[1]
"""Довольно некрасиво получилось, но суть вот в чем. После добавления сайта он получает в Вебмастере уникальный id, который лучше сохранить для выполнения различных действий, например, верификация сайта и добавление sitemap для ускорения индексации."""
SECRET=getUniq(data) #получаем уникальное имя файла для прохождения верификации
f=open('/var/www/%s/%s'%(your_site, SECRET), 'w')
f.close()
"""Если ваш сайт хранится на локальном сервере, то сразу создаем файл верификации."""
params = urllib.urlencode({'host': HOST, 'do':'verify', 'type': '0'})
req = urllib2.Request('http://webmaster.yandex.ru/site/verification.xml?'+params, headers=headers)
opener.open(req)
opener.open(req)
"""Это не ошибка, необходимо действительно отправлять два одинаковых запроса. Так и в браузере надо делать (нажимать два раза на кнопку) - какой-то глюк Яндекса."""
params = urllib.urlencode({'host': HOST, 'do':'add', 'url': 'http://%s/sitemap.xml'%(your_site)})
req = urllib2.Request('http://webmaster.yandex.ru/site/map.xml?'+params, headers=headers)
opener.open(req)
"""Сабмитим наш sitemap."""
except Exception as err:
print err
Хочу сразу предупредить, что при большом количестве запросов аккаунт будет забанен, поэтому сильно увлекаться не стоит.
Собственно, это все, о чем я хотел сегодня рассказать. С радостью отвечу на любые ваши вопросы.
Похожие записи:
No comments:
Post a Comment