Скрипт поиска по сайту от Google — настройка и размещение формы и результатов поиска от Гугла
20
Ноя,2021
Скрипт поиска по сайту от Google — настройка и размещение формы и результатов поиска от Гугла
Здравствуйте! Продолжая тему заработка на контекстной рекламе начатую в статье про регистрацию в Google Adsense и вывод заработанных средств на Рапиду, в этой статье я хочу рассказать о подключении скрипта поиска от Google на свой сайт и показа рекламных объявлений в Адсенсе.
Настройка и получения кода скрипта поиска от Google
Если вас не удовлетворяет стандартный поиск в вашей CMS, например поиск Вордпресс или Джумла, то всегда есть альтернатива в виде поиска от Google или Яндекс. В принципе установив и настроив поиск от Гугла на сайте вы получаете профессиональный и проверенный временем инструмент на своем сайте.
Но есть один недостаток поиск будет осуществляться только по тем страницам вашего сайта, которые есть в индексной базе поисковых систем. Поэтому я рекомендую подключить к вашему сайту систему контекстной рекламы Google Adsense, чтобы отображать в результатах поиска и ваши рекламные объявления за клики по которым вы будете получать денежку.
Для того чтобы подключить поиск от Гугла себе на сайт вам надо зайти под своим аккаунтом Google Adsense, о том как его получить можно почитать по ссылке в начале статьи. На главной странице Google Adsense надо выбрать «Мои объявления» и на панели слева кликнуть по ссылке «Поиск».
Далее надо нажать на кнопку «Новая система» и заполнить поля формы.
Вам надо указать по каким сайтам будет вестись поиск либо по всему Интернету или по конкретным сайтам, которые вы выберете. В поле «Ключевые слова» вводите слова, которые релевантны вашему сайту. Это нужно для показа объявлений Google Adsense на вашем сайте.
Затем выбираете кодировку русского языка для вашего сайта, как правило это UTF-8. Для того, чтобы создать клиентский рекламный канал надо нажать на плюсик напротив вкладки «Клиентский канал» и щелкнуть по ссылке «Создать новый канал».
Данный канал позволит вам отслеживать сколько кликов сделали пользователи по вашим объявлениям из Адсенса, которые показываются в результатах поиска. А посмотреть эту статистику можно на странице «Отчеты».
На вкладке «Стиль окна» вы можете настроить внешний вид поля для поиска.
На вкладке «Стиль объявлений» вы можете задать цветовое оформление для объявлений, которые будут показываться на странице с результатами поиска.
Для более расширенных возможностей жмете на ссылку «Больше возможностей расширенного поиска» и настраивает все что вашей душе угодно.
После всех настроек нажимает на кнопку «Сохранить и получить код». На вкладке «Результаты поиска» вы можете выбрать один из 3 вариантов, где будут отображаться результаты поиска.
Если вы выберете первые 2 варианта, то результаты будут отображаться на странице поисковой системы, но наиболее интересен тут 3-й вариант, который позволяет выводить результаты поиска у вас на сайте, но для этого надо создать пустую страницу и ее адрес вставить в поле «URL вывода результатов».
Добавляем скрипт формы и результатов поиска Google на сайт
Для вставки кода скрипта поиска по сайту вам будет предложено 2 варианта:
Лучше использовать 2-й вариант и чтобы добавить его на сайт WordPress можно воспользоваться виджетом «HTML код» и выводить его например в боковой панели. Либо можно изменить шаблон поисковой страницы в теме Вордпресса — это файл searchform.php.
Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.
Поделиться
Твитнуть
Поделиться
(Visited 94 times, 1 visits today)
Скрапинг сайта с помощью Python: гайд для новичков
В этой статье мы разберемся, как создать HTML скрапер на Python, который получает неофициальный доступ к коду сайта и позволяет извлечь необходимые данные.
Отличие от вызовов API
Альтернативный метод получения данных сайта — вызовы API. Взаимодействие с API — это официально предоставляемый владельцем сайта способ получения данных прямо из БД или обычных файлов. Обычно для этого требуется разрешение владельца сайта и специальный токен. Однако апи доступен не всегда, поэтому скрапинг так привлекателен, однако его законность вызывает вопросы.
Юридические соображения
Скрапинг может нарушать копирайт или правила использования сайта, особенно когда он используется для получения прибыли, конкурентного преимущества или причинения ущерба (например из-за слишком частых запросов). Однако скрапинг публично доступен и используется для личного использования, академических целей или безвредного некоммерческого использования.
Если данные являются платными, требуют регистрации, имеют явную защиту от скрапинга, содержат конфиденциальные данные или личные данные пользователей, то нужно избегать любого из видов скрапинга.
Установка Beautiful Soup в Python
Beautiful Soup — это Python библиотека для скрапинга данных сайтов через HTML код.
Установите последнюю версию библиотеки.
$ pip install beautifulsoup4
Чтобы делать запросы, установите requests (библиотеку для отправки HTTP запросов):
$ pip install requests
Импортируйте библиотеки в файле Python или Jupiter notebook:
from bs4 import BeautifulSoup import requests
И несколько стандартных библиотек, которые потребуются для скрапинга на Python:
import re from re import sub from decimal import Decimal import io from datetime import datetime import pandas as pd
Введение
Представьте, что мы хотим произвести скрапинг платформы, содержащей общедоступные объявления о недвижимости. Мы хотим получить цену недвижимости, ее адрес, расстояние, название станции и ближайший до нее тип транспорта для того, чтобы узнать, как цены на недвижимость распределяются в зависимости от доступности общественного транспорта в конкретном городе.
Предположим, что запрос приведет к странице результатов, которая выглядит следующим образом:
Как только мы узнаем, в каких элементах сайта хранятся необходимые данные, нам нужно придумать логику скрапинга, которая позволит нам получить всю нужную информацию из каждого объявления.
Нам предстоит ответить на следующие вопросы:
- Как получить одну точку данных для одного свойства (например данные из тега price в первом объявлении)?
- Как получить все точки данных для одного свойства со всей страницы (например все теги price с одной страницы)?
- Как получить все точки данных для одного свойства всех страниц с результатами (например все теги price со всех страниц с результатами)?
- Как устранить несоответствие, когда данные могут быть разных типов (например, есть некоторые объявления, в которых в поле цены указана цена по запросу.
В конечном итоге у нас будет столбец, состоящий из числовых и строковых значений, что в нашем случае не позволяет провести анализ)?
- Как лучше извлечь сложную информацию (Например, предположим, что каждое объявление содержит информацию об общественном транспорте, например “0,5 мили до станции метро XY”)?
Логика получения одной точки данных
Все примеры кода для скрапинга на Python можно найти в Jupiter Notebook файле на GitHub автора.
Запрос кода сайта
Во-первых, мы используем поисковый запрос, который мы сделали в браузере в скрипте Python:
# поиск в определённой зоне url = 'https://www.website.com/london/page_size=25&q=london&pn=1' # делаем запрос и получаем html html_text = requests.get(url).text # используем парсер lxml soup = BeautifulSoup(html_text, 'lxml')
Переменная soup содержит полный HTML-код страницы с результатами поиска.
Поиск тегов-свойств
Для этого нам потребуется браузер. Некоторые популярные браузеры предлагают удобный способ получения информации о конкретном элементе напрямую. В Google Chrome вы можете выбрать любой элемент сайта и, нажав правой кнопкой, выбрать пункт «Исследовать элемент» . Справа откроется код сайта с выделенным элементом.
HTML классы и атрибут id
HTML-классы и id в основном используются для ссылки на класс в таблице стилей CSS, чтобы данные могли отображаться согласованным образом.
Обратите внимание, что HTML-класс также может ссылаться на ценники за пределами раздела объявлений (например, специальные предложения, которые не связаны с поисковым запросом, но все равно отображаются на странице результатов). Однако для целей этой статьи мы фокусируемся только на ценах в объявлениях о недвижимости.
Вот почему мы сначала ориентируемся на объявление и ищем HTML-класс только в исходном коде для конкретного объявления:
# используем парсер lxml soup = BeautifulSoup(html_text, 'lxml') # находим одно объявление ad = soup.find('div', class_ = 'css-ad-wrapper-123456') # находим цену price = ad.find('p', class_ = 'css-aaabbbccc').text
Использование .text в конце метода find() позволяет нам возвращать только обычный текст, как показано в браузере. Без .text он вернет весь исходный код строки HTML, на которую ссылается класс:
Важное примечание: нам всегда нужно указывать элемент, в данном случае это p.
Логика получения всех точек данных с одной страницы
Чтобы получить ценники для всех объявлений, мы применяем метод find.all() вместо find():
ads = ad.find_all('p', class_ = 'css-ad-wrapper-123456')
Переменная ads теперь содержит HTML-код для каждого объявления на первой странице результатов в виде списка списков. Этот формат хранения очень полезен, так как он позволяет получить доступ к исходному коду для конкретных объявлений по индексу.
Чтобы получить все ценники, мы используем словарь для сбора данных:
map = {} id = 0 # получаем все элементы ads = ad.find_all('p', class_ = 'css-ad-wrapper-123456') for i in range(len(ads)): ad = ads[i] id += 1 map[id] = {} # находим цену price = ad.find('p', class_ = 'css-aaabbbccc').text # находим адрес address = ad.find('p', class_ = 'css-address-123456').text map[id]["address"] = address map[id]["price"] = price
Важное примечание: использование идентификатора позволяет находить объявления в словаре:
Получение точек данных со всех страниц
Обычно результаты поиска либо разбиваются на страницы, либо бесконечно прокручиваются вниз.
Вариант 1. Веб-сайт с пагинацией
URL-адреса, полученные в результате поискового запроса, обычно содержат информацию о текущем номере страницы.
Как видно на рисунке выше, окончание URL-адреса относится к номеру страницы результатов.
Важное примечание: номер страницы в URL-адресе обычно становится видимым со второй страницы.
Применение одного цикла for-loop поверх другого позволяет нам перебирать страницы результатов:
url = 'https://www.website.com/london/page_size=25&q=london&pn=' map = {} id = 0 # максимальное количество страниц max_pages = 15 for p in range(max_pages): cur_url = url + str(p + 1) print("Скрапинг страницы №: %d" % (p + 1)) html_text = requests.get(cur_url).text soup = BeautifulSoup(html_text, 'lxml') ads = soup.find_all('div', class_ = 'css-ad-wrapper-123456') for i in range(len(ads)): ad = ads[i] id += 1 map[id] = {} price = ad.find('p', class_ = 'css-aaabbbccc').text address = ad.find('p', class_ = 'css-address-123456').text map[id]["address"] = address map[id]["price"] = price
Определение последней страницы результатов
Вы можете задаться вопросом, как определить последнюю страницу результатов? В большинстве случаев после достижения последней страницы, любой запрос с большим числом, чем фактическое число последней страницы, приведет нас обратно на первую страницу. Следовательно, использование очень большого числа для ожидания завершения сценария не работает. Через некоторое время он начнет собирать повторяющиеся значения.
Чтобы решить эту проблему, мы будем проверять, есть ли на странице кнопка с такой ссылкой:
url = 'https://www.website.com/london/page_size=25&q=london&pn=' map = {} id = 0 # используем очень большое число max_pages = 9999 for p in range(max_pages): cur_url = url + str(p + 1) print("Скрапинг страницы №: %d" % (p + 1)) html_text = requests.get(cur_url).text soup = BeautifulSoup(html_text, 'lxml') ads = soup.find_all('div', class_ = 'css-ad-wrapper-123456') # ищем ссылку в кнопке page_nav = soup.find_all('a', class_ = 'css-button-123456') if(len(page_nav) == 0): print("Максимальный номер страницы: %d" % (p)) break (...)
Вариант 2. Сайт с бесконечным скроллом
В таком случае HTML скрапер не сработает. Альтернативные методы мы обсудим в конце статьи.
Устранение несогласованности данных
Если нам нужно избавиться от ненужных данных в самом начале скрапинга на Python, мы можем использовать обходной метод:
Функция для определения аномалий
def is_skipped(price): ''' Определение цен, которые не являются ценами (например "Цена по запросу") ''' for i in range(len(price)): if(price[i] != '£' and price[i] != ',' and (not price[i].isdigit())): return True return False
И применить его при сборе данных:
(.\d.]', '', price)) return float(value)
Используем эту функцию:
(...) for i in range(len(ads)): ad = ads[i] id += 1 map[id] = {} price = ad.find('p', class_ = 'css-aaabbbccc').text if(is_dropped(price)): continue map[id]["price"] = to_num(price) (...)
Получение вложенных данных
Информация об общественном транспорте имеет вложенную структуру. Нам потребуются данные о расстоянии, названии станции и типе транспорта.
Отбор информации по правилам
Каждый кусочек данных представлен в виде: число миль, название станции. Используем слово «миль» в качестве разделителя.
map[id]["distance"] = [] map[id]["station"] = [] transport = ad.find_all('div', class_ = 'css-transport-123') for i in range(len(transport)): s = transport[i].text x = s.split(' miles ') map[id]["distance"].append(float(x[0])) map[id]["station"].append(x[1])
Первоначально переменная transport хранит два списка в списке, поскольку есть две строки информации об общественном транспорте (например, “0,3 мили Слоун-сквер”, “0,5 мили Южный Кенсингтон”). Мы перебираем эти списки, используя len транспорта в качестве значений индекса, и разделяем каждую строку на две переменные: расстояние и станцию.
Поиск дополнительных HTML атрибутов для визуальной информации
В коде страницы мы можем найти атрибут testid, который указывает на тип общественного транспорта. Он не отображается в браузере, но отвечает за изображение, которое отображается на странице. Для получения этих данных нам нужно использовать класс css-StyledIcon:
map[id]["distance"] = [] map[id]["station"] = [] map[id]["transport_type"] = [] transport = ad.find_all('div', class_ = 'css-transport-123') type = ad.find_all('span', class_ = 'css-StyledIcon') for i in range(len(transport)): s = transport[i].text x = s.split(' miles ') map[id]["distance"].append(float(x[0])) map[id]["station"].append(x[1]) map[id]["transport_type"].append(type[i]['testid'])
Преобразование в датафрейм и экспорт в CSV
Когда скрапинг выполнен, все извлеченные данные доступны в словаре словарей.
Давайте сначала рассмотрим только одно объявление, чтобы лучше продемонстрировать заключительные шаги трансформации.
Преобразуем словарь в список списков, чтобы избавиться от вложенности
result = [] cur_row = 0 for idx in range(len(map[1]["distance"])): result.append([]) result[cur_row].append(str(map[1]["uuid"])) result[cur_row].append(str(map[1]["price"])) result[cur_row].append(str(map[1]["address"])) result[cur_row].append(str(map[1]["distance"][idx])) result[cur_row].append(str(map[1]["station"][idx])) result[cur_row].append(str(map[1]["transport_type"][idx])) cur_row += 1
Создаём датафрейм
df = pd.DataFrame(result, columns = ["ad_id", "price", "address", "distance", "station", "transport_type"])
Мы можем экспортировать датафрейм в CSV:
filename = 'test.csv' df.to_csv(filename)
Преобразование всех объявлений в датафрейм:
result = [] cur_row = 0 for id in map.keys(): cur_price = map[id]["price"] cur_address = map[id]["address"] for idx in range(len(map[id]["distance"])): result.append([]) result[cur_row].append(int(cur_id)) result[cur_row].append(float(cur_price)) result[cur_row].append(str(cur_address)) result[cur_row].append(float(map[id]["distance"][idx])) result[cur_row].append(str(map[id]["station"][idx])) result[cur_row].append(str(map[id]["transport_type"][idx])) cur_row += 1 # преобразование в датафрейм df = pd.DataFrame(result, columns = ["ad_id", "price","address", "distance", "station", "transport_type"]) # экспорт в csv filename = 'test.csv' df.to_csv(filename)
Мы это сделали! Теперь наш скрапер готов к тестированию.
Ограничения HTML скрапинга и его альтернативы
Этот пример показывает, насколько простым может быть скрапинг HTML на Python в стандартном случае. Для этого не нужно исследовать документацию. Это требует, скорее, творческого мышления, чем опыта веб-разработки.
Однако HTML скраперы имеют недостатки:
- Можно получить доступ только к информации в HTML-коде, которая загружается непосредственно при вызове URL-адреса. Веб-сайты, которые требуют JavaScript и Ajax для загрузки контента, не будут работать.
- HTML-классы или идентификаторы могут изменяться в связи с обновлениями веб-сайта.
- Может быть легко обнаружен, если запросы кажутся аномальными для веб-сайта (например, очень большое количество запросов в течение короткого промежутка времени).
Альтернативы:
- Shell скрипты — загружают всю страницу, с помощью регулярных выражений могут обрабатывать html.
- Screen scraper — изображают реального пользователя, используют браузер (Selenium, PhantomJS).
- ПО для скрапинга — рассчитаны на стандартные случаи, не требуют написания кода (webscraper.io).
- Веб сервисы скраперы — не требуют написания кода, хорошо справляются со скрапингом, платные (zyte.com).
Здесь вы найдёте список инструментов и библиотек для скрапинга.
Источник Turn Website Data Into Data Sets: A Beginner’s Guide to Python Web Scraping
Поиск нелатинским шрифтом | Библиотека Йельского университета
Общие рекомендации по поиску
Поиск по латинизации
Для исследований на языках, использующих нелатинское письмо, таких как арабский, китайский, иврит, японский, корейский и русский, поиск по латинизации обычно является наиболее эффективным и надежный способ найти материалы не на романском языке в Orbis.
Словарь
Используйте авторитетный словарь в качестве справочного материала для транслитерации/латинизации; Каталогисты библиотеки Йельского университета следуют правилам романизации Библиотеки Конгресса. Обратите внимание, что стандарты латинизации менялись с годами, поэтому вам, возможно, придется попробовать варианты, особенно для старых элементов.
Символы
Поиск по местному алфавиту (т. е. по символам) рекомендуется в качестве хорошей отправной точки для пользователей, незнакомых с латинизацией, и может быть более эффективным способом поиска известных названий, чем поиск с латинизацией, особенно для тех, кто более комфортно язык. Нелатинские символы можно искать по ключевым словам, именам авторов и названиям. Однако во всех предметных заголовках используются англоязычные термины. Не все элементы имеют местный шрифт в записи.
Разделение слов
Обратите особое внимание на правила разделения слов; деление слов может быть сложной задачей как для не носителей, так и для носителей каждого языка.
Пример 1: статьи включены в поиск на арабском и иврите; предлоги используют тире в романизации иврита
Пример 2: Составные части на санскрите, пракрите и пали транслитерируются неправильно. Иногда они будут транслитерироваться как одно слово, иногда они будут иметь тире между частями сложного слова, а иногда они будут разбиты на составные части с пробелами между ними.
Альтернативы
Будьте гибкими — попробуйте другую транслитерацию или разделение слов, если результат не возвращается. Начните с малого и расширите поиск до более узких результатов.
Известные проблемы
Варианты написания:
Названия, авторы и т. д. могут иметь различные варианты написания в каталоге, и только конкретное написание приведет к результату поиска. Например, варианты Мао Цзэдуна: 毛澤東 (традиционный китайский) и 毛泽东 (упрощенный китайский), а также 毛沢東 (японский кандзи). Все эти варианты могут использоваться в библиотечной системе, но поиск в одной форме не может найти записи, имеющие другой вариант.
- Решение
- Попробуйте вариант символа, другое написание или другие буквы.
Поиск фраз:
Orbis не может интерпретировать поисковую фразу в основном поиске без кавычек.
- Решение
- Либо используйте кавычки (от английской клавиатуры), либо воспользуйтесь расширенным поиском и выберите «как фразу».
Советы по поиску на определенных языках
Восточноазиатские языки (китайский, японский и корейский) |
Языки иврита (иврит, идиш, ладино, иудео-арабский, арамейский и любой другой язык, использующий еврейский алфавит) |
Ближневосточные языки |
Славянские и восточноевропейские языки |
Контактный специалист по Южной Азии (поддерживаемые языки: хинди, урду, санскрит, пали, пракрит, тамильский, бенгальский, ассамский, арабский, сингальский, гуджарати, телугу и персидский) |
Языки Юго-Восточной Азии Связаться со специалистом по теме |
Другие? Найти специалиста по теме |
‹ История поиска вверх Помощь со специальными коллекциями в Orbis ›
Поиск: Найти текст по всем загруженным ресурсам
Опубликовано
Софья Емельянова
Технический писатель, Google Chrome
Оглавление
- Открыть вкладку Поиск по104 тексту 904 все загруженные ресурсы
- Повторите запрос, разверните и очистите результаты
- Поиск текста в определенном инструменте
Используйте вкладку Поиск для поиска текста по всем загруженным ресурсам.
На вкладке Поиск не отображаются результаты сетевых заголовков и ответов. Чтобы выполнить поиск по ним, выполните действия, описанные в разделе Заголовки и ответы поисковой сети.
В качестве альтернативы можно использовать встроенные панели поиска для поиска текста в ресурсе, открытом в определенном инструменте.
# Откройте вкладку «Поиск»
Вы можете открыть вкладку «Поиск» несколькими способами. Сначала откройте DevTools, затем выполните одно из следующих действий:
- В правом верхнем углу DevTools выберите Настройка и управление DevTools > Дополнительные инструменты > Поиск .
- Нажмите Esc , чтобы открыть ящик , и в левом верхнем углу выберите Дополнительные инструменты > Поиск .
- Нажмите Команда + Опция + F (Mac) или Control + Shift + F (Windows/Linux).
# Поиск текста по всем загруженным ресурсам
Для поиска текста по всем загруженным ресурсам в строке поиска на вкладке Поиск введите запрос и нажмите Введите .
Чтобы сделать запрос чувствительным к регистру, нажмите кнопку Учитывать регистр .
Чтобы найти текст, соответствующий шаблону RegEx, переключите переключатель Кнопка Использовать регулярное выражение .
Вам не нужно заключать запрос RegEx в косую черту.
# Повторно выполнить запрос, развернуть и очистить результаты
Чтобы повторно выполнить поисковый запрос, нажмите Обновить .
To expand all search results, press:
- On Windows / Linux, Ctrl + Shift + { or }
- On MacOS, Command + Option + { or }
Чтобы очистить результаты поиска, нажмите Очистить .
# Поиск текста в определенном инструменте
Чтобы сузить область поиска до ресурса, открытого в определенном инструменте, вы можете использовать встроенную панель поиска, если инструмент ее поддерживает.
На панелях поиска есть кнопки вверх и вниз для перехода к предыдущим и следующим результатам поиска.
Чтобы открыть встроенную панель поиска в определенном инструменте, нажмите Command + F (Mac) или Control + F (Windows/Linux).
Не все панели и вкладки DevTools имеют встроенную панель поиска, но те, которые имеют, часто предоставляют функции, специфичные для инструмента.