Scrapy 5+1 - Пять ям с маленькой хитростью

Scrapy

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

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

1. user_agent

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

1618068324931.png

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

2. ROBOTSTXT_OBEY

Как и user_agent выше, это также значение параметра, установленное в settings.py. После того, как мы создадим новый проект с помощью оператора scrapy fixed, мы обнаружим, что этот оператор в settings.py горит, а значение по умолчанию — True.

1618068864043.png

Это означает, что наш паук будет подчиняться правилам robots.txt. Проще говоря, robots.txt — это файл, который следует протоколу Robot.Он хранится на сервере веб-сайта.Его функция состоит в том, чтобы сообщать роботам поисковых систем, какие страницы в каталоге этого веб-сайта не хотят, чтобы вы сканировали, и включить их. После запуска Scrapy он впервые посетит файл robots.txt веб-сайта, а затем определит область сканирования веб-сайта.

Но у наших сканеров вообще нет морали, и они знают, как соблюдать это утверждение, поэтому, когда мы создаем новый проект, мы прямо устанавливаем эту конфигурацию в False! Решайте проблемы непосредственно перед тем, как столкнетесь с ними!

3. allowed_domains

После того, как мы создаем новый проект, это утверждение появится в вашем шайлевом файле

1618069362652.png

start_urls обычно относится к начальной ссылке вашего Паука, которая является краеугольным камнем империи пауков в начале, а разрешенные_домены — это самый дальний забор вашей империи пауков. Есть поговорка, что паук в scrapy сканирует очень быстро, поэтому, чтобы он не ползал на другие интерфейсы, мы установим здесь allow_domains. После настройки доменные имена, не входящие в этот диапазон, будут отфильтрованы, а наши спайдеры также будут заблокированы в заданном доменном имени.

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

**Решение.** – добавить новое доменное имя в разрешенные_домены, которое используется в качестве области сканирования поисковым роботом.

1618070098034.png

4. Тоббин шрифт и

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

Когда мы пишем пути xpath, мы часто сначала находим селектор css, а потом описываем его путь

1618070633751.png

Например, мы хотим получить выбранный td в интерфейсе отладки браузера:

xpath = "//table[@class = 'present-table']/tr[1]/td[2]/text()"

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

1618070823107.png

Видите ли, тега

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

Не все

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

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

5. URL-адрес изображения @src должен быть в формате списка.

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

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

# 第一种
src = response.xpath('//img/@src').extract()

# 第二种
src = [response.xpath('//img/@src').extract_first()]

Вышеприведенное использует характеристики Extract() и Extract_first().

Extract(): этот метод возвращает список массивов, который содержит несколько строк. Если есть только одна строка, он возвращает форму ['ABC'].

Extract_first(): этот метод возвращает строку string, которая является первой строкой в ​​массиве списка.

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

* Советы - как передавать мультиинтерфейсные данные

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

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

yield scrapy.Request(the_href,callback=self.another_parse,meta={"item":item})

Мы можем успешно передать наш элемент в other_parse и существовать в виде response.meta, а затем переопределить здесь элемент и присвоить ему this для завершения передачи.

1618072239381.png