Изучайте Python быстро, сокращайте путь~

Python Selenium
Изучайте Python быстро, сокращайте путь~

Всем привет, я Сяо Цай. надежда бытьхвастаться архитектуройчеловек! Если вы также хотите быть тем, кем я хочу быть, или следуйте за мной, чтобы быть компаньоном, чтобы Сяокай больше не был одинок!

Эта статья в основном знакомитpython 的入门学习

При необходимости вы можете обратиться к

Если это поможет, не забудьтеподобно

Официальный аккаунт WeChat открыт,Говорят овощеводы, студенты, которые не обратили внимания, не забудьте обратить внимание!

Всем привет. вот蔡不菜丶предшественник菜农曰. Не заблудитесь только потому, что имя изменено и изменена аватарка~

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

Говоря оPythonРеакция каждого может бытьрептилия,автоматизированный тест, я редко говорю об использовании python для веб-разработки.Условно говоря, язык, который больше используется в отечественной веб-разработке, все ещеjava~Но это не значит, что python не подходит для веб-разработки, насколько я знаю, наиболее распространенными веб-фреймворками являютсяDjangoа такжеflaskподожди~

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

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

Но цель этой статьи не в том, чтобы представитьвеб-разработка на питоне, и это не введениеБазовое введение в python, но давайте поговорим об автоматизированном тестировании Python и знакомстве со сканером~

На мой взгляд, если у вас есть опыт разработки на других языках, Xiaocai рекомендует начинать прямо с кейса и учиться во время просмотра.Грамматика и тому подобное на самом деле одинаковые(Содержание объединения java для изучения python будет опубликовано позже), код в принципе можно внимательно читать, но если у вас нет опыта разработки языка, то Xiaocai все же рекомендует систематическое обучение с нуля.Хорошим выбором будут видео и книги.Рекомендуется здесь廖雪峰老师блог, содержание довольно хорошееУчебник по Python

1. Автоматизированное тестирование

Python может делать много вещей, и он может делать много интересных вещей.

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

Что такое автоматизированное тестирование? То есть自动化 + 测试, если вы написали скрипт (файл .py), он автоматически запустит для вас процесс тестирования в фоновом режиме после запуска, затем, используя автоматическое тестирование, есть хороший инструмент, который может помочь вам выполнить его, то естьSelenium

SeleniumЭто инструмент тестирования веб-автоматизации, который может легко имитировать работу реальных пользователей в браузерах. Он поддерживает различные основные браузеры, такие какIE、Chrome、Firefox、Safari、OperaИ т. д., я использую python для демонстрации здесь, чтобы не сказатьSeleniumПоддерживает только python, имеет клиентские драйверы для нескольких языков программирования, введение в синтаксис ~ Давайте сделаем простой пример ниже!

1) Предварительная подготовка

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

шаг 1

Проверьте версию браузера, мы используем следующееEdge, мы можем ввести в поле ввода URLedge://versionПроверьте версию браузера, а затем перейдите в соответствующий магазин драйверов, чтобы установить драйвер соответствующей версии.Microsoft Edge - Webdriver (windows.net)

Шаг 2

Затем мы разархивируем загруженный файл драйвера в каталог установки python.Scriptsв папке

image-20211119231250381

2) Работа в браузере

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

С пакетом гида всего 4 строки кода, и введите его в терминалpython autoTest.py, и получил следующий демонстрационный эффект:

Вы можете видеть, что скрипт был реализован自动打开浏览器,自动放大窗口,自动打开百度网页, три автоматические операции сделали наше обучение еще на один шаг ближе, вам не кажется, что это немного интересно~ Давайте постепенно утонем!

Вот несколько распространенных методов работы с браузером:

метод иллюстрировать
webdriver.xxx() Используется для создания объектов браузера
maximize_window() окно развернуто
get_window_size() Получить размер браузера
set_window_size() Установить размер браузера
get_window_position() Получить местоположение браузера
set_window_position(x, y) Установить местоположение браузера
close() закрыть текущую вкладку/окно
quit() закрыть все вкладки/окна

Конечно, этоSeleniumОсновная рутинная операция

Когда мы открываем браузер, конечно, то, что мы хотим сделать, это не просто операция открытия веб-страницы, ведь амбиции программистов безграничны! Мы также хотим автоматизировать элементы страницы, поэтому об этом нужно сказатьSeleniumоперация позиционирования

3) Элементы позиционирования

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

  • таргетинг по идентификатору

document.getElementById("id")

  • Найдите по имени

document.getElementByName("name")

  • Найдите по названию тега

document.getElementByTagName("tagName")

  • Найдите по классу

document.getElementByClassName("className")

  • таргетинг через css-селекторы

document.querySeletorAll("css selector")

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

  1. позиционирование идентификатора

driver.find_element_by_id("id")

Мы открываем страницу Baidu и обнаруживаем, что идентификатор поля вводаkw,

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

from selenium import webdriver

# 加载 Edge 驱动
driver = webdriver.ChromiumEdge()
# 设置最大窗口化
driver.maximize_window()
# 打开百度网页
driver.get("http://baidu.com")

# 通过 id 定位元素
i = driver.find_element_by_id("kw")
# 往输入框输入值
i.send_keys("菜农曰")

  1. позиционирование значения атрибута имени

driver.find_element_by_name("name")

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

from selenium import webdriver

# 加载 Edge 驱动
driver = webdriver.ChromiumEdge()
# 设置最大窗口化
driver.maximize_window()
# 打开百度网页
driver.get("http://baidu.com")

# 通过 id 定位元素
i = driver.find_element_by_name("wd")
# 往输入框输入值
i.send_keys("菜农曰")
  1. позиционирование имени класса

driver.find_element_by_class_name("className")

В соответствии с методами позиционирования идентификатора и имени вам нужно найти соответствующее имя класса, а затем найти ~

  1. Позиционирование имени тега

driver.find_element_by_tag_name("tagName")

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

  1. css-селектор

driver.find_element_by_css_selector("cssVale")

Этот метод должен подключить пять селекторов css

Пять селекторов

  1. селектор элементов

Наиболее распространенным селектором CSS является селектор элемента, который обычно относится к элементу HTML в документе HTML, например:

html {background-color: black;}
p {font-size: 30px; backgroud-color: gray;}
h2 {background-color: red;}
  1. селектор класса

.Добавление имени класса формирует селектор класса, например:

.deadline { color: red;}
span.deadline { font-style: italic;}
  1. селектор идентификатора

Селекторы идентификаторов и селекторы классов в чем-то похожи, но различия очень существенны. Прежде всего, элемент не может иметь несколько классов, таких как атрибут класса, элемент может иметь только уникальный атрибут ID. Метод использования селектора идентификатора — знак решетки.#Добавьте значение идентификатора, например:

#top { ...}
  1. селектор атрибутов

Мы можем выбирать элементы на основе их атрибутов и значений атрибутов, например:

a[href][title] { ...}
  1. Производный селектор

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

body li { ...}
h1 span { ...}

Конечно, селектор здесь — это просто краткое введение, больше информации можно найти в документации~

Разобравшись с селектором, мы можем с радостью определить позиционирование селектора css:

from selenium import webdriver

# 加载 Edge 驱动
driver = webdriver.ChromiumEdge()
# 设置最大窗口化
driver.maximize_window()
# 打开百度网页
driver.get("http://baidu.com")

# 通过 id选择器 定位元素
i = driver.find_elements_by_css_selector("#kw")
# 往输入框输入值
i.send_keys("菜农曰")
  1. Позиционирование текста ссылки

driver.find_element_by_link_text("linkText")

Этот метод специально используется для поиска текстовых ссылок, например, мы можем видеть, что есть新闻,hao123,地图... и т.д. элементы ссылок

Затем мы можем использовать текст ссылки, чтобы найти

from selenium import webdriver

# 加载 Edge 驱动
driver = webdriver.ChromiumEdge()
# 设置最大窗口化
driver.maximize_window()
# 打开百度网页
driver.get("http://baidu.com")

# 通过 链接文本 定位元素并 点击
driver.find_element_by_link_text("hao123").click()

  1. Частичный текст ссылки

driver.find_element_by_partial_link_text("partialLinkText")

этот путь правильныйlink_textВспомогательный, иногда текст гиперссылки может быть очень длинным, если мы введем их все, это будет хлопотно и некрасиво

На самом деле нам нужно только перехватить часть строки, чтобы селен понял, что мы хотим выбрать, затем мы используем partial_link_text~

  1. выражение пути xpath

driver.find_element_by_xpath("xpathName")

Несколько методов позиционирования, описанных выше, идеальны: каждый элемент имеет уникальный идентификатор, имя, класс или текстовые атрибуты гиперссылки, и мы можем найти их по этому уникальному значению атрибута. Но иногда элемент, который мы хотим найти, не имеет атрибутов id, name, class, или значения этих атрибутов у нескольких элементов одинаковы, или при обновлении страницы значения этих атрибутов изменятся. Тогда в это время мы можем найти его только через xpath или CSS. Конечно, значение xpath вам вычислять не нужно, нам достаточно открыть страницу и найти соответствующий элемент по F12, кликнуть правой кнопкой мыши и скопировать xpath

Затем найдите его в коде:

from selenium import webdriver

# 加载 Edge 驱动
driver = webdriver.ChromiumEdge()
# 设置最大窗口化
driver.maximize_window()
# 打开百度网页
driver.get("http://www.baidu.com")

driver.find_element_by_xpath("//*[@id='kw']").send_keys("菜农曰")

4) Работа элемента

Конечно, то, что мы хотим сделать, это не просто выбор элементов, а операции после выбора элементов.На самом деле мы выполнили две операции в приведенной выше демонстрации.click()а такжеsend_keys("value"), здесь продолжайте вводить несколько других операций~

имя метода иллюстрировать
click() щелкните элемент
send_keys("value") Имитировать ввод с клавиатуры
clear() Очистить содержимое элемента, например поля ввода
submit() представить форму
text Получить текстовое содержимое элемента
is_displayed Проверить, виден ли элемент

После прочтения возникает ощущение дежа вю, не это ли основная операция js~!

5) Практическая практика

Изучив вышеуказанные операции, мы можем имитировать работу торгового центра Xiaomi Mall, Код выглядит следующим образом:

from selenium import webdriver

item_url = "https://www.mi.com/buy/detail?product_id=10000330"

# 加载 Edge 驱动
driver = webdriver.ChromiumEdge()
# 设置最大窗口化
driver.maximize_window()
# 打开商品购物页
driver.get(item_url)
# 隐式等待 设置 防止网络阻塞页面未及时加载
driver.implicitly_wait(30)

# 选择地址
driver.find_element_by_xpath("//*[@id='app']/div[3]/div/div/div/div[2]/div[2]/div[3]/div/div/div[1]/a").click()
driver.implicitly_wait(10)
# 点击手动选择地址
driver.find_element_by_xpath("//*[@id='stat_e3c9df7196008778']/div[2]/div[2]/div/div/div/div/div/div/div["
                             "1]/div/div/div[2]/span[1]").click()
# 选择福建
driver.find_element_by_xpath("//*[@id='stat_e3c9df7196008778']/div[2]/div[2]/div/div/div/div/div/div/div/div/div/div["
                             "1]/div[2]/span[13]").click()
driver.implicitly_wait(10)
# 选择市
driver.find_element_by_xpath("//*[@id='stat_e3c9df7196008778']/div[2]/div[2]/div/div/div/div/div/div/div/div/div/div["
                             "1]/div[2]/span[1]").click()
driver.implicitly_wait(10)
# 选择区
driver.find_element_by_xpath("//*[@id='stat_e3c9df7196008778']/div[2]/div[2]/div/div/div/div/div/div/div/div/div/div["
                             "1]/div[2]/span[1]").click()
driver.implicitly_wait(10)
# 选择街道
driver.find_element_by_xpath("//*[@id='stat_e3c9df7196008778']/div[2]/div[2]/div/div/div/div/div/div/div/div/div/div["
                             "1]/div[2]/span[1]").click()
driver.implicitly_wait(20)

# 点击加入购物车
driver.find_element_by_class_name("sale-btn").click()
driver.implicitly_wait(20)

# 点击去购物车结算
driver.find_element_by_xpath("//*[@id='app']/div[2]/div/div[1]/div[2]/a[2]").click()
driver.implicitly_wait(20)

# 点击去结算
driver.find_element_by_xpath("//*[@id='app']/div[2]/div/div/div/div[1]/div[4]/span/a").click()
driver.implicitly_wait(20)

# 点击同意协议
driver.find_element_by_xpath("//*[@id='stat_e3c9df7196008778']/div[2]/div[2]/div/div/div/div[3]/button[1]").click()

Эффект следующий:

Это практика наших результатов обучения.Конечно, если вы столкнулись со спайком, вы также можете написать скрипт для тренировки своих рук~:boom: , если нет запаса, мы можем добавить одинwhileЦикл опроса для доступа!

Во-вторых, тест на рептилий

Выше мы реализовали, как использоватьSeleniumЧтобы добиться автоматизированного тестирования, использование должно быть законным ~ Далее мы покажем еще одну мощную функцию Python, которая заключается в использовании爬虫

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

1) Загрузчик страниц

Уже предоставлено в стандартной библиотеке Python:urllib,urllib2,httplibЖду модули для http запросов, но апи не простой и не элегантный~, требует много работы, и охват различных методов для выполнения простейших задач, конечно, это непосильно для программистов, а разработка героев со всех сторон Помимо множества полезных сторонних библиотек для использования~

  • request

request — это http-библиотека на основе python, использующая лицензию apache2.Он хорошо инкапсулирован на основе встроенных модулей python, чтобы пользователям было проще выполнять все операции, которые браузеры могут выполнять при выполнении сетевых запросов~

  • scrapy

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

2) Анализатор страниц

  • BeautifulSoup

BeautifulSoup — это модуль, который получает строку HTML или XML, форматирует ее, а затем использует предоставляемые им методы для быстрого поиска указанного элемента, упрощая поиск указанного элемента в HTML или XML Simple.

  • scrapy.Selector

Селектор основан на парселе, относительно продвинутом пакете, который выбирает определенную часть файла HTML с помощью определенного выражения XPath или CSS. Он построен на основе библиотеки lxml, а это значит, что они очень похожи по скорости и точности парсинга.

Для конкретного использования см.Скрап-документация, довольно подробно

3) Хранение данных

Когда мы спускаемся по контенту, нам нужен соответствующий источник хранения для хранения в это время

Конкретные операции с базой данных будут представлены в последующих сообщениях блога о веб-разработке~

  • текстовый текст

Общие операции с файлом файл

  • sqlite3

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

  • mysql

Не надо особо представлять, я все понимаю, я давний любитель веб-разработок

4) Практическая практика

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

Мы можем просто разделить его на 4 шага:

  • Получить данные html на основе заданного URL-адреса
  • Разобрать html, чтобы получить целевые данные
  • Хранение данных

Конечно, все это должно быть основано на вашем понимании простого синтаксиса python и основных операций html~

Далее мы используемrequest + BeautifulSoup + textКомбинация рабочих упражнений, предполагая, что мы хотим просканировать содержимое учебника по python г-на Ляо Сюэфэна ~

# 导入requests库
import requests
# 导入文件操作库
import codecs
import os
from bs4 import BeautifulSoup
import sys
import json
import numpy as np
import importlib

importlib.reload(sys)

# 给请求指定一个请求头来模拟chrome浏览器
global headers
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36'}
server = 'https://www.liaoxuefeng.com/'
# 廖雪峰python教程地址
book = 'https://www.liaoxuefeng.com/wiki/1016959663602400'
# 定义存储位置
global save_path
save_path = 'D:/books/python'
if os.path.exists(save_path) is False:
    os.makedirs(save_path)


# 获取章节内容
def get_contents(chapter):
    req = requests.get(url=chapter, headers=headers)
    html = req.content
    html_doc = str(html, 'utf8')
    bf = BeautifulSoup(html_doc, 'html.parser')
    texts = bf.find_all(class_="x-wiki-content")
    # 获取div标签id属性content的内容 \xa0 是不间断空白符  
    content = texts[0].text.replace('\xa0' * 4, '\n')
    return content


# 写入文件
def write_txt(chapter, content, code):
    with codecs.open(chapter, 'a', encoding=code)as f:
        f.write(content)


# 主方法
def main():
    res = requests.get(book, headers=headers)
    html = res.content
    html_doc = str(html, 'utf8')
    # HTML解析
    soup = BeautifulSoup(html_doc, 'html.parser')
    # 获取所有的章节
    a = soup.find('div', id='1016959663602400').find_all('a')
    print('总篇数: %d ' % len(a))
    for each in a:
        try:
            chapter = server + each.get('href')
            content = get_contents(chapter)
            chapter = save_path + "/" + each.string.replace("?", "") + ".txt"
            write_txt(chapter, content, 'utf8')
        except Exception as e:
            print(e)


if __name__ == '__main__':
    main()

Когда мы запускаем программу, мы можемD:/books/pythonСм. учебный контент, который мы просканировали, на месте!

Таким образом, мы просто реализовали краулер, но краулер должен быть осторожен~!

Наша статья имеет два измерения自动化测试а также爬虫Я знаю, как использовать Python, надеюсь, это пробудит ваш интерес~

Не болтай пустых разговоров, не ленись, готовь еду с гарнирами吹着牛X做架构Давайте станем программистом ~ нажмите на внимание, чтобы стать компаньоном, чтобы Сяокай больше не был одинок. Увидимся ниже!

看完不赞,都是坏蛋

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

Я Сяо Цай, человек, который становится сильнее с тобой. 💋

Официальный аккаунт WeChat открыт,Говорят овощеводы, студенты, которые не обратили внимания, не забудьте обратить внимание!