Как сканировать данные с помощью Python? (1) Веб-скрапинг

Python рептилия Excel HTML

Ваше долгожданное руководство по поиску веб-данных на Python уже здесь. В этой статье показано, как находить интересующие ссылки и описания на веб-страницах, захватывать и сохранять их в Excel.

нужно

Я нахожусь в фоне официального аккаунта и часто могу получать сообщения от читателей.

Многие комментарии представляют собой вопросы читателей. Когда у меня будет время, я постараюсь на него ответить.

Однако есть и непонятные на первый взгляд сообщения.

Например этот:

Через минуту он может почувствовать себя неуместным (видимо, потому что я вспомнил, что писал статью упрощенными китайскими иероглифами), поэтому отправил ее еще раз упрощенным китайским языком.

Меня осенило.

Этот читатель подумал, что в моем официальном аккаунте настроена функция выталкивания статей, соответствующих ключевым словам. Итак, после прочтения других моих руководств по науке о данных, я хотел увидеть тему «сканеры».

Извините, в то время я не писал статьи о поисковых роботах.

Более того, в моем официальном аккаунте на данный момент не установлено такое продвижение ключевых слов.

В основном потому, что я ленивый.

Таких новостей было получено много, и я также могу оценить потребности читателей. Более одного читателя проявили интерес к учебнику по поисковым роботам.

Как упоминалось ранее, текущие основные и легальные методы сбора сетевых данных в основном делятся на три категории:

  • Открытая загрузка набора данных;
  • Чтение API;
  • рептилия.

Первые два способа я уже представил, а на этот раз расскажу о рептилиях.

концепция

У многих читателей возникает некоторая путаница в отношении определения краулера. Нам нужно его проанализировать.

Википедия говорит следующее:

Поисковый робот, также известный как веб-паук, представляет собойВсемирная сетьизвеб-робот. Его цель, как правило, состоит в том, чтобы кодифицироватьвеб-индекс.

Вот в чем вопрос: вы не планируете быть поисковиком, так почему же вы так увлечены поисковыми роботами?

На самом деле то, что многие люди называют поисковым роботом, путают с другой функцией — «скрапингом».

В Википедии последнее объясняется так:

Web scraping, web harvesting, or web data extraction is data scraping used for extracting data from websites. Web scraping software may access the World Wide Web directly using the Hypertext Transfer Protocol, or through a web browser.

Видите ли, нет, даже если вы вручную скопируете данные с помощью своего браузера, это называется парсингом веб-страниц. Вы сразу чувствуете себя намного сильнее?

Однако это определение не является полным:

While web scraping can be done manually by a software user, the term typically refers to automate processes implemented using a bot or web crawler.

То есть с обходчиком (или роботом)автоматическийВыполнение веб-скрейпинга для вас — это то, что вы действительно хотите.

Что вы делаете с данными?

Как правило, он сохраняется первым и помещается в базу данных или электронную таблицу для поиска или дальнейшего анализа.

Итак, функция, которую вы действительно хотите, такова:

Найдите ссылку, получите веб-страницу, получите указанную информацию и сохраните ее.

Не исключено, что этот процесс будет идти вперед и назад, а то и снежным комом.

Вы хотите автоматизировать это.

Зная это, вы можете перестать пялиться на краулера. Краулер был разработан, по сути, для индексации базы данных для поисковой системы. Чтобы захватить какие-то данные и использовать их, вы уже бомбардируете комаров.

Чтобы действительно освоить краулер, вам нужно иметь много базовых знаний. Например, HTML, CSS, Javascript, структуры данных…

Вот почему я не решался написать учебник по поисковым роботам.

Однако за последние два дня я увидел очень поучительный абзац под редакцией Ван Шо:

Мне нравится говорить об альтернативном правиле 28, которое заключается в том, чтобы приложить 20% усилий и понять 80% одной вещи.

Теперь, когда наша цель ясна, нужно собрать данные из Интернета. Тогда вам нужно освоитьсамое важноеСпособность заключается в том, как быстро и эффективно получить нужную информацию после получения веб-ссылки.

Освоив его, нельзя сказать, что научился ползать.

Но с этой основой вы можете получать данные проще, чем когда-либо прежде. Особенно для многих сценариев применения «студентов-гуманитариев» это очень полезно. Этонаделение полномочиями.

Кроме того, становится намного проще понять принцип работы краулеров.

Это также применение «альтернативного правила 28».

Одной из важных особенностей языка Python является наличие мощных программных инструментов (многие из них предоставляются сторонними организациями). Вам нужно только написать простую программу для автоматического анализа веб-страниц и захвата данных.

В этой статье показан процесс.

Цель

Чтобы очистить веб-данные, давайте начнем с небольшой цели.

Цели не могут быть слишком сложными. Но сделайте это, это должно помочь вам понять Web Scraping.

Просто выберите короткую книжную статью, которую я недавно опубликовал в качестве объекта захвата. под названием "Как начать работу с наукой о данных с Юшу Чжиланом?".

В этой статье я реорганизовал и рассказал о серии статей по науке о данных, которые я опубликовал ранее.

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

Предположим, вас интересуют учебные пособия, упомянутые в статье, и вы хотите получить ссылки на эти статьи и сохранить их в Excel, например:

Вам нужно специально извлекать и хранить неструктурированную разрозненную информацию (ссылки в тексте на естественном языке).

Что мы можем сделать по этому поводу?

Даже если вы не умеете программировать, вы можете прочитать весь текст, найти ссылки на статьи одну за другой, вручную скопировать заголовки статей и ссылки и сохранить их на листе Excel.

Однако этот ручной метод сборанеэффективный.

Мы используем Python.

окрестности

Самый простой способ установить Python — это установить пакет Anaconda.

пожалуйста, перейдите кэтот URLЗагрузите последнюю версию Анаконды.

Пожалуйста, выберите Python слева3.6скачать версию и установить.

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

После установки Anaconda перейдите кэтот URLЗагрузите zip-архив, прилагаемый к этому руководству.

После загрузки и разархивирования вы увидите следующие три файла в сгенерированном каталоге (далее «демонстрационный каталог»).

Откройте терминал и используйте команду cd для входа вдемонстрационный каталог. Если вы не знаете, как его использовать, вы также можете обратиться квидеоурок.

Нам нужно установить некоторые зависимости от среды.

Сначала выполните:

pip install pipenv

Здесь установлен отличный инструмент управления пакетами Python pipenv 。

После установки выполнить:

pipenv install

Видите файлы, начинающиеся с двух Pipfiles в демонстрационном каталоге? Это документация по установке для pipenv.

Инструмент pipenv автоматически установит нам все необходимые зависимости согласно им.

На изображении выше есть зеленый индикатор выполнения, показывающий количество устанавливаемого программного обеспечения и фактический прогресс.

После установки следуйте инструкциям для выполнения:

pipenv shell

Пожалуйста, убедитесь, что на вашем компьютере установлен браузер Google Chrome здесь.

Мы выполняем:

jupyter notebook

Откроется браузер по умолчанию (Google Chrome), и запустится интерфейс ноутбука Jupyter:

Вы можете напрямую щелкнуть первый файл ipynb в списке файлов, чтобы увидеть весь пример кода этого руководства.

Вы можете выполнять эти коды один за другим во время просмотра руководства.

но япредположениеМетод заключается в том, чтобы вернуться к основному интерфейсу и создать новую пустую записную книжку Python 3.

Пожалуйста, следуйте инструкциям и введите соответствующий контент посимвольно. Это может помочь вам глубже понять смысл кода и более эффективно усвоить навыки.

Подготовка окончена, приступим к формальному вводу кода.

код

Чтобы прочитать веб-страницу для анализа и сканирования, требуется пакет request_html . Здесь нам не нужна полная функциональность этого пакета, просто прочитайте в нем HTMLSession.

from requests_html import HTMLSession

Затем мы устанавливаем сессию (session), то есть позволяем Python действовать как клиент и общаться с удаленным сервером.

session = HTMLSession()

Как упоминалось ранее, веб-страница, которую мы собираемся собирать, называется "Как начать работу с наукой о данных с Юшу Чжиланом?" статья.

Мы находим его URL-адрес и сохраняем его в имени переменной url.

url = 'https://juejin.cn/post/6844903628847710221'

Следующий оператор использует функцию get сеанса для получения всей веб-страницы, соответствующей этой ссылке.

r = session.get(url)

Что на странице?

Мы указываем Python обрабатывать содержимое, возвращаемое сервером, как тип файла HTML. Я не хочу смотреть на беспорядок дескрипторов формата в HTML, только на текст.

Итак, мы выполняем:

print(r.html.text)

Получился вот такой результат:

У нас это в голове. Полученная информация о веб-странице верна, а содержимое полно.

Что ж, давайте посмотрим, как приблизиться к нашей цели.

мы сначала используемпросто и грубометод, попробуйте получить все ссылки, содержащиеся на странице.

Используя возвращенный контент как тип HTML-документа, мы смотрим на атрибут links:

r.html.links

Вот возвращенный результат:

Столько ссылок!

Взволнованный?

Однако вы заметили? Здесь много ссылок, которые кажутся неполными. Например, первый результат, только:

'/'

Что это? Ссылка сканируется неправильно?

Нет, такие вещи, которые не выглядят как ссылки, называются относительными ссылками. Это ссылка относительно пути к доменному имени (https://www.jianshu.com), где мы собрали веб-страницу.

Это как когда мы отправляем экспресс-посылки в Китае, при заполнении формы мы обычно пишем "XX Город, ХХ Провинция...", и нет необходимости добавлять название страны впереди. Только для международной экспресс-доставки вам нужно написать название страны.

Но что, если мы хотим получить все ссылки, которые доступны напрямую?

Это просто и требует только одного оператора Python.

r.html.absolute_links

Здесь нам нужны «абсолютные» ссылки, поэтому мы получаем следующий результат:

На этот раз он выглядит более удобным?

Наша миссия выполнена? Здесь не все ссылки?

Ссылки действительно здесь, но отличается ли это от нашей цели?

Проверьте это, это так.

Нам нужно найти не только ссылку, но и текст описания, соответствующий ссылке, входит ли он в результат?

нет.

Все ли ссылки в списке результатов нам нужны?

нет. Глядя на длину, мы можем сказать, что многие ссылки не являются URL-адресами, которые описывают другие статьи по науке о данных в тексте.

Этот простой и грубый метод прямого перечисления всех ссылок в файле HTML не работает для этой задачи.

так что нам делать?

Мы должны научиться сообщать Python, что мы ищем. это парсинг в сетиСамое важное.

Подумайте об этом, что, если бы вы хотели, чтобы помощник (человек) сделал это за вас?

Ты скажешь ему:

«Найдите в тексте все кликабельные синие текстовые ссылки, скопируйте текст на лист Excel, затем щелкните правой кнопкой мыши, чтобы скопировать соответствующую ссылку, и скопируйте ее на лист Excel. Каждая ссылка занимает строку в Excel, а текст и каждая ссылка занимает ячейку».

Хотя эта операция хлопотна в выполнении, но после того, как помощник ее поймет, он может помочь вам ее выполнить.

То же самое описание, попробуйте передать его компьютеру... извините, он не понимает.

Потому что веб-страница, которую видите вы и ваш помощник, выглядит так.

Веб-страница, которую видит компьютер, выглядит так.

Чтобы вы могли четко видеть исходный код, браузер также использует цвета для различения различных типов данных и нумерует строки.

Когда данные отображаются на компьютере, вспомогательные визуальные функции, описанные выше, недоступны. Он может видеть только строки символов.

Что мы можем сделать тогда?

Если вы посмотрите внимательно, вы обнаружите, что в этих исходных кодах HTML до и после содержания текстовых и графических ссылок будут некоторые части, заключенные в угловые скобки, которые называются «метками».

HTML — это язык разметки (HyperText Markup Language).

Каково назначение тега? Он может разложить весь документ на слои.

(Источник изображения: https://goo.gl/kWCqS6)

Так же, как вы хотите отправить посылку кому-то, вы можете написать адрес по структуре «область-город-район-улица-населенный пункт-номер дома», и курьер также может найти получателя по этому адресу.

Точно так же нас интересует какой-то конкретный контент на веб-странице, и мы можем узнать его по структуре этих тегов.

Означает ли это, что вам нужно изучить HTML и CSS, прежде чем вы сможете парсить веб-контент?

Нет, мы можем помочь вам значительно упростить сложность ваших задач с помощью инструментов.

Этот инструмент поставляется с браузером Google Chrome.

Мы находимся на странице образца статьи, нажимаем правую кнопку мыши, и в появившемся меню выбираем «Проверить».

В этот момент в нижней части экрана появится столбец.

Нажимаем кнопку в левом верхнем углу этого подстолбца (отмечена красным на изображении выше). Затем наведите указатель мыши на первую ссылку в тексте ("Юшу Чжилань") и нажмите.

На этом этапе вы обнаружите, что содержимое нижнего подстолбца также изменилось. Исходный код, соответствующий этой ссылке, помещается в середину области столбца и выделяется.

Убедившись, что область является искомой ссылкой и текстовым описанием, правой кнопкой мыши выделяем выделенную область, и во всплывающем меню выбираем Копировать -> Копировать селектор.

Найдите текстовый редактор, выполните вставку, и вы увидите, что мы скопировали.

body > div.note > div.post > div.article > div.show-content > div > p:nth-child(4) > a

Эта длинная цепочка меток предназначена для компьютера: пожалуйста, сначала найдите метку тела, войдите в зону, находящуюся под его юрисдикцией, и найдите ее.div.noteОтметьте, затем найдите... Наконец найдите метку, вот то, что вы ищете.

Вернувшись в блокнот Jupyter, определите переменную sel с помощью пути к тегу, который мы только что получили.

sel = 'body > div.note > div.post > div.article > div.show-content > div > p:nth-child(4) > a'

Мы позволяем Python найти позицию, соответствующую sel, из возвращаемого содержимого и сохраняем результат в переменной results.

results = r.html.find(sel)

Посмотрим, что в результатах.

results

Вот результат:

[<Element 'a' href='https://www.jianshu.com/nb/130182' target='_blank'>]

results представляет собой список, содержащий только один элемент. Этот элемент содержит URL-адрес, который является URL-адресом, соответствующим первой ссылке, которую мы ищем («Юшу Жилан»).

Но куда делось текстовое описание «Юшу Жилань»?

Не беспокойтесь, давайте позволим Python отобразить текст, соответствующий данным результатов.

results[0].text

Вот результат:

'玉树芝兰'

Также извлекаем ссылку:

results[0].absolute_links

Отображаемый результат представляет собой коллекцию.

{'https://www.jianshu.com/nb/130182'}

Нам не нужна коллекция, только связанные строки в ней. Итак, сначала мы преобразуем его в список и извлекаем из него первый элемент — URL-ссылку.

list(results[0].absolute_links)[0]

На этот раз мы наконец получили желаемый результат:

'https://www.jianshu.com/nb/130182'

С опытом работы с этим первым звеном ваша уверенность выросла, верно?

Другие ссылки — это не что иное, как поиск отмеченного пути, а затем рисование тигра, похожего на кошку.

Однако, если каждый раз, когда вы находите ссылку, вам нужно вручную вводить приведенные выше предложения, что слишком хлопотно.

Вот хитрости программирования. Повторите операторы, которые выполняются один за другим, и если это сработает, мы попробуем объединить их в простую функцию.

Просто дайте этой функции путь выбора (sel), и она вернет нам весь текст описания и пути ссылок, которые она найдет.

def get_text_link_from_sel(sel):
    mylist = []
    try:
        results = r.html.find(sel)
        for result in results:
            mytext = result.text
            mylink = list(result.absolute_links)[0]
            mylist.append((mytext, mylink))
        return mylist
    except:
        return None

Давайте протестируем эту функцию.

Или используйте тот же отмеченный путь (sel) прямо сейчас, попробуйте.

print(get_text_link_from_sel(sel))

Результат выглядит следующим образом:

[('玉树芝兰', 'https://www.jianshu.com/nb/130182')]

Нет проблем, верно?

Хорошо, давайте попробуем вторую ссылку.

Мы все еще используем метод только сейчас, используя кнопку в верхнем левом углу столбца ниже, чтобы нажать на вторую ссылку.

Выделенный контент, показанный ниже, изменился:

Мы по-прежнему используем правую кнопку мыши, чтобы щелкнуть выделенную часть и скопировать селектор.

Затем мы напрямую записываем полученный путь тега в Jupyter Notebook.

sel = 'body > div.note > div.post > div.article > div.show-content > div > p:nth-child(6) > a'

Какой результат мы получим, используя только что скомпилированную функцию?

print(get_text_link_from_sel(sel))

Результат выглядит следующим образом:

[('如何用Python做词云?', 'https://juejin.cn/post/6844903629304889357')]

После тестирования функция в порядке.

Что дальше?

Вы все еще планируете найти третье звено и сделать это так же, как только что?

Тогда вы можете вручную извлечь информацию из полного текста, что более удобно.

Мы должны найти способ поставить этот процессавтоматизация.

Сравните маркерные пути, которые мы нашли всего дважды:

body > div.note > div.post > div.article > div.show-content > div > p:nth-child(4) > a

так же как:

body > div.note > div.post > div.article > div.show-content > div > p:nth-child(6) > a

Вы нашли какую-нибудь закономерность?

Да, все остальные токены на пути одинаковы, за исключением содержимого после двоеточия после предпоследнего токена ("p").

Это ключ к нашей автоматизации.

В приведенных выше двух отмеченных путях, потому что указанное количество "детей" (nth-child) текстовый сегмент (абзац, который означает «р»), чтобы найти метку «а», поэтому возвращается только один результат.

Что, если мы не ограничим конкретную информацию о местоположении «p»?

Давайте попробуем, на этот раз оставьте всю остальную информацию по отмеченному пути, измените только «p».

sel = 'body > div.note > div.post > div.article > div.show-content > div > p > a'

Снова запустим нашу функцию:

print(get_text_link_from_sel(sel))

Вот результат:

Хорошо, все, что мы ищем, находится здесь.

Однако наша работа не закончена.

Мы также должны экспортировать собранную информацию в Excel и сохранить ее.

Помните наш часто используемый инструмент фреймов данных Pandas? Пришло время позволить ему снова сиять.

import pandas as pd

С помощью всего лишь этой строки команды мы можем прямо сейчас превратить список во фрейм данных:

df = pd.DataFrame(get_text_link_from_sel(sel))

Давайте посмотрим на содержимое фрейма данных:

df

С содержимым все в порядке, но нас не устроили заголовки, и пришлось изменить имена столбцов на более осмысленные:

df.columns = ['text', 'link']

Еще раз взгляните на содержимое фрейма данных:

df

Что ж, теперь вы можете вывести захваченное содержимое в Excel.

Встроенная команда Pandas может преобразовать фрейм данных в формат csv, который можно напрямую открыть и просмотреть в Excel.

df.to_csv('output.csv', encoding='gbk', index=False)

Обратите внимание, что кодировку (кодировку) нужно указывать как gbk, иначе кодировка utf-8 по умолчанию может быть искажена при просмотре в Excel.

Давайте посмотрим на окончательный сгенерированный файл csv.

Очень успешно, не так ли?

резюме

В этой статье показаны основы автоматизации парсинга веб-страниц с помощью Python. Я надеюсь, что после прочтения и практики вы сможете освоить следующие пункты знаний:

  • Связь и различие между веб-скрапингом и веб-сканированием;
  • Как использовать pipenv для быстрой сборки указанной среды разработки Python и автоматической установки зависимых пакетов;
  • Как использовать встроенную функцию проверки Google Chrome, чтобы быстро найти путь маркера интересующего контента;
  • Как использовать пакет request-html для разбора веб-страниц и запросов для получения необходимых элементов контента;
  • Как организовать данные с помощью инструментов фрейма данных Pandas и экспортировать в Excel.

Возможно, вам кажется, что эта статья слишком проста для ваших требований.

В этой статье показано, как собрать информацию только с одной веб-страницы, но вам придется иметь дело с тысячами веб-страниц.

Не волнуйтесь.

По сути, сканирование одной веб-страницы — это тот же процесс, что и сканирование 10 000 веб-страниц.

И, из нашего примера, вы уже пробовали парсить ссылку?

Используя ссылки в качестве основы, вы можете использовать поисковый робот Python как снежный ком, чтобы «просканировать» проанализированные ссылки для дальнейшей обработки.

В будущем вам, возможно, также придется столкнуться с некоторыми трудными вопросами в практических сценариях:

  • Как распространить функцию сканирования на все веб-страницы в определенной области?
  • Как сканировать динамические веб-страницы Javascript?
  • Предположим, что веб-сайт, который вы сканируете, ограничивает частоту доступа для каждого IP-адреса, что вам следует делать?
  • ...

Я надеюсь поделиться с вами решениями этих проблем одно за другим в будущих уроках.

Следует отметить, что хотя поисковые роботы сканируют данные, хотя они и мощные, существуют определенные пороговые значения для обучения и практики.

Когда вы сталкиваетесь с задачей сбора данных, этот контрольный список должен быть проверен в первую очередь:

  • Есть ли набор данных, скомпилированный другими, который можно загрузить напрямую?
  • Предоставляет ли веб-сайт доступ к API и доступ к нужным вам данным?
  • Кто-нибудь скомпилировал специальный поисковый робот, чтобы вы могли звонить напрямую?

Если ответ отрицательный, вам нужно написать собственный сценарий и мобилизовать сканер для сканирования.

Чтобы закрепить полученные знания, перейдите на другую веб-страницу, измените ее на основе нашего кода и получите интересующий вас контент.

Было бы еще лучше, если бы вы могли записывать процесс сканирования и делиться ссылкой на запись со всеми в области комментариев.

потому чтопреднамеренная практикалучший способ приобрести практические навыки, иПреподавание — лучшее обучение.

Удачи!

считать

Объясняется основное содержание этой статьи.

Вот вам вопрос для размышления:

Ссылки, которые мы анализируем и сохраняем, на самом деле являются дубликатами:

Дело не в том, что наш код неверен, дело в том, чтоКак начать работу с наукой о данных с Юшу Чжиланом?"В статье некоторые статьи многократно цитировались, поэтому повторные ссылки выползли.

Но когда вы его сохраняете, вы, вероятно, не хотите хранить повторяющиеся ссылки.

В этом случае, как вы модифицируете код, чтобы гарантировать, что ссылки, которые вы захватываете и сохраняете, не дублируются?

обсуждать

Вас интересует поисковый робот Python? В каких задачах сбора данных он использовался? Есть ли другой более эффективный способ достижения цели сбора данных? Добро пожаловать, чтобы оставить сообщение, поделиться своим опытом и мыслями со всеми, мы обменяемся и обсудим вместе.

Лайк пожалуйста лайк. Вы также можете подписаться на мой публичный аккаунт в WeChat и закрепить его."Юшу Жилан" (nkwangshyi).

Если вы интересуетесь наукой о данных, вы можете прочитать мою серию постов с учебными указателями "Как эффективно начать работу с наукой о данных?", есть более интересные задачи и решения.