1. Введение
Прежде всего, позвольте представиться. Я Java-разработчик. Со второй половины этого года я почти несколько месяцев публикую некоторые из моих собственных технических статей на крупных технологических блогах. До этого я добавил веб-сайт статистика в парк блогов cnblog.Код, вижу, что количество ежедневных посещений постепенно увеличивается, а в Национальный день не так много дел, поэтому я подумал написать краулер, чтобы увидеть, насколько увеличился удельный объем чтения , который является источником этой статьи.
2. Технический отбор
Я лично понимаю, что функция краулера может быть написана на любом языке.При условии, что HTTP-запрос может быть отправлен нормально, необходимые нам данные могут быть извлечены из HTML шаблона статической страницы, возвращенного ответом.Принцип очень простая конечно эта штука Можно и вручную собрать статистику, но ведь сетевых площадок еще очень много.Лучше потянуть время, написать краулер для обхода данных, хранить их в базе, а потом писать оператор SQL для статистического отчета. Я напишу простой пример отчета с разделением интерфейса и сервера, чтобы поделиться им.
Курс краулера Python в интернете сейчас очень популярен.На самом деле у меня немного в душе.Хочу пошалить,и не хочу писать этот краулер со своими старыми навыками.Конечно, Окончательный факт заключается в том, что краулер лучше написать на Python, чем на Java.Рептилии намного проще.
3. Подготовка окружающей среды
Во-первых, у автора компьютер Win10, а Python 3.7.4.Похоже, что в Интернете не так много туториалов по краулеру для Python3, а проблем еще много, о чем мы с вами поделимся ниже.
Инструментом разработки, который я выбираю, является VSCode. Здесь я рекомендую Microsoft, продукт с открытым исходным кодом. Он очень легкий. Вы можете установить любые подключаемые модули, которые вам нужны. Вам не нужны никакие подключаемые модули, которые вам не нужны. автономия очень высока.Если вы не уверены, вы можете выбрать Pycharm, предоставляемый JetBrains, делится на версию сообщества и платную версию.Вообще говоря, мы используем версию сообщества достаточно.
Автор напрямую создал здесь новую папку и создал файл с именемspider-demo.py
Это файл краулера, который мы напишем через некоторое время.Вы можете взглянуть на среду разработки автора следующим образом:
На самом деле это скриншот успешной отладки, как видно из лога, напечатанного ниже, автор перехватил данные с трех платформ.
4. База данных
Данные, используемые автором, представляют собой версию Mysql 5.7.19, а набор символов базы данных — utf8mb4.Что касается того, почему вместо utf8 используется utf8mb4, пожалуйста, Baidu, многие говорят лучше меня, я просто говорю Mysql The utf8 на самом деле является подделкой utf8, а набор символов utf8mb4, добавленный позже, является настоящим utf8.
Python также нуждается в драйвере для подключения к Mysql, точно так же, как для подключения к базе данных в Java требуется драйвер, вот pymysql, команда установки:
pip install pymysql
Ощущается ли это очень просто, pip — это инструмент управления пакетами для Python, в моем личном понимании это что-то похожее на Maven, все необходимые нам сторонние пакеты можно скачать на этом.
Конечно, может бытьtimeout
Ситуация зависит от состояния сети каждого.Когда я выполняю эту команду ночью, это действительно множествоtimeout
, разумеется, у Maven будет отечественная зеркальная война, и у pip, очевидно, тоже, вот вам все перечислено:
- Али Клаудmirrors.aliyun.com/leather/simple…
- Университет науки и технологий Китаяpypi.mirrors.ustc.edu.cn/simple/
- Дубан (дубан)pypi.douban.com/simple/
- Университет Цинхуаpypi.tuna.tsinghua.edu.cn/simple/
- Университет науки и технологий Китаяpypi.mirrors.ustc.edu.cn/simple/
Конкретные команды использования следующие:
pip install -i https://mirrors.aliyun.com/pypi/simple/ 库名
Автор пробовал только зеркальные сайты Alibaba Cloud и Университета Цинхуа, а остальные не пробовал Вышеупомянутый контент взят из Интернета.
Структура таблицы, дизайн следующий, дизайн тут очень грубый, а сделана только одна таблица. Ничего лишнего не скажу. Давайте посмотрим на картинку. За полями есть комментарии:
Заявление о построении таблицы отправляется в репозиторий Github, и учащиеся, которым оно нужно, могут проверить его.
5. Настоящий бой
Общая идея делится на следующие этапы:
- Получить статические ресурсы HTML всей страницы с помощью запроса GET.
- Сопоставьте нужные нам данные с помощью некоторых правил сопоставления
- сохранить в базу данных
5.1 Запрос статических ресурсов HTML
Python3 предоставляет нам стандартную библиотеку urllib, которая не требует от нас дополнительной установки, при ее использовании нам нужно сначала внедрить ее:
from urllib import request
Затем мы отправляем запрос GET, используя urllib, следующим образом:
req_csdn = request.Request('https://blog.csdn.net/meteor_93')
req_csdn.add_header('User-Agent', 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36')
html_csdn = request.urlopen(req_csdn).read().decode('utf-8')
Пользовательский агент называется пользовательским агентом на китайском языке или сокращенно UA.Это специальный строковый заголовок, который позволяет серверу идентифицировать операционную систему и версию, тип процессора, браузер и версию, механизм рендеринга браузера, язык браузера и браузер, используемый клиент, плагины и т.д.
Это добавлено в заголовок запроса здесь, чтобы имитировать обычный запрос браузера. Многие серверы будут выполнять обнаружение, и если обнаружится, что запрос не является обычным браузером, он будет отклонен напрямую. Можете ли вы добавить это? конечно, в заголовке запроса, отправленном реальным браузером, есть не только один UA, но и некоторая другая информация, как показано ниже:
Информация UA автора здесь скопирована прямо отсюда. Здесь написан код, у нас есть статические ресурсы страницыhtml_csdn
, следующим шагом будет анализ этого ресурса и сопоставление необходимой информации.
5.2 сопоставление данных xpath
что такое хпат?
XPath — это язык для поиска информации в XML-документах. XPath можно использовать для обхода элементов и атрибутов в XML-документе. XPath является основным элементом стандарта W3C XSLT, а XQuery и XPointer построены на выражениях XPath.
Из приведенного выше предложения мы видим, что xpath используется для поиска XML, а наш HTML можно рассматривать как XML-документ с нестандартным синтаксисом, и бывает, что мы можем анализировать HTML-документы таким образом.
Прежде чем использовать xpath, нам нужно установить зависимую от xpath библиотеку.Эта библиотека не является стандартной библиотекой, предоставляемой Python.Инструкция по установке выглядит следующим образом:
pip install lxml
Если сеть слабая, учащиеся могут использовать указанную выше зеркальную станцию для установки.
Выражение xpath очень простое.Чтобы узнать о конкретном синтаксисе, вы можете обратиться к руководству, предоставленному W3school (Woohoo. Я 3school.com. can/XPath/XPath…), автор не будет вводить его здесь, конкретное использование выглядит следующим образом:
read_num_csdn = etree.HTML(html_csdn).xpath('//*[@id="asideProfile"]/div[3]/dl[2]/dd/@title')[0]
fans_num_csdn = etree.HTML(html_csdn).xpath('//*[@id="fan"]/text()')[0]
rank_num_csdn = etree.HTML(html_csdn).xpath('//*[@id="asideProfile"]/div[3]/dl[4]/@title')[0]
like_num_csdn = etree.HTML(html_csdn).xpath('//*[@id="asideProfile"]/div[2]/dl[3]/dd/span/text()')[0]
Здесь автор в основном получает общее количество прочтений, общее количество поклонников, рейтинг и общее количество лайков.
Вот несколько самых основных применений, которых достаточно для этого примера:
выражение | описывать |
---|---|
nodename |
Выбирает все дочерние узлы этого узла. |
/ |
Выберите из корневого узла. |
// |
Выбирает узлы в документе из текущего узла, который соответствует выбору, независимо от их положения. |
. |
Выберите текущий узел. |
.. |
Выберите родительский узел текущего узла. |
@ |
Выберите свойства. |
text |
Выберите содержимое текущего узла. |
Также есть простой способ, мы можем получить выражение xpath через браузер Chrome, смотрите скриншот для конкретной операции:
Откройте F12, щелкните правой кнопкой мыши, чтобы сгенерировать содержимое выражения xpath, нажмите «Копировать» -> «Копировать XPath».
Здесь следует отметить, что тип данных, который мы извлекаем непосредственно через xpath, не является базовым типом данных.Если мы хотим выполнять операции или конкатенацию строк, нам необходимо выполнить преобразование типов, иначе будет сообщено об ошибке, как показано ниже. :
req_cnblog = request.Request('https://www.cnblogs.com/babycomeon/default.html?page=2')
req_cnblog.add_header('User-Agent', 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36')
html_cnblog = request.urlopen(req_cnblog).read().decode('utf-8')
max_page_num = etree.HTML(html_cnblog).xpath('//*[@id="homepage_top_pager"]/div/text()')
# 最大页数
max_page_num = re.findall(r"\d+\.?\d*", str(max_page_num))[0]
Здесь нам нужно получить максимальное количество страниц блога cnblog, сначала получите егоmax_page_num
, сделайте это прямо здесьprint
Можно напечатать строку в обычном режиме, но если вы сделаете обычное совпадение напрямую, тип будет неправильным.
5.3 Запись в базу данных
Я не буду знакомить с работой базы данных.Студенты, которые писали Java, должны знать, как пишется jdbc.Сначала используйте ip, порт, имя пользователя, пароль, имя базы данных, набор символов и другую информацию для получения соединения, а затем откройте подключитесь, напишите sql, введите sql, выполните sql, затем отправьте данные, а затем закройте соединение, код выглядит следующим образом:
def connect():
conn = pymysql.connect(host='localhost',
port=3306,
user='root',
password='123456',
database='test',
charset='utf8mb4')
# 获取操作游标
cursor = conn.cursor()
return {"conn": conn, "cursor": cursor}
connection = connect()
conn, cursor = connection['conn'], connection['cursor']
sql_insert = "insert into spider_data(id, plantform, read_num, fans_num, rank_num, like_num, create_date) values (UUID(), %(plantform)s, %(read_num)s, %(fans_num)s, %(rank_num)s, %(like_num)s, now())"
В этом примере сканер отвечает только за одно задание сканирования данных, поэтому требуется только один оператор вставки, а затем после завершения сканирования каждой платформы замените заполнитель в этом предложении sql, выполните SQL и зафиксируйте Просто сделайте это, пример кода выглядит следующим образом:
csdn_data = {
"plantform": 'csdn',
"read_num": read_num_csdn,
"fans_num": fans_num_csdn,
"rank_num": rank_num_csdn,
"like_num": like_num_csdn
}
cursor.execute(sql_insert, csdn_data)
conn.commit()
6. Резюме
После такого практического опыта работы с краулером Python, я действительно чувствую, что синтаксис написания программ на Python очень прост, общая программа использует 130+ строк, грубо прикинув, если та же функция написана на Java, это может занять 200+ строк. для отправки с помощью httpClient.Запрос GET и последующий анализ ответа — это не то, что Python может сделать с помощью простых 2-3 строк кода. Сканер в этом примере на самом деле очень несовершенен. В настоящее время он может сканировать только данные платформ, которые не требуют входа в систему. На некоторых платформах необходимо войти в систему, чтобы увидеть статистические данные. Это необходимо в сочетании с файлами cookie, чтобы завершить процесс имитации авторизоваться. Я продолжу улучшать этот маленький сканер, когда у меня будет время в будущем.
Поисковый робот Python на этот раз больше похож на первопроходца технологии.Большая часть кода получена через поисковые системы, а метод написания немного невежественный.Автор решил систематически изучать Python, а затем я поделюсь некоторыми процессами обучения. , Заинтересованные друзья могут подписаться на автора, чтобы учиться и обсуждать вместе.
По старому правилу код в этой статье также отправляется в репозиторий Github и репозиторий Gitee.Друзья, которым он нужен, могут получить его сами.Репозиторий называется python-learn, что можно рассматривать как своего рода надзор собственное обучение. Пример кода каждого исследования будет отправлен на этот склад.