Парсим Google поиск при помощи Python

С тех пор как Google прикрыл свой Google Web Search Api в 2011, было очень сложно найти альтернативу. Нам нужно было получать ссылки из Google поиска с помощью скрипта на Python. Итак, мы сделали свой, и покажем небольшой гайд о том, как парсить Google поиск при помощи библиотеки requests и Beautiful Soup.

Для начала, давайте установим зависимости. Сохраним следующую информацию в файле requiriments.txt

requests
bs4

Теперь, в командной строке, запустим pip install -r requiriments.txt для того, чтобы эти зависимости установить. Затем импортируем эти модули в скрипт:

import urllib
import requests
from bs4 import BeautifulSoup

Для выполнения поиска, Google ожидает, что запрос будет в параметрах URL. Кроме того, все пробелы должны быть заменены на знак ‘+’. Чтобы построить URL, мы правильно отформатируем запрос и поместим его в параметр q.

query = "hackernoon How To Scrape Google With Python"
query = query.replace(' ', '+')
URL = f"https://google.com/search?q={query}"

Google возвращает разные результаты поиска для мобильных и настольных компьютеров. Таким образом, в зависимости от варианта использования, мы должны указать соответствующий user-agent.

# desktop user-agent
USER_AGENT = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.14; rv:65.0) Gecko/20100101 Firefox/65.0"
# mobile user-agent
MOBILE_USER_AGENT = "Mozilla/5.0 (Linux; Android 7.0; SM-G930V Build/NRD90M) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.125 Mobile Safari/537.36"

Сделать запрос легко. Однако requests ожидает, что user-agent будет в заголовках. Чтобы правильно установить заголовки, мы должны передать словарь для них.

headers = {"user-agent" : MOBILE_USER_AGENT}
resp = requests.get(URL, headers=headers)

Теперь нам нужно проверить, проходит ли наш запрос. Самый простой способ — проверить статус-код. Если он возвращает значение 200, это значит, что запрос прошел успешно. Затем нам нужно поместить ответ на наш запрос в Beautiful Soup для разбора содержимого.

if resp.status_code == 200:
    soup = BeautifulSoup(resp.content, "html.parser")

Далее идет анализ данных и извлечение всех якорных ссылок со страницы. Это легко делается при помощи библиотеки Beautiful Soup. Поскольку мы итерируемся через якоря, нам нужно сохранить результаты в списке.

results = []
for g in soup.find_all('div', class_='r'):
    anchors = g.find_all('a')
    if anchors:
        link = anchors[0]['href']
        title = g.find('h3').text
        item = {
            "title": title,
            "link": link
        }
        results.append(item)
print(results)

Вот и все. Этот скрипт довольно прост и подвержен всякого рода ошибкам. Но вы ведь должны с чего-либо начать. Вы можете клонировать или скачать весь скрипт из git-репозитория.

Есть также некоторые предостережения, которые стоит учитывать при парсинге Google. Если вы выполняете слишком много запросов в течение короткого периода времени, Google начнет выдавать вам капчи. Это раздражает и будет ограничивать, вас в скорости и количестве запросов.

Вот почему был создан RapidAPI Google Search API, который позволяет выполнять неограниченный поиск, не беспокоясь о капчах.