python пакет для работы с XML Yandex

Автор: Igor Kirsanov

Небольшой python пакет для работы с Xml.yandex.ru - так как задачи у всех разные, то разбор данных не производится, только получаются данные от Яндекса в XML виде.

Предполагается, что работаем только с одной учетной записью, поэтому настройки "зашиты" в файл XmlYandexUrl.py, а получать будем одну страницу на которой 100 результатов - данные исправлять в файле XmlForYandexXml.py

Эти данные нужно подправить на свои.

В файле primer.py показан пример подключения пакета и передаваемых ему запросов.

Листинг содержимого:

primer.py
#!/usr/bin/python
# -*- coding: UTF-8 -*-
'''
Created on 03.11.2011
@author: specialist-seo (программисту.рф)
'''
import GetXmlYandex.result as GetXml
region = '213'
keyword = 'продвижение сайтов'
 
print GetXml.YandexRequest(region, keyword)
XmlYandexUrl.py

#!/usr/bin/python
# -*- coding: UTF-8 -*-
'''
Файл настроек для Яндекс XML 
Функция XmlYandexUrl возвращает итоговую строку для запроса
 
Created on 03.11.2011
@author: specialist-seo (программисту.рф)
'''
 
def XmlYandexUrl():
 
    user = 'username' # имя пользователя
    key = 'userkey' # выданный ключ
    # url адрес для обращения
    url = "http://xmlsearch.yandex.ru/xmlsearch?user=%s&key=%s" % (user, key)
    return url
XmlForYandexXml.py

#!/usr/bin/python
# -*- coding: UTF-8 -*-
'''
Функция XmlForYandexXml(keyword) формирует XML документ для запроса к сервису яндекса, в качестве параметра функции передается ключевое
слово или нужный запрос. 
В большинстве случаев хватает первой страницы из 100 запросов, по этой причине 
groupby.set("groups-on-page","100") # 100 ответов на странице
groupby.set("docs-in-group","0") # поиск на первой странице, начинается с 0
 
Created on 03.11.2011
@author: specialist-seo (программисту.рф)
'''
import xml.etree.ElementTree as ET  #подключаем библиотеку XML
 
def XmlForYandexXml(keyword):
    # создаем документ
    root = ET.Element("request") # рутовый элемент 
    query = ET.SubElement(root, "query") # добавляем дочерний элемент 
    query.text = keyword # добавляем значение элемента
    page = ET.SubElement(root, "page") # добавляем дочерний элемент 
    page.text = "0" # добавляем значение элемента
    groupings = ET.SubElement(root, "groupings") # добавляем дочерний элемент 
    groupby = ET.SubElement(groupings, "groupby") # добавляем дочерний элемент 
    groupby.set("attr","d") # устанавливаем аттрибут
    groupby.set("mode","deep") # устанавливаем аттрибут
    groupby.set("groups-on-page","100") # устанавливаем аттрибут
    groupby.set("docs-in-group","0") # устанавливаем аттрибут
    message = ET.tostring(root, "utf-8") # формируем XML документ
    doc = '' + message # Добавляем строчку кодировки
    return doc
возможно в 19 строке в зависимости от текущей локали нужно будет изменить строку на
query.text = keyword.decode('utf-8') # добавляем значение элемента
result.py
#!/usr/bin/python
# -*- coding: UTF-8 -*-
'''
Функция YandexRequest(region,keyword) подготавливает нужные данные для запроса, производит
запрос данных и возвращает полученный результат.
Обработка данных не производится, т.к. запрос универсален, а данные которые необходимо получить
могут отличаться, например, не только позиции, но и подсвеченные слова. 
 
Created on 03.11.2011
@author: specialist-seo (программисту.рф)
'''
 
import XmlYandexUrl as url #импортируем настройки и даем псевдоним url
import XmlForYandexXml as doc #импортируем формирование xml запроса
import urllib2 # подключаем библиотеку работы с интернет запросами
 
def YandexRequest(region,keyword):
    UrlRequest = "%s&lr=%s" % (url.XmlYandexUrl(), region) #формируем строку url + регион
    XmlDoc = doc.XmlForYandexXml(keyword) # формируем нужный xml документ для запроса
    requestXml = urllib2.Request(UrlRequest, XmlDoc) # подготавливаем данные для запроса
    data = urllib2.urlopen(requestXml) #производим сам запрос к Яндексу
    return data.read() # читаем возвращенные данные
исходники прикреплены ниже, лицензия кода BSD