[Перевод] 30-минутное руководство по Python Crawler

задняя часть Python рептилия Программа перевода самородков

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

Источник изображения:Blake ConnallyопубликованоUnsplash.com

Сырье для простых картинок рептилий

  • Python(3.6.3 или выше)
  • Pycharm(Достаточно версии сообщества)
  • pip install requests Pillow selenium
  • geckodriver(подробнее см. ниже)
  • Mozlla Firefox(если вы его не установили)
  • Нормальное подключение к Интернету (очевидно, требуется)
  • Ваши драгоценные 30 минут (может быть меньше)

Простой рецепт обходчика картинок

Все вышеперечисленное установлено? Здорово! Прежде чем мы перейдем к написанию кода, позвольте мне объяснить, для чего используются эти ингредиенты.

Первое, что мы делаем, это используемSelenium webdriverиgeckodriverчтобы открыть окно браузера для нас. Первый вPycharmСоздайте новый проект в , загрузите последнюю версию geckodriver в соответствии с вашей операционной системой, разархивируйте ее и перетащите файл geckodriver в папку проекта. Geckodriver — это, по сути, инструмент, который позволяет Selenium управлять Firefox, поэтому он нужен нашему проекту, чтобы браузер мог что-то делать за нас.

Следующее, что нам нужно сделать, это импортировать webdriver из Selenium в наш код и подключиться к URL-адресу, который мы хотим сканировать. Просто сделай это:

from selenium import webdriver
# 我们想要浏览的 URL 链接
url = "https://unsplash.com"
# 使用 Selenium 的 webdriver 来打开这个页面
driver = webdriver.Firefox(executable_path=r'geckodriver.exe')
driver.get(url)

Откройте окно браузера по указанному URL-адресу.

Окно Firefox с дистанционным управлением.

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

Далее мы должныпрокрутить внизчтобы можно было загрузить больше изображений, прежде чем мы сможем их загрузить. мы все еще хотимподождите несколько секунд, если сетевое соединение настолько медленное, что изображение загружается не полностью. Поскольку веб-сайт Unsplash создан с помощью React, 5-секундное ожидание кажется «достаточно щедрым», чтобы использовать Python.timeПросто подождите 5 секунд, мы также будем использовать код Javascript для прокрутки страницы — мы будем использовать[window.scrollTo()](https://developer.mozilla.org/en-US/docs/Web/API/Window/scrollTo)функцию для достижения этого. Сочетая вышесказанное, ваш окончательный код должен выглядеть так:

import time
from selenium import webdriver

url = "https://unsplash.com"

driver = webdriver.Firefox(executable_path=r'geckodriver.exe')
driver.get(url)
# 向下滚动页面并且等待 5 秒钟
driver.execute_script("window.scrollTo(0,1000);")
time.sleep(5)

Прокрутите страницу и подождите 5 секунд.

После тестирования приведенного выше кода вы должны увидеть, как браузер немного прокручивается вниз. Следующий шаг, который нам нужно сделать, это найти те изображения, которые мы хотим загрузить. Изучив код, сгенерированный React, я обнаружил, что мы можем использоватьСелекторы CSSнайти изображение в галерее на веб-странице. Макет и код на странице могут измениться в будущем, но пока мы можем использовать#gridMulti imgселектор, чтобы все отображалось на экране<img>элемент.

мы можем пройти[find_elements_by_css_selector()](http://selenium-python.readthedocs.io/api.html#selenium.webdriver.remote.webdriver.WebDriver.find_element_by_css_selector)получить список этих элементов, но мы хотим, чтобыsrcАтрибуты. Мы можем пройтись по этому списку и извлечь один за другимsrcПриходить:

import time
from selenium import webdriver

url = "https://unsplash.com"

driver = webdriver.Firefox(executable_path=r'geckodriver.exe')
driver.get(url)

driver.execute_script("window.scrollTo(0,1000);")
time.sleep(5)
# 选择图片元素并打印出他们的 URL
image_elements = driver.find_elements_by_css_selector("#gridMulti img")
for image_element in image_elements:
    image_url = image_element.get_attribute("src")
    print(image_url)

Выберите элемент изображения и получите URL-адрес изображения.

Теперь, чтобы получить изображение, которое мы нашли, мы будем использоватьrequestsбиблиотека иPILчасть функции, т.Image. мы также будем использоватьioв библиотекеBytesIOзаписывать картинки в папку./images/in (создается в папке проекта). Теперь, чтобы сделать это все вместе, мы сначала отправляем URL-ссылку на каждое изображение.HTTP-запрос GET, затем используйтеImageиBytesIOфотографии, чтобы вернутьсяместо храненияВстаньте. Ниже приведен один из способов достижения этой функции:

import requests
import time
from selenium import webdriver
from PIL import Image
from io import BytesIO

url = "https://unsplash.com"

driver = webdriver.Firefox(executable_path=r'geckodriver.exe')
driver.get(url)

driver.execute_script("window.scrollTo(0,1000);")
time.sleep(5)
image_elements = driver.find_elements_by_css_selector("#gridMulti img")
i = 0

for image_element in image_elements:
    image_url = image_element.get_attribute("src")
    # 发送一个 HTTP GET 请求,从响应内容中获得图片并将其存储
    image_object = requests.get(image_url)
    image = Image.open(BytesIO(image_object.content))
    image.save("./images/image" + str(i) + "." + image.format, image.format)
    i += 1

Скачать картинки.

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

  • Позволяет пользователю указать, указав аргумент командной строкипоисковый запроси числовой параметр, указывающий количество прокруток вниз, что позволяет странице отображать больше изображений для загрузки.
  • Настраиваемые селекторы CSS.
  • Настройка на основе ключевых слов поискового запросапапка результатов.
  • Получите полное изображение, обрезав ссылку предварительного просмотра изображения.HD картинки.
  • Назовите файл изображения на основе URL-адреса изображения.
  • Закройте браузер, когда сканирование наконец завершится.

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


Недостатки, предостережения и будущие оптимизации

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

  • Плохая практика не признавать автора, загрузившего изображение. Selenium определенно способен справиться с этой ситуацией, поэтому у каждого изображения есть имя автора.
  • Geckodriver не должен быть помещен в папку проекта, а установлен в глобальном окружении и помещен вPATHв системных переменных.
  • Функция поиска может быть легко расширена до нескольких ключевых слов запроса, поэтому процесс загрузки многих типов изображений может быть упрощен.
  • Браузер по умолчанию может заменить Firefox на Chrome или даже использоватьPhantomJSАльтернатива, которая лучше подходит для этого типа проекта.

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