Учебные заметки «Сканер Python от входа в тюрьму» | Тематический месяц Python

задняя часть Python рептилия
Учебные заметки «Сканер Python от входа в тюрьму» | Тематический месяц Python

Эта статья участвует в "Месяце тем Python", подробнее см.Ссылка на мероприятие

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

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


0x1, говорить красноречиво

1. «Мечта за одним занавесом» с Python

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

Помимо того, что этого достаточно, причина, по которой автор не стал углубляться в Python:

  • поесть→ Отсутствует поддержка со стороны среды, в результате чего нет большого опыта работы над проектами на Python, а смену работы приходится начинать с нуля. еще можно есть и пить;
  • Ограниченное время и энергия→ Как только вы решите изучить определенную часть знаний, вы заплатите альтернативную цену за то, что временно не сможете изучить другие знания. Поскольку следующей работой по-прежнему остается Android, приоритетом должна быть консолидация Android, а Python — это плюс, но не так много.

Случайно в прошлом году я опубликовал физическую книгу для начала работы с поисковыми роботами Python. Мне посчастливилось быть выбранным в качестве учебника «Хе-хе» Исследовательским институтом больших данных Университета Цинхуа. Я слышал, что это было рекомендовано университетам, которые они сотрудничал с. Интересно, есть ли должность в альма-матер с моим дипломом. Перечислите их? Ха-ха!

(совпадает с Месяцем тем Ptython + 100-летием My Party,отправить дваОтпразднуйте, помашите волной в комментариях~)

После этого у меня не было никаких успехов в изучении Python.После выхода книги я получал один за другим отзывы от читателей и преподавателей, что заставило меня осознать две проблемы с физическими книгами:

  • 时效性: ИТ-обновления меняются с каждым днем, содержание и примеры быстро меняются, обновление можно только переиздавать, а время обработки слишком велико;
  • 趣味性: Много ограничений на написание, нельзя просторечие + смайлики, не так интересно, как статьи в моем блоге;

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

(Я скучаю по дням, когда я практиковался в Южном парке программного обеспечения до одиннадцати или двенадцати часов вечера. Это хороший день, чтобы быть беззаботным~)

Мне очень повезло встретить Python, выучить Python и влюбиться в Python, когда я ловил рыбу в своем старом клубе.Простой и удобный синтаксис,Элегантный и мощный код,Библиотека классов богата, и сообщество активно, Любой, кто это увидит, не может не волноваться!人生苦短,我用Python, это моя мечта с Python.


2. «В полном разгаре» занятие Python

Первоначально Python был языком разработки, но в последние годы он внезапно стал популярным, и появилась реклама для изучения Python, охватившая круг друзей, Qiafan и Douyin. Навязчивая реклама, пустьPythonЭто слово вошло в поле зрения широкой публики и, похоже, вызвало волну全民学Python的浪潮, по факту一场割韭菜的狂欢.

Как резать? И послушайте, как я говорю:

吸引用户注意

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

  • 3 года работы - это не так хорошо, как стажер...
  • Во время эпидемии, увидев зарплату коллег, я вышел из группового чата
  • Группа людей, которые сказали, что уйдут в отставку через 1000 лет, теперь боятся переезжать
  • В те дни, когда я сидел дома, меня жестоко бросали сверстники.
  • Популярная Ли Цзыци, чем больше я об этом думаю, тем больше боюсь...
  • Меня повысили в компании два месяца подряд, и это не из-за того, что я красивая...
  • На рабочем месте, в чем недостаток незнания Python?

花式戳痛点引需求

Укажите реальные болевые точки, с которыми сталкиваются целевые пользователи, и почувствуйте:

  • Начальник слишком строгий, специализирующийся на придирках к сотрудникам
  • Меньше денег, больше вещей, держась за фронт продажи капусты, думая о продаже белого Х
  • Интриги среди коллег, напряжённая работа более полугода не так хороша, как новое доверие
  • Мало места для развития, повторяющиеся действия каждый день, неэффективная сверхурочная работа...
  • На рабочем месте нет конкуренции, физическая сила не может соперничать со студентами колледжа, ресурсы не могут соперничать со старыми коллегами.
  • Вы должны изучить Python втихаря и удивить всех!
  • Поиск работы помогает, а зарплата увеличивается после изучения Python...

扩大目标人群

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

  • Вы подумаете: разве изучение программирования не делает вас программистом? На самом деле, в наше время это не так.
  • В качестве обязательного навыка на рабочем месте большинство отраслей уже указаны в идентификаторе найма, и они дали условия найма, такие как XXX.
  • От 13 до 68 лет все изучают Python
  • Изучение Python может помочь финансистам XXX, специалистам по электронной коммерции XXX и представителям сообщества XXX

呈现产品差异化

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

  • Нулевой фундамент, ситуативное обучение, онлайн-практика;
  • Новичок в программировании от «не знаю» к «знаю»
  • Вы можете закончить урок во время просмотра короткого видео;
  • Три дня, чтобы запустить Python, одна строка кода, чтобы открыть режим Бога!
  • Помощники преподавателя руководят всем процессом, словно играя в игру.

强化产品功效

Создайте мечту для пользователей, подчеркните преимущества, что будет после обучения, почувствуйте:

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

价格拆解+福利,促成转化

На пороге дайте пользователям повод купить немедленно и используйте чувство срочности для повышения конверсии, например, подчеркните, что цена является специальной ценой, только первые 100, всего 8,9 юаня (некоторые курсы теперь прямо 0 юаней, что показывает, насколько жесткой является конкуренция за нарезку лука-порея).

Первые шесть шагов на самом деле только начало рутины, а более глубокие рутины еще впереди~

强化用户学习动机

После присоединения к группе я покажу вам, как эффективно изучать Python в целом (xi) и в целом (nao), постоянно стимулировать ваши потребности и интересы и повышать вашу мотивацию к обучению.

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

让用户感觉能轻松做到

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

  • Вам даже не нужно загружать программное обеспечение, вы можете принять участие в исследовании, открыв веб-страницу.Курс представляет собой текстовое интерактивное (чат) исследование, которое очень удобно для 0 основных студентов;
  • Напишите код для вас, вам просто нужно нажатьбегатьРезультат операции может быть получен;
  • Упражнения после занятий — это тоже просто копирование и вставка, изменение и изменение, и все.

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

  • Классный руководитель попросит учащихся отправить результаты кода группе после изучения уровня, и учащиеся, отправившие его, могут получить вознаграждение в виде пакета материалов курса;
  • При совместном использовании ссылки также будет показано, что каждый человек запустил в общей сложности несколько строк кода, что делает людей неспособными устоять перед сравнениями;
  • Это скорее стимул для тех, кто не выполнил задание дня;

Отправляйте купоны, чтобы вызвать конверсию пользователей

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

  • Обычная цена составляет 999, и группа покупает два курса.Общая скидка составляет 500 юаней.Кроме того, можно добавить купоны 200.В конце концов, для упоминания двух курсов можно использовать только 1298, но количество купонов ограничено, только 50. , в порядке живой очереди;
  • Учитывая, что многие студенты немного студенческие вечеринки, они также предложили поддержать Huabei и рассрочку по кредитной карте;
  • После регистрации студенты могут получить небольшие подарки, такие как зонтики и холщовые сумки.Во имя статистических подарков студенты могут собирать заказы в группе и создавать атмосферу горячих продаж.
  • Приватный чат со студентами, которые не выступали в группе, сказали, что купонов может не хватить, и отдадут приоритет ученикам, которые уже закончили класс, призвав купить курс одновременно как можно скорее.

использовать福格模型(достаточная мотивация + способность завершить это поведение + факторы, побуждающие пользователей к действию), два набора комбинированных ударов срабатывают, и лук-порей полон лука-порея.

(вышеупомянутое взято из:Какие новые способы использования «человеческой природы» в классе Python за 8,9 юаня, которые захватили круг друзей?, Интерпретация оригинального текста и изображений, опыт чтения лучше~)

Это напоминает мне о друге (не специалисте в области ИТ), который думал, что программирование — это так просто, после нескольких занятий, купил полный курс по огромной цене и пригрозил повесить меня через несколько месяцев обучения. знаю, какой сейчас уровень, поэтому не осмеливаюсь спрашивать, если меня потом повесят и побьют, будет плохо, да?

Друзья, кто хочет порезаться луком-пореем, прислушайтесь к совету дядюшки, класс Python слишком глубок, вы не можете его контролировать!

  • Если вы действительно интересуетесь Python и хотите научиться играть, я предлагаю вампрямая проституцияВидеоуроки, которыми поделились большие ребята (множество на станции B);
  • Если вы думаете, что сможете заработать w после изучения этих ускоренных курсов смешанных хороших и плохих, советую вам отказаться от этой идеи как можно скорее;

Мирянин смотрит на веселье, мирянин смотрит на дверной проем, типы классов Python кажутся ослепительными и высокими: краулер, анализ данных, офис автоматизации OA, искусственный интеллект и т. д., на самом деле он должен научить васНекоторые библиотеки Pythonиспользовать, например, pandas, numpy, matplotlib и т. д. И все это доступно в Интернете, поисковые системы ищут по ключевым словам, их куча.

Язык программирования это всего лишь инструмент, а библиотека тем более.Столько всего нужно выучить.Развитие способностей программирования формируется накоплением времени,опыта и мудрости.Ускоренный курс за несколько месяцев эквивалентен к работе в течение нескольких лет.Так приятно думать!


3. Минчжэ защищает себя от «тюрьмы»

Изредка попадаются компании больших данных, бросается в глаза недобросовестный трафик из СМИ, преувеличение фактов, приговорРептилии хорошо играют и рано едят в тюрьме, я вздрогнул от страха перед желанием выучить краулер Мэнсинь, из-за боязни быть скопированным из-за краулера я написал, напевая, боясь, я:

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

С технологической нейтральной точки зрения,爬虫技术本身并无违法违规之处, Что ползать, как ползать - это виновник, который привел в тюрьму. На Github есть библиотека, в которой фиксируются новости, материалы, законы и постановления, связанные с исками и нарушениями отечественных разработчиков краулеров:GitHub.com/скрытая солома…

Чтобы сэкономить время читателей, мы можем прямо резюмировать:

① Игнорировать протокол роботов и сканировать данные без сканирования

robots.txt, простой текстовый файл, администраторы веб-сайтов могут объявить в этом файле ту часть, к которой они не хотят, чтобы поисковые системы обращались, или указать указанный контент, включенный только поисковыми системами, синтаксис прост:

  • Подстановочный знак (*)→ соответствует нулю или более произвольным символам;
  • символ совпадения ($)→ соответствует символу в конце URL-адреса;
  • User-agent→ Имя поискового робота, все основные поисковые системы имеют фиксированные имена, такие как Baidu Baisuspider, если элемент * (подстановочный знак), это означает, что протокол действителен для любого поискового робота;
  • Disallow→ Запрещенные пути доступа;
  • Allow→ Разрешенные пути доступа;

Наггетсrobots.txtНапример:

Однако можно сказать, что это соглашение君子协议, защита от джентльменов, но не от злодеев, игнорирование протокола роботов для произвольного захвата содержимого веб-сайта иподозреваемыйЭто является нарушением статьи 2 Закона о борьбе с недобросовестной конкуренцией, то есть недобросовестной конкуренцией, нарушающей принцип добросовестности и деловой этики.

② Технические меры для принудительного взлома настроек сайта

Веб-сайты обычно используют антисканирование, чтобы уменьшить огромное давление и нагрузку, которую сканеры приносят на веб-сайт в больших количествах. Разработчики краулеров обходят антикраулеры техническими средствами,Объективно влияет на нормальную работу сайта (даже зависает)Статья 12(4) Закона о борьбе с недобросовестной конкуренцией применяется к другим действиям, которые препятствуют или нарушают нормальную работу сетевых продуктов или услуг, предоставляемых на законных основаниях другими операторами.

И насильственное нарушение некоторых конкретных технических средств для обхода и освобождения также может представлять собой уголовное преступление:

  • Статья 285 «Уголовного закона»: Нарушение положений о вторжении в компьютерную информационную систему в сфере государственных дел, оборонного строительства, передовой науки и техники, независимо от тяжести обстоятельств, является преступлением противоправного характера. вторжение в информационную систему компьютера.
  • Статья 286 «Уголовного закона» также предусматривает, что удаление, изменение, добавление или вмешательство в функции компьютерной информационной системы в нарушение государственных правил, что приводит к нарушению нормальной работы компьютерной информационной системы, а последствия тяжким, составляют преступление и наказываются лишением свободы на срок до пяти лет или арестом в уголовном порядке, а при особо тяжких последствиях - лишением свободы на срок до пяти лет.
  • Нарушение государственного регулирования, удаление, изменение или добавление данных и прикладных программ, хранящихся, обрабатываемых или передаваемых в компьютерных информационных системах, повлекшее тяжкие последствия, также является преступлением и наказывается в соответствии с положениями предыдущего пункта.

Будьте осторожны здесь:Предоставление услуг, связанных с поисковым роботом, для незаконных организаций.,вы можете быть привлечены к уголовной ответственности и косвенно.Арест крайнего взломщика в деле шаблонный.Хотя сама технология невиновна,но вы несете равную ответственность,если вы ее разрабатываете и используете преступники. (Это также статья, которую я написал ранее«Как использовать Python, чтобы спекулировать и разбогатеть на несколько дней»Причина отсутствия скриптов для ставок~)

③ Сканирование определенных типов информации

1. Конфиденциальность пользователя

Захват личной информации пользователей или ее публичное распространение после захвата, причиняющий ущерб пользователям, может нарушать права пользователей на неприкосновенность частной жизни.

2. Личная информация пользователя

  • Статья 111 Общих принципов гражданского законодательства: Любая организация или физическое лицо, которым необходимо получить личную информацию других лиц, должны получить ее в соответствии с законом и обеспечить безопасность информации. Запрещается незаконно собирать, использовать, обрабатывать или передавать личную информацию других лиц.
  • Статья 44 Закона о кибербезопасности: ни одно физическое или юридическое лицо не может красть или получать личную информацию другими незаконными способами.
  • Поправка (IX) к статье 253 Уголовного кодекса: Продажа или предоставление личной информации граждан другим лицам в нарушение соответствующих государственных нормативных актов при наличии серьезных обстоятельств является преступлением; незаконное получение личной информации пользователей без разрешения пользователя Личная информация, при наличии серьезных обстоятельств также будет считаться «преступлением в виде посягательства на личную информацию граждан».

3. Произведения, охраняемые законом об авторском праве

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

4. Коммерческая тайна

Статья 9 «Закона о борьбе с недобросовестной конкуренцией»: Акт получения коммерческой тайны других незаконными средствами представляет собой нарушение коммерческой тайны. А последующее использование или разглашение такой информации представляет собой разглашение и использование чужой коммерческой тайны, а также является нарушением коммерческой тайны правообладателя.

V. Защита данных от недобросовестной конкуренции

Поведение, связанное с получением и использованием данных на веб-сайте без разрешения, наносит ущерб конкурентному преимуществу веб-сайта и, таким образом, представляет собой недобросовестную конкуренцию. Данные здесь могут быть сгенерированы пользователями, не защищены авторскими правами, но служат основным источником конкурентоспособности сайта. Если вы собираете информацию, предоставленную пользователями на веб-сайтах моделей пользовательского контента, таких как Dianping и Zhihu, и публикуете и используете эту информацию в своих собственных продуктах или услугах, существует больший риск недобросовестной конкуренции.

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

  • Сначала определите, какой веб-сайт сканировать: Не касайтесь областей национальных дел, строительства национальной обороны и передовой науки и техники;
  • что определить: Не трогайте личную жизнь, личную информацию и коммерческую тайну; данные защищены законом об авторском праве и защищены недобросовестной конкуренцией, ими лучше пользоваться тайно, а не распространять и использовать для получения прибыли (например, см. анализ данных ниже~).
  • Ползучие средства: Будьте нежны, постарайтесь не мешать использованию обычных пользователей, вода будет тормозить, а чужие сайты будут зависать, и будет странно, если вы этого не сделаете.
  • протокол роботов:эм... я злодей

Скайнет полон, редок, но не пропущен~

Ну, эта часть Кана здесь, и он сказал:Мой собственный опыт работы с Python + Интерпретация очень популярных рекламных объявлений класса Python + Толкование сферы нелегальных рептилий, я считаю, что это может развеять опасения некоторых Xiaobai Mengxin, которые хотят изучить поисковый робот Python. Прелюдия немного затянута, поэтому я сразу же начал вводный показ текстового сканера Python.


0x2, закуски — изучите основы Python

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

  • Это позволяет вам тратить небольшое количество энергии на обучение краулера вместо устранения низкоуровневых синтаксических ошибок;
  • Некоторые базовые знания необходимы для работы с поисковым роботом Python, например, работа с файлами;

недоразумение:

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

Рекомендация

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

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

  • Среда разработки Python для сборки;
  • Аннотации и модули;
  • Основной здравый смысл;
  • Переменные, константы и строки;
  • тип данных
  • Условное суждение и цикл
  • функция
  • Исключения и утверждения
  • класс и объект
  • файловое хранилище
  • Общие модули

Карта мозга конкретной главы выглядит следующим образом:


0x3, происхождение рептилий - Мисс Скалолазание

Многие учатся ползать, и все начинают с ползания, и автор не исключение.люблю красоту, у всех есть.

"гусеничный питон"Это всего лишь немного печени, подробной ментальной карты нет, больше просто讲解思路, читатели могут искать ключевые слова, чтобы изучить их самостоятельно. Есть много статей, связанных с поисковыми роботами в Интернете, и их можно найти. Если вы не можете их найти, вы можете оставить сообщение в области комментариев.


① Концепция

1) Вывести рептилий

Например, вы недавно хотели найти красивые обои в качестве обоев для компьютера и нашли веб-сайт с множеством картинок, которые вам по вкусу, например:

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

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

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

действительно есть,爬虫Это что-то вроде этого:

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

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

Краулеры можно писать не только на Python, но и поддерживаются другие языки, такие как JavaScript, Java, PHP и т. д. Просто так получилось, что автор это знает.

2) Базовые знания

Чтобы освободить руки, вы решаете начать учиться писать краулеры, но перед этим вам нужноучитьсяНекоторый базовый здравый смысл в Интернете:

HTTP-протокол

  • Состав URL-адресов
  • Сообщение HTTP-запроса(строка запроса, заголовок запроса, тело запроса)
  • HTTP-ответное сообщение(строка состояния, заголовки ответа, тело ответа)
  • Сессии и файлы cookie

Веб-основы

  • HTML: язык гипертекстовой разметки, определяющий структуру и содержание веб-страниц, а также просто понимающий синтаксис тегов;
  • CSS: каскадные таблицы стилей, определяющие форму представления веб-страниц, и краткое описание следующих трех типов селекторов CSS (теги, классы, идентификаторы);
  • JavaScript: JS для краткости, язык сценариев, который определяет поведение веб-страниц, просто знайте это, вы можете изучить его, когда научитесь взломать js;

② Первый опыт рептилий

Если у вас есть базовое понимание здравого смысла в Интернете, вы можете продолжить обучение.Написание краулера обычно делится на четыре этапа:抓包模拟请求数据解析数据保存.

1) Пакет захвата → Инструменты разработчика Chrome

Браузер Chrome поставляется с ним, Windows может открыть его напрямую, нажав F12, переключиться наNetworkTab, F5, чтобы обновить страницу и начать захват пакетов:

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

Некоторые веб-страницы используют js для динамического рендеринга страниц.ElementsЭто визуализированная структура веб-страницы.Большинство библиотек, имитирующих запросы, не поддерживают динамическую загрузку js. так иногдаElementsНа узле есть некоторые узлы, которые невозможно получить при имитации запроса, поэтому необходимо использоватьNetworkилиSourcesЧасть результатов ответа на запрос имеет преимущественную силу! ! !


2) Имитация запроса → библиотека запросов

Захватите пакет, чтобы найти ссылку, которую вы хотите просканировать, а затем перейдите к запросу моделирования, который будет упоминаться во многих старых руководствах.urllibбиблиотека, единственное, что в ней хорошо, на мой взгляд,встроенный, вам не нужен еще один пакет руководств, но он действительно не прост в использовании! Рекомендуется идти прямоrequestsБиблиотека, простота и удобство использования не на шутку.

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

  • тип запроса: GET, POST или другое;
  • Правила объединения URL: тип \xxx\yyy вставляется напрямую, ?xxx=yyy&zzz=ooo передается в качестве параметраparams;
  • параметры запроса: доступно только в общем методе POST, копировать и вставлять напрямую, вставлять в словарь и передавать параметры.data;
  • заголовок запроса: Посмотрите на заголовки запросов, как правило, хотя бы передайте User-Agent, Host, другие посмотрите на вставку, передайте параметрыheaders;

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

import requests as req

base_url = "https://xxx.xxx"
page_url = base_url + "/yyy"    # 请求URL

# 请求头
page_headers = {
    'Host': 'xxx.xxx',
    'Referer': base_url,
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) '
                  'Chrome/83.0.4103.97 Safari/537.36',
}

# 请求参数
page_data = {'id': 123}


def fetch_page():
    try:
        # POST请求类型
        resp = req.post(page_url, headers=page_headers, data=page_data)
        print("请求:", resp.url)
        if resp is not None:
            if resp.status_code == 200:
                # 解析返回的数据
                print(resp.content)
    except Exception as e:
        print(e)


if __name__ == '__main__':
    fetch_page()

Смоделируйте запрос. Если результат сканирования отличается от ожидаемого (неверный контент или ошибка), исключите логическую ошибку самой программы. Общие указания по устранению неполадок следующие (* отмечены как нечастые):

  • 1,Ссылка для запроса правильная?→ Распечатайте его и сравните с целевой ссылкой;
  • 2,проблема перенаправления→ Библиотека запросов автоматически обрабатывает перенаправление по умолчанию. URL-адрес, напечатанный до и после запроса, несовместим. Это может быть проблемой. Вы можете добавить параметры.allow_redirects=FalseОтключить перенаправление, ссылка перенаправления обычно находится в заголовке ответаLocationполе, также можно распечататьhistoryОтслеживать историю перенаправлений;
  • 3.Отсутствует или неверно представлен заголовок/параметр запроса запроса., если некоторые сайты требуют Referer (для защиты от хотлинкинга), а некоторые нет, то при передаче может сообщить об ошибке;
  • 4.неверный тип запроса, некоторые интерфейсы поддерживают только POST, а не GET;
  • 5.Количество запросов слишком частое, некоторые сайты ограничивают частоту доступа с определенного IP или пользователя в течение определенного периода времени;
  • 6.Данные веб-страницы динамически загружаются js
  • 7.*Задняя часть находится в глуши, например, параметр почтового запроса содержит китайский язык, код веб-сайта — gb2312, китайский параметр необходимо закодировать («GB2312») и так далее.
  • 8,Проблема с куки: Установите неправильно или нет файлов cookie, простым в использованииSession(сессионная) автоматическая обработка файлов cookie;
  • 9,Проблема с проверкой SSL-сертификата: при сканировании HTTPS-сертификата сайта, не сертифицированного ЦС, может быть сообщено об ошибке SSL, и могут быть добавлены параметрыverify=Falseпропустить проверку, сотрудничатьurllib3.disable_warnings()Также удалите предупреждение 857;

Вышеизложенное является общим процессом исследования автора.Добро пожаловать в область комментариев, чтобы добавить.Решения пунктов 5 и 6 будут объяснены в антикраулерах.


3) Парсинг данных → библиотека lxml

После имитации запроса на получение целевых данных следующим шагом является анализ данных.Как правило, существует три типа необработанных данных: HTML, XML и JSON.

JSON использует встроенный **json库** Вы можете разобрать его.Объясняются общие модули основ Python, а два других можно использоватьlxml库Разбор.

lxmlБиблиотека, нижний слой реализован на языке Си, поддерживает парсинг XML и HTML, используяXPath-выражениеНайдите узел, и эффективность синтаксического анализа будет очень высокой.

Использование самой библиотеки очень простое, например:

import requests as req
from lxml import etree

resp = req.get("https://www.baidu.com")

# 传入html文本,得到一个可进行xpath的对象
selector = etree.HTML(resp.text)

# 编写提取图标路径的XPath表达式
xpath_reg = '/html/head/link[@rel="icon"]/@href'

# 提取结点
results = selector.xpath(xpath_reg)

# 打印结点信息
print(results[0])

Трудная частьСинтаксис XPath, синтаксис:

  • взаимосвязь узла: отец, сын, братья и сестры, предки, потомки
  • выбрать узел: самый полезный, предикат, выбрать неизвестный узел, выбрать несколько путей, ось, оператор, функция

Полное руководство по XPath можно найти по адресу:Учебник XPath

Tips: Советы по отладке, вкладка Chrome Elements, нажмите Ctrl+F, вы можете напрямую проверить, правильно ли здесь расположено выражение XPath. Вы также можете щелкнуть правой кнопкой мыши целевой узел, Копировать → Копировать XPath, чтобы напрямую получить выражение XPath.Конечно, выражение XPath, полученное таким образом, обычно не является оптимальным.


4) Хранение данных → сохранить как бинарный файл

Целевые данные анализируются lxml, а затем данные сохраняются. Целевые данные могут быть:Картинки, аудио и видео, обычный текстИ т.д., обычный текст (типа романов) напрямую сохраняется как txt, а остальные файлы сохраняются как бинарные файлы без мозгов, примеры такие:

with open('out.txt', 'w+') as f:
    f.write(resp.content)

# 二进制文件把文件模式从w+改成b+就好~

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

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


③ Продвинутые рептилии

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


1) Расширенный захват пакетов

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

Два наиболее распространенных инструмента для захвата пакетов ПК:Fidder(рекомендация для Windows) иCharles(предложение Mac), принцип中间人代理, помимо захвата пакетов данных браузера, он также может захватывать пакеты данных ПК и мобильных терминалов, в дополнение к функциям имитации запросов. Использование и функции этих двух похожи, и вы можете выбрать один для изучения.

Иногда веб-страницу или сторону ПК анализировать непросто, вы также можете попробовать начать с мобильного терминала (мобильный телефон, планшет).

  • заобычный HTTP-запрос, мобильный телефон Wi-Fi и ПК находятся в локальной сети, программное обеспечение для захвата пакетовВключите разрешение удаленной отправки запросов, проверьте ip локальной машины, а затем установите прокси на мобильном телефоне, вы можете начать захватывать пакеты, такие как:

  • И дляHTTPS-запрос, вам нужно установить сертификат CA, возьмите Чарльза в качестве примера:

В браузере перейдите по следующей ссылке, чтобы загрузить и установить сертификат:

  • После установки сертификата HTTPS-запрос может быть перехвачен, ноНе видно содержимого запроса, это может быть потому, что:

Начиная с Android 7.0 (Nougat, Nougat), Android изменил поведение доверия по умолчанию для установленных пользователем сертификатов и приложений.Доверяйте только ЦС системного уровня"

обходной путь илиС устройствами до Android 7.0, иликорень телефона, установите сертификат в системный сертификат, конкретные шаги операции следующие:

# 打开终端,输入下述命令把 cer或者der 证书转换为pem格式
openssl x509 -inform der -in xxx.cer -out xxx.pem

# 证书重命名,命名规则为:<Certificate_Hash>.<Number>
# Certificate_Hash:表示证书文件的hash值
# Number:为了防止证书文件的hash值一致而增加的后缀

# 通过下述命令计算出hash值  
openssl x509 -subject_hash_old -in Fiddler.pem |head -1

# 重命名,hash值是上面命令执行输出的hash值,比如269953fb
mv Fiddler.pem <hash>.0

# adb push命令把文件复制到内部存储
adb push <hash>.0 /sdcard/

adb shell   # 启动命令行交互
su          # 获得超级用户权限
mount -o remount,rw /system   # 将/system目录重新挂载为可读写
cp /sdcard/<hash>.0 /system/etc/security/cacerts/  # 把文件复制过去
cd /system/etc/security/cacerts/    # 来到目录下
chmod 644 <hash>.0    # 修改文件权限

# 重启设备
adb reboot
  • Если вы все еще не можете поймать HTTPS после установки сертификата в систему, это может бытьПриложение настроено так, чтобы не переходить на системный прокси:

какFlutterПо умолчанию системный прокси не используется, и, например, его использует APP.OKHttpЗапросите сеть, установите прокси (Proxy.NO_PROXY) или перепишите proxySelector;

Традиционный метод агента «человек посередине» не сработает, вы можете использовать компьютер в качестве точки доступа, а затем подключить мобильный телефон к точке доступа, использоватьWiresharkЗахват пакетов:

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

  • Кроме того, некоторые приложения будут выполнять аутентификацию сертификата, чтобы предотвратить перехват пакетов посредниками.После того, как вы используете прокси, приложение не может нормально использоваться.Есть два типа:
  • Односторонняя аутентификация: Выполняйте проверку сертификата только на стороне приложения, метод взлома также прост, перехватывайте коды, связанные с проверкой ssl, например, с помощью подключаемого модуля Xposed.JustTrustMe, для okhttp можно использовать обфусцированное шифрованиеJustTrustMePlus
  • Двусторонняя аутентификация: И сторона приложения, и сторона сервера проверяют сертификат, и метод взлома более сложен.FridaСкрипт Hook извлекает сертификат, обычно это метод load() класса Hook java.security.KeyStore, поскольку его формальными параметрами являются требуемый сертификат и пароль. Сопоставив их с инструментом захвата пакетов, вы можете перехватывать пакеты двусторонней аутентификации. Существует также тип шифрования и дешифрования Hook SSL, который не требует сертификатов.Что отображается в приложении без дешифрования? Сохраните данные в формате pcap здесь, а затем откройте их с помощью Wireshark, чтобы просмотреть данные в виде открытого текста.

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

Кроме того, мобильный терминал также имеет некоторые инструменты, связанные с захватом пакетов:HttpCanary(Мобильная версия посредника для захвата сумки),tcpdump(требуются привилегии root, экспорт пакетов и просмотр результатов с помощью инструментов протокола, таких как Wireshark),Drony(Я создал VP, перенаправляя весь трафик на себя, игнорируя режим без прокси для захвата пакетов, его нужно использовать с инструментом захвата пакетов, таким как Charles, старшая версия кажется недействительной~)

Я никогда не пользовался мобильным телефоном Apple, поэтому не знаю конкретного метода перехвата пакетов~


2) Расширенный запрос моделирования

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

  • В настоящее времяHTTP 2.0 не поддерживается;
  • Не прибегая к сторонним библиотекам, можно только отправитьсинхронный запрос, то есть после того, как запрос инициирован, он блокируется, и следующий запрос не может быть сделан, пока сервер не ответит или не истечет время ожидания;

В настоящее время библиотека запросов моделирования Python, поддерживающая HTTP 2.0, кажется только:httpxиpython-hyper/h2

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

Понимание автора (может быть ошибочным): из-за наличия **GIL (Global Interpretation Lock)** в Python один поток запускает другие потоки и блоки, так что многопоточный код выполняется не одновременно, а попеременно. этоПсевдо многопоточностьнедостатки, по сути, направленные навычислительно интенсивныйОтсутствие задач, для таких краулеровИнтенсивный ввод-выводоперации, использование многопоточности может еще повысить эффективность.

Простой пример многопоточности выглядит следующим образом:

import threading

def load_url(page):
    resp = req.post(page_url, headers=page_headers, data={"page": page})
    print(resp.text)


if __name__ == '__main__':
    page_list = [x for x in range(1, 100)]  # 模拟生成100页
    # 根据爬取页面数生成对应数量的线程
    thread_list = [threading.Thread(target=load_url, args=(page,)) for page in page_list]  
    for t in thread_list:
        t.start()  # 启动线程
    for t in thread_list:
        t.join()  # 等待每个线程执行完毕

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

from multiprocessing.pool import ThreadPool

if __name__ == '__main__':
    page_list = [x for x in range(1, 100)]  # 模拟生成100页
    pool = ThreadPool(10)
    for p in page_list:
        pool.apply_async(load_url, args=(p,))
    pool.close()
    pool.join()

Параллельная работа, результат записывается, помнитезамок! ! ! В противном случае возникнут внештатные ситуации. мультипрогресс(Process) и пул процессов (Pool) реализация тоже похожа, поэтому повторяться не буду.сопрограмма.

Понимание автора (может быть неправильно): при многопоточности и многопроцессорном переключении задач возникают накладные расходы. Сопрограмма определяет меньшую единицу работы, которая по сути является одним потоком. В этот единственный поток помещаются различные типы задач. (вычисления с интенсивным вводом-выводом или процессором), а затем разработчики могут сами планировать порядок выполнения задач.Если встречаются операции ввода-вывода, они будут сокращены для выполнения других задач вместо блокировки.

Python 3.4 начал вводить концепцию сопрограмм (с генераторамиyieldна основе), новое в 3.5asyncio库Как и стандартная библиотека Python, она делает реализацию сопрограмм более удобной, наиболее важными из которых являются два ключевых слова:async (определить сопрограмму)иawait (приостанавливает выполнение методов блокировки), кратко об использовании библиотеки asyncio, сначала несколько концепций:

  • coroutine→ объект сопрограммы, декорировать метод ключевым словом async, вызов этого метода не будет выполняться сразу, а вернет объект сопрограммы, который можно зарегистрировать в цикле событий и дождаться вызова;
  • task→ Объект задачи, который дополнительно инкапсулирует сопрограмму, включая различные состояния задачи;
  • future→ Результаты задач, которые выполняются или не выполняются в будущем, существенно не отличаются от задач;
  • event_loop→ Цикл событий, зарегистрируйте функцию в этом цикле и вызовите соответствующий метод при выполнении условий возникновения;

Простой пример кода многозадачной сопрограммы:

import asyncio
import random

# async定义协程方法
async def load_url(page):
    print("加载页面:", page)
    print("挂起页面:", page)
    # await堵塞(将耗时等待的操作挂起,转去执行其他协程,直到其他协程挂起或执行完毕)
    await asyncio.sleep(random.randint(0, 3))
    print("解析完页面:", page)


if __name__ == '__main__':
    cp_utils.is_dir_existed(out_dir)
    page_list = [x for x in range(0, 100)]  # 模拟生成100页
    coroutine_list = [load_url(x) for x in page_list]  # 构造任务,生成协程对象(coroutine)
    loop = asyncio.get_event_loop()  # 事件循环
    # run_until_complete将协程注册到事件循环loop中,然后启动
    loop.run_until_complete(asyncio.wait(coroutine_list))
    loop.close()

также можно позвонитьensure_future()Функция преобразует написанный объект сопрограммы в объект задачи и привязывает обратный вызов завершения задачи.В этом обратном вызове вы можете получить возвращаемый результат через результат() объекта задачи и изменить следующий код:

# async定义协程方法
async def load_url(page):
    print("加载页面:", page)
    print("挂起页面:", page)
    # await堵塞(将耗时等待的操作挂起,转去执行其他协程,直到其他协程挂起或执行完毕)
    await asyncio.sleep(random.randint(0, 3))
    return "解析完页面:", page


def complete(t):
    print("Task status:", t.result())


if __name__ == '__main__':
    cp_utils.is_dir_existed(out_dir)
    page_list = [x for x in range(0, 100)]  # 模拟生成100页
    # 构造任务,利用ensure_future函数生成task对象
    task_list = [asyncio.ensure_future(load_url(x)) for x in page_list] 
    for task in task_list:
        task.add_done_callback(complete)    # 添加回调函数
    loop = asyncio.get_event_loop()  # 事件循环
    # run_until_complete将协程注册到事件循环loop中,然后启动
    loop.run_until_complete(asyncio.wait(task_list))
    loop.close()
    # 回调其实等同于下面直接拿
    for task in task_list:
        print(task.result())

Просто, правильно, но будьте осторожны:

awaitЗа которым следует объект сопрограммы,requestsЗапрашиваемый метод извлекается и оформляется асинхронно, такое впечатление, что при запросе сервер не отвечает и зависает и переключается на другие сопрограммы. На самом деле нет, запросы будут блокировать asyncio, все равно синхронно! ! !

Одним из решений является использованиеloop.run_in_executor()Превратите синхронную операцию в асинхронную, например:

async def load_page(page):
    temp_loop = asyncio.get_event_loop()
    result = await temp_loop.run_in_executor(None, req.post, page_url, {'page': page})
    return result.text  # 获取响应文本

Однако передача параметров, таких как request.post(), которая не устанавливает параметр ключевого слова заголовков и не может быть передана напрямую, вызывает некоторые затруднения.Вам необходимо самостоятельно создать экземпляр Requests, а затем инициировать запрос через prepare_request( ) метод экземпляра Session. Поэтому рекомендуется использовать библиотеку, поддерживающую методы запроса асинхронной операции:aiohttp, основанный на асинхронном HTTP-фреймворке, реализованном asyncio, он разделен на клиентскую и серверную части, мы используем первую, достаточно изменить код вышеуказанного запроса:

async def load_page(page):
    async with aiohttp.request('POST', page_url, data={'page': page}) as resp:
        body_text = await resp.text()
        print(body_text)

Для подробного использования, пожалуйста, обратитесь к официальной документации:Welcome to AIOHTTP, кроме aiohttp есть много сетевых библиотек, поддерживающих асинхронные запросы, напримерhttpx, ограничение пространства не будет вводиться здесь по одному.

Вышеупомянутая многопоточность, многопроцессорность, сопрограмма и замена библиотеки асинхронных запросов для повышения эффективности обхода по существу по-прежнему запускают программу обходчика на одном компьютере, на что влияют пропускная способность и аппаратное обеспечение компьютера. Для некоторых крупномасштабных задач сканирования вы также можете передать分布式爬虫Повысить эффективность сканирования.


3) Расширенный анализ данных

Первая часть опыта, полученная на основеXPath语法Разобрать html или xmllxml库, который одновременно использовал две другие часто используемые библиотеки синтаксического анализа:

  • BeautifulSoup库: простой и удобный в использовании, требует синтаксического анализатора (Amway lxml), поддерживает выбор узла, поиск по номеру документа и большинство селекторов CSS;
  • PyQuery库: API похож на jQuery, поддерживает большинство селекторов CSS, поддерживает работу с DOM (добавление и удаление узлов);

Скорость парсинга: lxml > PyQuery > BeautifulSoup, в интернете много подобных библиотек парсинга, ядро ​​еще надо освоитьXPath语法иCSS选择器语法.

В этой части мы поговорим об артефакте извлечения строки——正则表达式, многих это пугает, но на самом деле освоить правильную грамматику + практика несложно, и написать простенький регуляр для извлечения целевой строки.

Встроенный Pythonповторный модульДля обработки регулярных выражений предусмотрены следующие функции:

  • совпадать (найти): match() → поиск с начала, search() → сканирование всей строки;
  • Поиск и замена (найти несколько): findall() → сканировать всю строку на наличие совпадений, finditer(), split() → разделить;
  • Скомпилировать объект шаблона: многократно вызывать одно и то же регулярное выражение и компилировать регулярное выражение в объект Pattern для повторного использования;
  • группировка: group() → получить соответствующее содержимое группы, например group(1), чтобы получить первую соответствующую группу;

Затем вызов этих функций может пройти вflagsПараметр (модификатор флага), для управления режимом сопоставления можно использовать несколько, для подключения используйте |

API модуля re так же прост, за ним следует синтаксис регулярного выражения :(персонажколичествограницагруппировкаутверждениеЖадный и нежадный)

Так называемое утверждение: добавьтеКвалификация,РегламентСимволы до/после этой позиции должны соответствовать условиямМатч успешен:

Обычное сопоставление по умолчаниюжадный матч, должен соответствовать как можно большему числу символов, например:

Да, синтаксис такой простой, старайтесь больше практиковаться в процессе сканирования и потихоньку оптимизируйте из безмозглых**(.*?)**. Кроме того, следует отметить два момента:

  • Когда вам нужно сопоставить специальную строку, вы можете добавитьобратная косая чертаПобег, как **\\(**;
  • Чтобы избежать проблемы с обратной косой чертой, вызванной несколькими escape-последовательности, вы можете добавить ** перед регулярным выражениемrукрашение, чтобы сообщить компилятору, что этонеобработанная строка **, не экранируйте обратную косую черту;


4) Расширенное хранилище данных

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

Как и при сканировании Douban Music Top250, данные выглядят следующим образом: название песни-автор-дата выпуска-категория-рейтинг-количество оценок, которые вы можете использовать:csvилиExcelспасти. Соответствующая библиотека:csv库иxlwt/xlrd库.

Списки цепей обходной оболочки, позиции крюков и т. д. также аналогичны с набором из трех частей (библиотекой) основы анализа данных:pandas + numpy + matplotlibТакже очень интересно заниматься простым анализом данных и визуализацией.

Есть еще одно преимущество сохранения данных в формате csv или Excel, как указано выше.Низкая стоимость просмотра данных, Люди без программирования могут смотреть его напрямую, без затрат на обучение, без необходимости устанавливать дополнительное программное обеспечение (обычно встроенное в мобильные телефоны или ПК).

Кроме того, подходящим способом сохранения для разработчиков является сохранение данных в数据库, базы данных обычно делятся на две категории:

  • Реляционная база данных: он хранится в двумерной таблице, и хранится таблица, состоящая из строк и столбцов, что отражается связью между таблицей и таблицей;
  • нереляционная база данных, также известный как NoSQL, основанный на парах ключ-значение, не требует анализа на уровне SQL, между данными нет связи, а производительность очень хорошая;

Для реляционных баз данныхMySQLБолее того, вы должны освоить основы:

Конфигурация установки MySQL, базовый синтаксис базы данных (добавление, удаление, изменение, поиск), соединение Python для работы с базой данных (например,библиотека pymysql), проблемы с хранением специальных символов и смайликов, использование средств визуализации баз данных (таких какNavicat,DataGrip)

Вслед за нереляционными базами данных обычно используютсяMongoDB(база данных документов) иRedis(база данных ключ-значение):

MongoDB, написан на C++, основан на распределенном файловом хранилище, гибкая документная модель, хранилище формата JSON максимально приближено к реальной объектной модели, автор часто запихивает в него просканированные данные JSON, а потом чистит данные, необходимо освоить основы :

Установка MongoDB, подключение Python для работы с базой данных (например, **PyMongo库**)

Redis, написанный на ANSI C, поддерживает сеть, NoSQL на основе памяти, необязательное сохранение, ключ-значение,высокоскоростной, распределенные сканеры часто используются для сохранения очередей задач, и вам нужно освоить основы:

Конфигурация установки Redis, база данных операций подключения Python (например, **redis-py库**)

Кстати, есть некоторые ресурсы, которые нельзя получить напрямую, для их получения можно использовать некоторые сторонние библиотеки, например обход нефтепроводов и видео со станции Б.you-get库Разбор загрузки. Другим примером являются некоторые сайты, которые предоставляют отчеты.Они не предоставляют PDF-файлы прямого отчета, а отображают каждую страницу отчета в виде изображения.Если вы хотите интегрировать в PDF-файл, вам придется заниматься этим самостоятельно: загрузить изображение,библиотека подушекПерейдите к альфа-каналу, затем используйте изображение для создания PDF-файла.img2pdf库синтез.

Кроме того, нет необходимости скачивать ресурс или передавать его в CDN, что занимает место, можно только сохранить ссылку, иногда адрес изображения некоторых пиратских комических приложений указывает на оригинальный адрес сайта, 2333, анти -leech обработка тоже проста, и клиент просто просит картинку привести на оригинальный сайт Referer (в общем случае)~

А также ресурсы CDN,в целомНет ограничений на частоту доступа к IP, поэтому при сканировании вы можете сначала сохранить ссылку, а затем загружать ее партиями после завершения сканирования~


④ Простая защита от рептилий

Антикраулер — это сайт через какие-то технические средства,Улучшить порог сканирования сканеров, Есть много странных навыков против сканирования, автор не специализируется на этом, поэтому у меня есть только несколько простых навыков против сканирования, добро пожаловать в комментарии~

1) Не могу зайти без авторизации

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

  • Простые и неизменяемые файлы cookie, браузер входит в систему, захватывает пакет, копирует файлы cookie и запрашивает заголовок при имитации посещения;
  • Возьмите интерфейс входа в систему.Если он относительно прост, вы можете сначала смоделировать вход в систему и сотрудничать с запросами.Session, все последующие сеансы входят в систему;

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


2) Страница загружается асинхронно с использованием Ajax

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

способ справиться:Поднимитесь по этому интерфейсу данных Ajax напрямую, Chrome разработал этот инструмент для прямой фильтрацииXHRВведите запрос, а затем просмотрите параметры запроса, которые обычно относятся к пейджингу (такие как количество страниц, лимит количества записей и т. д.), и посмотрите на результаты ответа. записи могут быть получены. Преобразуйте его самостоятельно и создайте список параметров локально самостоятельно. , пройдитесь по параметрам, чтобы имитировать доступ к интерфейсу Ajax, вы можете получить все данные.


3) Заблокировать IP

User-AgentИзлишне говорить, что этот здравый смысл используется сервером, чтобы определить, является ли он разумным и реальным браузером, и заголовок запроса может быть загружен изfake-useragent库Возьмите любой из них.

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

Как правило, через некоторое время запрет будет снят, но он также попадет в список наблюдения, и частота доступа будет более строго ограничена.

способ справиться:Использовать прокси IP, общие каналы получения IP-адреса прокси-сервера следующие:

  • Бесплатный прокси: пустая трата времени, он был использован гнилой, он в основном выходит из строя за секунды, а доступность крайне низкая, например шипы;
  • Платное агентство: Вы получаете то, за что платите, некоторые из них дешевы, вам нужно написать свой собственныйпул проксиПросеять через сито, личная привычка использовать облако XXпрокси-туннель;
  • ADSL: Это коммутируемый доступ в Интернет через ADSL, каждый раз, когда вы подключаетесь, вы меняете IP-адрес, и вы можете арендовать динамическую коммутируемую станцию ​​для доступа в Интернет.VPS主机. Не рекомендуется размещать скрипт краулера на хосте (сканировать сайт на нем), рекомендуется использовать его только какпрокси-сервер(то есть пересылка запросов и ответов), чтобы превратить сервер удаленного доступа в прокси-сервер HTTP, можно использоватьSquidилиTinyProxy.

Примечание. Когда подключается ADSL, предыдущий IP-адрес становится недействительным. Этого можно избежать, купив несколько серверов. Ваш собственный облачный сервер поддерживает очередь доступных IP-адресов. Предоставляет интерфейс обновления для вызовов сервера удаленного доступа. Сервер удаленного доступа пишет обычный сценарий удаленного доступа. После набора номера этот интерфейс вызывается для обновления старого IP-адреса в Redis. Регулярный интервал взвешивается в соответствии с количеством серверов удаленного доступа, чтобы гарантировать, что хотя бы один прокси-сервер можно использовать в любое время.

Кстати, кстати, упомянем классификацию прокси IP по скрытому уровню:

  • Прозрачный прокси: если пакет данных изменен, он также сообщит серверу ваш реальный IP-адрес;
  • Рядовой агент: если пакет данных изменен, сервер может узнать, что вы использовали IP-адрес прокси, а также может отследить ваш реальный IP-адрес;
  • Высокий анонимный агент: если пересылка пакета данных не изменена, сервер будет считать это обычным клиентским доступом, и записывается IP-адрес прокси-сервера;

правильный,Не думайте, что вы можете делать все, что захотите, с высокосекретным прокси., есть еще способ отследить источник до вашего реального IP! я не верю, что ты можешьМонголия Шандан Чонг Пагода, быстро и одновременно посетите веб-сайт, упомянутый в «Тюремной катастрофе», и попробуйте его, возможно, вскоре кто-то пригласит вас выпить чаю~


4) Заблокировать аккаунт

Подобно блокировке IP, она ограничивает частоту учетной записи.способ справиться: подготовьте несколько учетных записей и поддерживайте пул файлов cookie.

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

Это проще всего найти, обычно там будет один养号Процесс регистрации по периоду времени (регистрация на определенный период времени заранее), а затем выполнение повседневных действий (доступ к интерфейсу или имитация поведения пользователя), чтобы сервер чувствовал себя обычным пользователем (таким образом, вы найдете что наггетсы часто чего-то не знают" трубят "как и вы).


?5) JavaScript

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

Параметры некоторых интерфейсов представляют собой набор непонятных длинных строк, и они все время меняются, в основном js-шифрование, загрузка некоторых страниц тоже шифруется через js (например, антисканирование шрифта Dianping).

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

  • компрессия: Удалите ненужные пробелы, разрывы строк и т. д., ограничьте некоторые возможные общие коды обработкой и совместным использованием и, наконец, сожмите их в несколько строк, что делает код очень плохим для чтения;
  • затемнять: затрудняет чтение и анализ js, в том числе: запутывание переменных, запутывание строк, шифрование атрибутов, выравнивание потока управления, зомби-код, защита от отладки, полиморфная компиляция, блокировка доменных имен, деформатирование специального кодирования и т. д.;
  • шифрование: напишите некоторую основную логику на таких языках, как C/C++, и выполните ее через вызовы JavaScript, чтобы играть роль защиты на двоичном уровне;

6) Моделирование инструментов автоматизированного тестирования

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

Две часто используемые библиотекиSeleniumиPyppeteer, последний основан на ядре Chromium, не требует громоздкой настройки среды и более эффективен, чем первый. Онлайн-туториалы — это плохо, поэтому я не буду вдаваться в них подробно. Следует упомянуть два момента:

  • Если вы хотите перехватить запрос, инициированный браузером при загрузке страницы, вы можете использовать его с другими инструментами захвата пакетов, такими какmitmproxy,browsermob-proxyЖдать;
  • При использовании этих двух библиотек для имитации доступа через браузер существует множество функций, которые сайт может обнаружить с помощью JavaScript;

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

  • Простой код подтверждения изображения: распознавание OCR, tesseract собирает изображения для обучения или использует сторонний OCR;
  • сложный код подтверждения изображения: платформа кодирования;
  • Проведите код подтверждения: анализировать законы ползунка и зазора картинки, вычислять расстояние между ними и использовать Selenium для имитации скольжения;

Менялся проверочный код, перевернутый текст, скользящие кружочки и т.д., но ведь не совпадаетРучное кодирование, лет!


7) Мобильное сканирование

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

Два часто используемых инструмента:Appiumиairtest, последний API проще в использовании и находит элементы пользовательского интерфейса на основе технологии распознавания изображений (Appium не может напрямую находить гибридные страницы разработки) Существует множество руководств, поэтому я не буду вдаваться в подробности.

Идти дальше внизAPP逆向Область действия выходит за рамки распаковки и декомпиляции исходного кода APK, прямого взлома правил шифрования, прямого написания сценария запроса или непосредственного написания подключаемого модуля Xposed, перехвата части кода загрузки данных, прямого экспорта данных или отправки данных. на свой сервер и т.д.


⑤ Каркас обходчика

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

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

Другой способ — использовать структуру сканера, которая включает в себя весь процесс сканирования, обработку исключений, планирование задач и т. д. Две широко используемые структуры сканера.ScrapyиPySpider, вот пример Scrapy, написанный на базе событийно-управляемого сетевого фреймворка Twisted (официальная документация), авторский маршрут обучения:

Понять, из каких модулей состоит архитектура → соответствующие функции модулей → взаимодействие между модулями → настройка каждого модуля;

Схема архитектуры Scrapy

Интерпретация функций модуля:

  • Engineдвигатель, ядро ​​фреймворка, управляет потоком данных между компонентами фреймворка и инициирует соответствующие события, когда происходит соответствующий блок;
  • Schedulerпланировщик, планирование запросов, получение запросов от механизмов, добавление их в очередь и предоставление их последующим механизмам по мере их запроса;
  • DownloaderЗагрузчик, получить данные страницы и предоставить их движку, а затем предоставить их сканеру;
  • Downloader MiddlewaresСкачать промежуточное ПО, особый хук между загрузчиком и движком, который может выполнять некоторую обработку до того, как загрузчик передаст ответы движку;
  • Spiderрептилия, сгенерируйте запрос, отправьте его загрузчику для загрузки и возврата ответа, проанализируйте и извлеките элемент или класс URL-адреса, который необходимо отследить.
  • Spider Middlewaresпромежуточное ПО сканера, особый хук между краулером и движком, который может выполнять некоторую обработку на входе и выходе краулера;
  • Item Pipelineконвейер проекта, который используется для обработки элементов, сгенерированных сканером, и выполнения некоторой обработки, такой как очистка данных, проверка и сохранение;

сотрудничество между модулями:

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

Кастомизацию каждого модуля обсуждать не буду.В сети их много,только следующиеСтыковка с селеном,Подключение к библиотеке планирования интерфейса HTTP устраняет необходимость запуска командной строки.:

Scrapy также не имеет возможности выполнять js, поэтому он бессилен для динамического рендеринга страниц и может быть обработан путем стыковки с Selenium. Метод стыковки очень прост (аналог Pyppeteer):

Настройте промежуточное ПО загрузки, обработайте захваченный запрос в методе process_qequest(), запустите браузер для отображения страницы, а затем создайте обработанный результат в объекте HtmlResponse и верните его.

Каждый раз, когда вы запускаете сканер Scrapy, вы должны вводить в командной строкеscrapy crawl 爬虫名, если он развернут на сервере, вам нужно подключиться к SSH, а затем ввести команду, которая громоздка и может быть упрощена с помощью обычно используемой библиотеки планирования интерфейса Scrapy HTTP:ScrapyrtиScrapyrd, первый легче, проще в использовании и не требует распределенной многозадачности, и его можно использовать напрямую для планирования удаленных задач Scrapy.

pip install scrapyrt    # 安装
scrapyrt                # 在任意一个Scrapy项目运行如下命令即可启动HTTP服务
                        # 默认9080端口,也可以自行更换端口:scrapyrt -p 9081

# 接着就可以自行拼接请求了,如:
curl http://localhost:9080/crawl.json?spider_name=juejin&url=https://juejin.cn/

# GET请求支持参数如下:

spider_name:爬虫名称;
url:爬取链接;
callback: 回调函数名;
max_requests:最大请求数量;
start_requests:是否执行start_requests方法;

# POST请求Body可选配置参数如下:
spider_name:爬虫名称;
max_requests:最大请求数量;
request:JSON对象,支持Scrapy.Request类中所有的属性

# 返回结果是一个JSON格式的字符串,可自行解析判断~


⑥ Распределенный поисковый робот

Все перечисленные выше задачи сканирования выполняютсяхозяинПолзание вверх, теперь расширяющееся донесколько хостовСканирование, это распределенный краулер. Как правило, он используется только при сканировании массивных данных, таких как сканирование пользовательских данных всего сайта Zhihu, всей пользовательской информации на Weibo, связывание всей информации о недвижимости и отслеживание цен на товары электронной коммерции.

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

  • ① Как предотвратить выполнение одной и той же задачи сканирования несколькими хостами, т.е.Дедупликация задач сканирования;
  • ② В процессе сканирования один или несколько хостов.Как избежать потери задач и данных сканирования?

Проблема ②, легко решить, получить один共享爬取队列Это хорошо, хосты все приходят сюда за задачами, и хорошо кидать задачи обратно в очередь до исчерпания.Что касается потери данных, то тут еще проще.Хорошо всем хранить отсканированные данные в единой базе данных .

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

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

Общая очередь сканированияКогда дело доходит до параллельного доступа, вам нужно найти структуру очередей, которая поддерживает параллелизм.Redis,RabbitMQ,Celery,KafkaЖдать.

Redis очень хорош, набор также поддерживает дедупликацию, если вы к этому привыклиScrapyНапишите краулер, вам не нужно реализовывать его самостоятельно, просто перейдите напрямуюscrapy-redis, Redis добавлен на основе Scrapy, а компоненты расширены на основе характеристик Redis:

  • Scheduler→ Замените очередь Scrapy очередью Redis (настроенной на базу данных) и используйте отпечаток запроса для дедупликации, но используйте набор Redis для дедупликации и каждый раз извлекайте запрос из очереди запросов Redis в соответствии с приоритетом, отправьте для паука обработка.
  • Item Pipeline→ Храните просканированные элементы в очереди элементов Redis, а модифицированный конвейер элементов может легко извлекать элементы из очереди элементов в соответствии с ключом, чтобы реализовать кластер обработки элементов (он также может храниться в разных базах данных, таких как МонгоДб).
  • Base Spider→ переписатьRedisSpiderНаследовать Spider и RedisMixin (класс, который считывает URL-адрес из Redis), унаследовать сканер, сгенерированный этим RedisSpider, вызвать setup_redis(), чтобы получить подключенную базу данных Redis, и установить сигналы (сигнал)
  • Когда сигнал находится в режиме ожидания, он вызовет функцию spider_idle() → schedule_next_request(), чтобы убедиться, что сканер всегда активен, и выдаст исключение DontCloseSpider;
  • Когда сигнал Item будет перехвачен, будет вызван item_scraped() → schedule_next_request() для получения следующего запроса;

Общий принцип таков, а затем политика ответственности хозяина и ведомого:

  • хост (хозяин): Создайте базу данных Redis, отвечающую за идентификацию отпечатков пальцев, распределение запросов и хранение данных;
  • Раб: отвечает за выполнение программы-краулера и отправку нового запроса на хост во время работы;

官方仓库В разделе example/project/example/spiders есть три демо-класса сканера, которые можно использовать, изменив их:

dmoz.py: наследуя CrawlSpider, он используется только для иллюстрации постоянства Redis, остановки искателя и его повторного запуска, а записи сканирования по-прежнему хранятся в Redis;

myspider_redis.py: Наследование RedisSpider, переписывание функции разбора, поддержка распределенного обхода, больше не start_urls, вместо redis_key, команда запуска обходчика, ссылочный формат: redis_key = 'myspider:start_urls', в соответствии с указанным форматом start_urls будет начинаться с Мастера lpush в базу данных Redis в redis-cli терминала, и RedisSpider получит start_urls из базы данных Метод выполнения следующий:

  • Сторона рабовладельцев: скрап-паук myspider_redis.py (краулеры ждут)
  • На стороне Master введите команду push в redis-cli, формат ссылки: lpush myspider:start_urlswww.xxx.xx/
  • Искатель на ведомой стороне получает запрос и начинает сканирование;

mycrawler_redis.py, наследует RedisCrawlSpider, поддерживает распределенное сканирование, должен соблюдать правила правил, а метод выполнения такой же, как указано выше;

Самая большая разница между хозяином и рабомsettings.pyФайлы настроены по-разному:

# === 主机配置 ===

# 使用scrapy-redis里的调度器组件,不使用scrapy中默认的调度器
SCHEDULER = "scrapy_redis.scheduler.Scheduler"

# 使用scrapy-redis里的去重组件,不使用scrapy中默认的去重
DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"
 
# 'scrapy_redis.pipelines.RedisPipeline 支持将数据存储到数据库中
ITEM_PIPELINES = {
    'example.pipelines.ExamplePipeline': 300,
    'scrapy_redis.pipelines.RedisPipeline': 400,
}

# 按优先级出列
SCHEDULER_QUEUE_CLASS = "scrapy_redis.queue.SpiderPriorityQueue"

# 主机IP和端口
REDIS_HOST = "localhost"
REDIS_PORT = 6379

# === 从机配置 ===
REDIS_URL = 'redis://root:xxx@master端IP:6379'

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

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

  • Конфигурация среды: Используйте установку библиотек и инструментов (также обратите внимание на конфликты версий), выполняйте различные настройки, SSH один за другим и плачьте;
  • развертывание кода: Обновление кода скрипта краулера, git pull тянет один за другим, плачет;

Первый вопрос, сDockerКонтейнеры могут решить:

DockerЭто пакет, основанный на контейнерах Linux и предоставляющий простой в использовании интерфейс контейнера. Контейнер Linux — это технология виртуализации, которая не имитирует полную систему, а изолирует процесс (слой покрытия процесса). Все виды ресурсов, к которым обращается процесс, виртуализируются, чтобы достичь цели изоляции от базовой системы. Его можно понимать как более легковесную виртуальную машину, а контейнер находится на уровне процесса, по сравнению с виртуальными машинами он запускается быстрее и занимает меньше ресурсов.

Образы Docker обычно содержат полную операционную систему, которую можно настроить, написав Dockerfile. Создайте новый файл Dockerfile (без суффикса) в проекте сканера. Пример содержимого выглядит следующим образом:

FROM python:3.6 # 使用Docker基础镜像,在此基础上运行Scrapy项目;
ENV PATH /user/local/bin:$PATH # 环境变量配置,将/user/local/bin:$PATH赋值给PATH
ADD . /code # 将本地代码放置到虚拟容器中,第一个参数代表当前路径,第二个参数代表虚拟容器中的路径;
WORKDIR /code   # 指定工作目录;
RUN pip3 install -r requirements.txt # 执行某些命令来做一些准备工作,如安装依赖库;
CMD scrapy crawl TestSpider # 容器启动命令,容器运行时会执行此命令,可以在这里启动爬虫;

Выполните следующую команду сборки образа:docker build -t test:latest ., дождитесь завершения сборки, вы можете выполнить ее локально**docker run test** Проверьте изображение. Этот файл образа можно напрямую скопировать на облачный сервер для загрузки или отправить в Docker Hub, выполнив команду:docker run xxx/test, автоматически загрузит и запустит образ Docker.

Эта часть здесь.Я не делал этого раньше, и спросить не у кого.Я видел, что есть хорошая библиотека:scrapydweb, если вам интересно, вы можете попробовать Kang~


0x4, конец песни разбросан - судьбою прощай

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

да это простоНачиная, автору еще далеко до продвинутого:накопление опыта взлома js,Практика развертывания большого распределенного краулера,Спроектируйте и разработайте краулер-фреймворк самостоятельно, но пока я здесь. Это пожелание. Надеюсь, это будет полезно друзьям, которые хотят изучить краулер Python.

В процессе самостоятельного изучения и исследования всеЦиннаньиЦуй ЦинцайПодошли предметы двух больших мужчин, стоявших вгигантНа своих плечах я прошел много обходных путей и получил много пользы, спасибо~

использованная литература: