1 Востаннє редагувалося navchalkin (26.10.2016 11:35:50)

Тема: парсинг JSON Google Customsearch API

Ось таке завдання: потрібно зробити пошук в гугл програмно на Python.
Так як в пітоні я чайник, потрібна допомога:

Прихований текст
import pprint
import json
from googleapiclient.discovery import build

def main():
  service = build("customsearch", "v1",
            developerKey = "<myDeveloperKey>")
  #json.loads = service.cse().list(
  res = service.cse().list(
      q = '3d.justaction.xyz',
      cx = '017576662512468239146:omuauf_lfve',
      num = 1,
      googlehost = 'www.google.com.ua',
    ).execute()
  #pprint.pprint(json.loads)
  pprint.pprint(res)

if __name__ == '__main__':
    main()

В результаті res, якщо я правильно розумію, є асоціативним масивом.
Сам результат:

Прихований текст
{'context': {'facets': [[{'anchor': 'Lectures',
                          'label': 'lectures',
                          'label_with_op': 'more:lectures'}],
                        [{'anchor': 'Assignments',
                          'label': 'assignments',
                          'label_with_op': 'more:assignments'}],
                        [{'anchor': 'Reference',
                          'label': 'reference',
                          'label_with_op': 'more:reference'}]],
             'title': 'CS Curriculum'},
 'items': [{'cacheId': '81VWSGPSXVUJ',
            'displayLink': 'www.cs.jhu.edu',
            'fileFormat': 'PDF/Adobe Acrobat',
            'formattedUrl': 'www.cs.jhu.edu/.../Advances%20in%20Image- '
                            'Guided%20Surgery%20AAMI.pdf',
            'htmlFormattedUrl': 'www.cs.jhu.edu/.../Advances%20in%20Image- '
                                'Guided%20Surgery%20AAMI.pdf',
            'htmlSnippet': '38 y.o. woman 23 weeks <b>gestation</b> with '
                           'history of breast cancer. A small .... '
                           '<b>3D</b>-<br>\n'
                           'Slicer adapted for prostate procedures and ... MR '
                           'guided biopsy-<b>3D</b> slicer.',
            'htmlTitle': 'Dr. Corrino&#39;s Talk',
            'kind': 'customsearch#result',
            'link': 'http://www.cs.jhu.edu/cista/445/Lectures/Advances%20in%20Image-Guided%20Surgery%20AAMI.pdf',
            'mime': 'application/pdf',
            'pagemap': {'metatags': [{'author': 'Russell Taylor',
                                      'creationdate': "D:20071116170941-05'00'",
                                      'creator': 'PowerPoint',
                                      'moddate': "D:20071116170941-05'00'",
                                      'producer': 'Mac OS X 10.4.10 Quartz '
                                                  'PDFContext',
                                      'title': 'Advances in Image-Guided '
                                               'Surgery AAMI.ppt'}]},
            'snippet': '38 y.o. woman 23 weeks gestation with history of '
                       'breast cancer. A small .... 3D-\n'
                       'Slicer adapted for prostate procedures and ... MR '
                       'guided biopsy-3D slicer.',
            'title': "Dr. Corrino's Talk"}],
 'kind': 'customsearch#search',
 'queries': {'nextPage': [{'count': 1,
                           'cx': '017576662512468239146:omuauf_lfve',
                           'googleHost': 'www.google.com.ua',
                           'inputEncoding': 'utf8',
                           'outputEncoding': 'utf8',
                           'safe': 'off',
                           'searchTerms': '3d.justaction.xyz',
                           'startIndex': 2,
                           'title': 'Google Custom Search - 3d.justaction.xyz',
                           'totalResults': '197000'}],
             'request': [{'count': 1,
                          'cx': '017576662512468239146:omuauf_lfve',
                          'googleHost': 'www.google.com.ua',
                          'inputEncoding': 'utf8',
                          'outputEncoding': 'utf8',
                          'safe': 'off',
                          'searchTerms': '3d.justaction.xyz',
                          'startIndex': 1,
                          'title': 'Google Custom Search - 3d.justaction.xyz',
                          'totalResults': '197000'}]},
 'searchInformation': {'formattedSearchTime': '0.17',
                       'formattedTotalResults': '197,000',
                       'searchTime': 0.166133,
                       'totalResults': '197000'},
 'url': {'template': 'https://www.googleapis.com/customsearch/v1?q={searchTerms}&num={count?}&start={startIndex?}&lr={language?}&safe={safe?}&cx={cx?}&cref={cref?}&sort={sort?}&filter={filter?}&gl={gl?}&cr={cr?}&googlehost={googleHost?}&c2coff={disableCnTwTranslation?}&hq={hq?}&hl={hl?}&siteSearch={siteSearch?}&siteSearchFilter={siteSearchFilter?}&exactTerms={exactTerms?}&excludeTerms={excludeTerms?}&linkSite={linkSite?}&orTerms={orTerms?}&relatedSite={relatedSite?}&dateRestrict={dateRestrict?}&lowRange={lowRange?}&highRange={highRange?}&searchType={searchType}&fileType={fileType?}&rights={rights?}&imgSize={imgSize?}&imgType={imgType?}&imgColorType={imgColorType?}&imgDominantColor={imgDominantColor?}&alt=json',
         'type': 'application/json'}}

Ось, мені потрібно звідси витягнути деякі дані.Наприклад, якщо прописати pprint.pprint(res['items']) - виведе тільки те що знаходиться в items, мені ж потрібно отримати доступ до конкретного рядка, наприклад items.htmlSnippet.
Хтось підкаже як це зробити?

2

Re: парсинг JSON Google Customsearch API

У Вас є результат у форматі JSON, Ви знаєте, що конкретно потрібно витягти. В чому проблема? Якби соромно навіть підказувати таке.

3

Re: парсинг JSON Google Customsearch API

Master_Sergius, ви мене напевне не правильно зрозуміли, максимум що я зміг витягнути з нього - це, як я наводив приклад вижче, блок items, в якому є багато рядків. Мені потрібно конкретно один рядок з усіх цих вибрати. Проблема в тому, що не знаю як це синтаксично записати, і в гуглі на схоже не натрапив.

4

Re: парсинг JSON Google Customsearch API

Отак:

res['items']['htmlSnippet']

Воно?

5

Re: парсинг JSON Google Customsearch API

Master_Sergius написав:

Отак:

res['items']['htmlSnippet']

Воно?

Ні, ось так пробував.
Але проблему вже вирішив

res['items'][0]['htmlSnippet']

Не питайте як я до цього дійшов :D

Подякували: Master_Sergius1

6

Re: парсинг JSON Google Customsearch API

Оу, точно, не побачив там списку. Звернув увагу більше на

наприклад items.htmlSnippet.

Суть в тім, що потрібно просто зрозуміти структуру і далі все стає дуже просто.

Подякували: navchalkin1

7

Re: парсинг JSON Google Customsearch API

а хтось колись мав взагалі справу з Google Customsearch API? Бо в інеті дуже мало інфи, більшість на сайтах гугл, а толком там нічого немає. Мені потрібно після запиту перше посилання отримати і короткий опис. Короткий опис я отримав з рядка htmlSnippet, а от посилання, чомусь мені гугл повертає на якийсь незрозумілий сайт, який відношення до запиту взагалі не має:

'formattedUrl': 'www.cs.jhu.edu/.../Advances%20in%20Image- '
                            'Guided%20Surgery%20AAMI.pdf'

І при різних запитах повертає посилання саме на такі сайти як cs.jhu.edu, cs.cornel.edu, cs.toronto.edu, і в більшості випадків це pdf файли. А інколи при запиті взагалі помилку вибиває і каже "KeyError: 'items'"

8 Востаннє редагувалося navchalkin (29.10.2016 20:05:23)

Re: парсинг JSON Google Customsearch API

Як я зрозумів, або серед присутніх ніхто не бавився з Google Customserch API, або не було бажання пояснити, тому, коротко розпишу як організувати свій пошук в гугл програмно. Писати буду на python. Так от, поїхали.

1. Спочатку потрібно зарареєструвати свій Google пошук, так званий Користувацький пошук - https://cse.google.com.ua/cse/all .
Ось тут і починаються проблеми і обмеження: є вибір, шукати на окремому сайті, або ж, "по всьому інтернету". Звісно, мені потрібен був пошук по всьому інтернету, внизу були налаштування пошуку по всьому інтернету. Самі ж обмеження - шукати можна тільки по сайтах з шаблонами schem.org. Добавити можна всього 10 шаблонів. В реалі їх є дуже багато.
Зареєструваши, берем користувацький id. Він виглядає типу "0182************37171:ysu****7xw8") Зірочки вписую тому, що користуюсь даним кодом.
2. Дальше нам потрібно зареєструвати АРІ-ключ
Рядки в json-об'єкті які повертає гугл. Документація, одним словом)
Виглядає типу "AIzaSyCAoU*************ANe3PYXeLzBdspi50"

3. Більша частина пройдена. Тепер потрібно встановити бібліотеку. Як я зрозумів, бібліотека є тільки для 3 гілки пайтона.
Linux:

$ pip install --upgrade google-api-python-client
or
$ easy_install --upgrade google-api-python-client

Windows:

pip install google-api-python-client

4. А тепер сама програма:

# -*- coding: utf-8 -*-

from googleapiclient.discovery import build
import config


def main(query, numb):
    service = build("customsearch", "v1",
                    developerKey = config.keyGoogleAPI)

    res = service.cse().list(
        q = query,
        cx = config.idGoogle,
        num = numb,
        googlehost = 'www.google.com.ua',
    ).execute()

    return res['items'][0]['formattedUrl']

if __name__ == '__main__':
    main()

Програма повертає посилання на перший пропонований сайт в гугл. Використовую її як модуль в іншій програмі.
Щоб роздрукувати весь json-об'єкт добавляємо модуль pprint і прописуємо замість return:

pprint.pprint(res)

Файл config:

# -*- coding: utf-8 -*-

keyGoogleAPI = 'AIzaSyCAoU*************ANe3PYXeLzBdspi50'
idGoogle = '0182************37171:ysu****7xw8'
Подякували: koala, Master_Sergius2