Здравствуйте. В этой статье я постараюсь подробно рассказать о работе urllib2 с cookie на примере авторизации и добавления сайта в Yandex Webmaster. Писал код при создании автоматизированного seo комплекса.
Ну что ж, приступим.
Первым этапом необходимо перехватить все запросы браузера к серверу. Для этого я пользовался всем известным дополнением firebug для firefox. Можно использовать и другие средства, например, live http headers для того же firefox. Думаю, с этим вопросов не возникнет.
После получения всей необходимой информации, можно приступать к написанию программы.
Первоначально импортируем необходимые модули и подготавливаем urllib2 к работе с cookie:
Ну что ж, приступим.
Первым этапом необходимо перехватить все запросы браузера к серверу. Для этого я пользовался всем известным дополнением firebug для firefox. Можно использовать и другие средства, например, live http headers для того же firefox. Думаю, с этим вопросов не возникнет.
После получения всей необходимой информации, можно приступать к написанию программы.
Первоначально импортируем необходимые модули и подготавливаем urllib2 к работе с cookie:
Copy Source | Copy HTML
- 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"}
Теперь мы можем открывать страницы таким образом:
Copy Source | Copy HTML
- params=urllib.urlencode({ словарь переменных и значений })
- req=urllib2.Request('http://test.com', params, headers) #headers - из предыдущего листинга; представляемся серверу браузером а не роботом
- opener.open(req) #собственно, открываем страницу с параметрами
Теперь проходим авторизацию:
Copy Source | Copy HTML
- 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 все это делает автоматически.
Теперь выложу сразу всю функцию добавления сайта с пояснениями. Думаю, там все понятно.
Copy Source | Copy HTML
- def getUniq(data):
- d=re.compile('(.*?)')
- res=re.findall(d, data)
- return res[ 0]
- """После добавления сайта в панель Вебмастера необходимо пройти процедуру верификации сайта путем создания пустого файла в корне сайта. Функция getUniq() получает имя этого файла.<br/>Наверно, удобнее использовать BeautifulSoup для этой цели, но и решение с regexp имеет место быть."""
-
- def addSite(your_site):
- 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]
- """Довольно некрасиво получилось, но суть вот в чем.<br/> После добавления сайта он получает в Вебмастере уникальный id, который лучше сохранить для выполнения различных действий,<br/> например, верификации сайта и добавления sitemap для ускорения индексации.<br/> Приведенный выше код получает этот id из url."""
-
- 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."""
-
Хочу сразу предупредить, что при большом количестве запросов аккаунт будет забанен, поэтому сильно увлекаться не стоит.
Собственно, это все, о чем я хотел сегодня рассказать. С радостью отвечу на любые ваши вопросы.