Python crawler_Selenium и PhantomJS: начало работы

Python

Поисковый робот Python_Selenium и PhantomJS

Selenium

Selenium — это инструмент автоматического тестирования для Интернета, изначально разработанный для автоматического тестирования веб-сайтов. Тип похож на мастер кнопок, который мы используем для игр, который может быть автоматизирован в соответствии с указанными командами.Разница в том, что Selenium может работать непосредственно в браузере и поддерживает все основные браузеры (включая PhantomJS, которые не являются интерфейсными браузерами). ).

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

Selenium не имеет собственного браузера и не поддерживает функции браузера. Для использования его необходимо объединить со сторонним браузером. Но иногда нам нужно заставить его работать в коде, поэтому мы используем инструмент с PhantomJS вместо настоящего браузера.

Библиотеку Selenium можно загрузить с веб-сайта PyPI.Кожаные куртки.Python.org/simple/vulgar…, вы также можете использовать команду pip стороннего менеджера для установки:pip install seleniumОфициальная справочная документация Selenium:selenium-python.readthedocs.io/index.html

PhantomJS

PhantomJS — это «безголовый» браузер на основе Webkit, который загружает веб-сайт в память и выполняет JavaScript на странице, который работает более эффективно, чем полноценный браузер, поскольку не отображает графический интерфейс.

Если мы объединим Selenium и PhantomJS, мы сможем запустить очень мощный поисковый робот, который может обрабатывать JavaScript, файлы cookie, заголовки и все остальное, что нужно нашим реальным пользователям.

Примечание. Доступ к PhantomJS возможен только с его веб-сайта (http://phantomjs.org/download.html)скачать. Поскольку PhantomJS — это полнофункциональный (хотя и без интерфейса) браузер, а не библиотека Python, его не нужно устанавливать, как другие библиотеки Python, но мы можем вызвать PhantomJS через Selenium, чтобы использовать его напрямую. Официальный тестовый документ PhantomsJS:http://phantomjs.org/documention

Быстрый старт

В библиотеке Selenium есть API под названием WebDriver. WebDriver может управлять работой браузера, его можно использовать подобно BeautifulSoup или другим объектам Selector для поиска элементов страницы, взаимодействия с элементами на странице (отправка текста, щелчок и т. д.) и выполнения других действий для запуска поисковых роботов. .

#-*- coding:utf-8 -*-

# 主要用来测试Selenium 使用PhantomJS

#导入webdriver
from selenium import webdriver
import time

# 想要调用键盘按键操作需要导入keys包
from selenium.webdriver.common.keys import Keys

# 调用环境变量指定的PhantomJS浏览器创建浏览器对象。
driver = webdriver.PhantomJS()
driver.set_window_size(1366,768)

#如果没有在环境变量指定PhantomJS位置
# driver = webdriver.PhantomJS(execute_path = "./phantomjs.exe")

# get方法会一直等到页面加载,然后才会继续执行程序,通常测试会在这里选择time.sleep(2)

driver.get("http://www.baidu.com/")

# 获取页面名为wrapper的id标签的文本内容
data = driver.find_element_by_id('wrapper').text

print(data)

print(driver.title)

# 生成页面快照并保存
driver.save_screenshot("baidu.png")

# id="kw" 是百度搜索输入框,输入字符串 "长城"
driver.find_element_by_id('kw').send_keys('长城')

# id="su"是百度搜索按钮,click()是模拟点击
driver.find_element_by_id('su').click()

#获取新的页面快照
driver.save_screenshot("长城.png")
#打印网页渲染后的源代码
print(driver.page_source)

# 获取当前页面的Cookie
print(driver.get_cookies())

# ctrl + a 全选输入框内容
driver.find_element_by_id('kw').send_keys(Keys.CONTROL,'a')
#ctrl+x剪切输入框内容
driver.find_element_by_id('kw').send_keys(Keys.CONTROL, 'x')

#输入框重新输入内容
driver.find_element_by_id('kw').send_keys('itcast')

#模拟Enter回车键
driver.find_element_by_id('su').send_keys(Keys.RETURN)
time.sleep(5)

#生成新的页面快照
driver.save_screenshot('itcast.png')

#获取当前url
print(driver.current_url)

driver.quit()

манипулирование страницей

Selenium WebDriver предоставляет различные методы поиска элементов, предполагая, что ниже есть поле ввода формы:

<input type="text" name="user-name" id="passwd-id" />
#获取id标签值
element = driver.find_element_by_id("passwd-id")
#获取name值
element = driver.find_element_by_name("user-name")
#获取标签名
element = driver.find_element_by_tag("input")
#也可以通过XPath来匹配
element = driver.find_element_by_xpath(//input[@id="passwd-id"])

Расположение элементов пользовательского интерфейса (WebElements)

Что касается выбора элементов, существуют следующие API для выбора одного элемента.

find_element_by_id
find_element_by_name
find_element_by_xpath
find_element_by_link_text
find_element_by_partial_link_text
find_eelement_by_tag_name
find_element_by_class_name
find_element_by_css_selector

1.By ID

<div id="coolesWidgeEvah">...</div>

выполнить

element = driver.find_element_by_id("coolesWidgetEvah")

---------or-------

from selenium.webdriver.common.by import By
element = driver.find_element(by=By.ID, value="coolesWidgetEvah")

2.By Class Name

<div class="cheese"><span>Cheddar</span></div><div class="cheese"><span>Gouda</span></div>

выполнить

cheese = driver.find_element_by_class_name('cheese')

----------------or--------------------

from selenium.webdriver.common.by import By
cheese = driver.find_elements(By.CLASS_NAME, "cheese")

3.By Tag Name

<iframe src="..."></iframe>

выполнить

frame = driver.find_element_by_tag_name("iframe")
------------------------or---------------
from selenium.webdriver.common.by import By
frame = driver.find_element(By.TAG_NAME, "iframe")

4.By Name

<imput name="cheese" type="text" />

выполнить

cheese = driver.find_element_by_name("cheese")
-------------or-------------------------
from selenium.webdrier.common.by import By
cheese = driver.find_element(By.NAME, "cheese")

5.By Link Text

<a href="http://www.google.com/search?q=cheese">cheese</a>

выполнить

cheese = driver.find_element_by_link_text("cheese")
---------------------or-----------------------
from selenium.webdriver.common.by import By
cheese = driver.find_element(By.LINK_TEXT, "cheese")

6.By Partial Link Text

<a href="http://www.google.com/search?q=cheese">search for cheese</a>

выполнить

cheese = driver.find_element_by_partial_link_text("cheese")
-----------------or-----------------
from selenium.webdriver.common.by import By
cheese = driver.find_element(By.PARTIAL_LINK_TEXT, "cheese")

7.By CSS

<div id="food"><span class="dairy">milk</span><span class="dairy">cheese</span></div>
cheese = driver.find_element_by_css_selector("#food span.dairy.aged")
----------------or-------------------------------
from selenium.webdriver.common.by import By
cheese = driver.find_element(By.CSS_SELECTOR, "#food span.dairy.aged")

8.By XPath

<input type="text" name="example" / >
<input type="text" name="other" / >

выполнить

inputs = driver.find_elements_by_xpath("input")
-------------------or------------------
from selenium.webdriver.common.by import By
inputs = driver.find_elements(By.XPATH, "//input")

цепочка действий мыши

Иногда нам нужно имитировать некоторые операции мыши на странице, такие как двойной щелчок, щелчок правой кнопкой мыши, перетаскивание и даже удерживание и т. д. Мы можем сделать это, импортировав класс ActionChains.

Пример

#导入ActionChains类
from selenium.webdrive import ActionChains

#鼠标移动到ac位置
ac = driver.find_elenemt_by_xpath('element')
ActionChains(driver).move_to_element(ac).perform()

#在ac位置单击
ac = driver.find_element_by_xpath('elementA')
ActionChains(driver).move_to_element(ac).click(ac).perform()

#在ac位置双击
ac = driver.find_element_by_xpath("elementB")
ActionChains(driver).move_to_element(ac).double_click(ac).perform()

#在ac位置右击
ac = driver.find_element_by_xpath('elementC')
ActionChains(driver).move_to_element(ac).context_click(ac).perform()

#在ac位置左键单击hold住
ac = driver.find_element_by_xpath('elementF')
ActionChains(driver).move_to_element(ac).click_and_hold(ac).perform()

#将ac1拖拽到ac2位置
ac1 = driver.find_element_by_xpath('elementD')
ac2 = driver.find_element_by_xpath('elementE')
ActionChains(driver).drag_and_drop(ac1, ac2).perform()

заполните форму

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

<select id="status" class="form-control valid" onchange="" name = 'status'>
    <option value=""></option>
    <option value="0">未审核</option>
    <option value="1">初审通过</option>
    <option value="2">复审通过</option>
    <option value="3">审核不通过</option>
</select>

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

#导入Select类
from selenium.webdriver.support.ui import Select

#找到name的选项卡
select = Select(driver.find_element_by_id('status'))

#s
select.select_by_index(1)
select.select_by_value("0")
select.select_by_visible_text(u'未审核')

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

  • индекс индекс начинается с 0
  • значение — это значение атрибута тега параметра, а не значение, отображаемое в раскрывающемся списке.
  • visible_text на самом деле является значением текста метки опции, которое является значением, отображаемым в раскрывающемся списке.

Что, если я отменю их все?

select.deselect_all()

Обработка всплывающих окон

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

alert = driver.switch_to_alert()

переключение страниц

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

driver.switch_to_window('this is window name')

Вы также можете использовать метод window_handles, чтобы получить объект дескриптора для каждого окна. Например:

for handle in driver.window_handles:
    driver.switch_to_window(handle)

Страница вперед и назад

Для управления функциями перемотки страницы вперед и назад:

driver.forward()  #前进
driver.back()    #后退

Cookies

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

for cookie in driver.get_cookies():
    print("%s -> %s"%(cookie['name'], cookie['value']))

Чтобы удалить файлы cookie, используйте следующее:


#By name
driver.delete_cookie('CookieName')

#all
driver.delete_all_cookies()

страница ожидания

ПРИМЕЧАНИЕ. Это очень важная часть!

Современные веб-страницы все чаще используют технологию Ajax, поэтому программа не может определить, когда элемент полностью загружен. Если фактическая страница слишком долго ожидает события для экспорта элемента dom, но ваш код использует этот WebElement напрямую, будет выдано исключение NullPointer. Чтобы избежать этой трудности с позиционированием элемента и увеличить вероятность ElementNotVisibleException. Таким образом, Selenium предоставляет два метода ожидания: один — неявное ожидание, а другой — явное ожидание. Неявное ожидание — это ожидание в течение определенного периода времени, а явное ожидание — указание условия для продолжения выполнения до тех пор, пока условие не будет выполнено.

явное ожидание

Отображение ожидания задает условие, а затем устанавливает самое длинное событие ожидания. Если в это время элемент не найден, будет выдано исключение.


from selenium import webdriver
from selenium.webdriver.common.by import By

#WebDriverWait库,负责循环等待
from selenium.webdriver.support.ui import WebDriverWait
#expected_conditions类,负责条件触发
from selenium.webdriver.support import expected_conditions as EC

driver = webdriver.Chrome()

driver.get("http://www.xxxx.com/loading")

try:
    #页面一直循环,知道id="myDynamicElement"出现
    element = WebDriverWait(driver, 10).until(
            EC.presence_of_element_located((By.ID, "myDynamicElement"))
        )
finally:
    driver.quit()    

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

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

    title_is
    title_contains
    presence_of_element_located
    visibility_of_element_located
    visibility_of
    presence_of_all_elements_located
    text_to_be_present_in_element
    text_to_be_present_in_element_value
    frame_to_be_available_and_switch_to_it
    invisibility_of_element_located
    element_to_be_clickable - it is Displayed and Enabled
    staleness_of
    element_to_be_selected
    element_located_to_be_selected
    element_selection_state_to_be
    element_located_selection_state_to_be
    aert_is_present

неявное ожидание

Неявное ожидание относительно просто, то есть просто установите время ожидания в секундах.

from selenium import webdriver

driver = webdriver.Chrome()
driver.implicitly_wait(10)  #seconds

driver.get("http://www.xxxxx.com/loading")

myDynamicElement = driver.find_element_by_id("myDynamicElement")

Если не установлено, время ожидания по умолчанию равно 0.