Соскоб сайт с логином

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

browser = webdriver.Chrome('E:/Shared Folders/Users/runnerjp/chromedriver/chromedriver.exe')
browser.get("https://www.timeform.com/horse-racing/account/sign-in?returnUrl=%2Fhorse-racing%2F") 
time.sleep(3)
username = browser.find_element_by_id("EmailAddress")
password = browser.find_element_by_id("Password")
username.send_keys("usr")
password.send_keys("pass")
login_attempt = browser.find_element_by_xpath("//input[@type='submit']")
time.sleep(3)
login_attempt.submit()

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

9 ответов

Все ответы здесь имеют свои преимущества, но это зависит от типа очищаемого веб-сайта и способа аутентификации при входе.
Если веб-страница генерирует часть или весь свой контент с помощью запросов javascript/ajax и т. Д., То использование selenium - единственный путь, так как это позволяет выполнять javascript. Однако, чтобы свести использование процессора к минимуму, вы можете использовать "безголовый" браузер, такой как phantomjs. phantomjs использует тот же механизм html и javascript, что и chrome, так что вы можете протестировать свой код с помощью chrome и переключиться в конце.

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

import requests
requests.get('https://api.github.com/user', auth=('user', 'pass'))

как предложено CodeMonkey

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

Использование requests вместо. Вы можете использовать его для входа в систему:

import requests
requests.get('https://api.github.com/user', auth=('user', 'pass'))

Более подробная информация здесь: http://docs.python-requests.org/en/master/user/authentication/

Вы можете использовать TestCafe.

введите описание изображения здесь

TestCafe - это бесплатная платформа с открытым исходным кодом для функционального веб-тестирования (тестирования e2e). TestCafe основан на Node.js и вообще не использует WebDriver.

Тесты на основе TestCafe выполняются на стороне сервера. Для получения DOM-элементов TestCafe предоставляет мощную гибкую систему селекторов. TestCafe может выполнять JavaScript на проверенной веб-странице с помощью функции ClientFunction (см. Нашу документацию).

Тесты TestCafe действительно очень быстрые, убедитесь сами. Но высокоскоростной тестовый прогон не влияет на стабильность благодаря встроенной интеллектуальной системе ожидания.

Установка TestCafe очень проста:

1) Убедитесь, что на вашем компьютере установлен Node.js (или установите его).

2) Чтобы установить TestCafe, откройте cmd и введите:

npm install -g testcafe

Написание теста - это не ракетостроение. Вот быстрый старт: 1) Скопируйте и вставьте следующий код в ваш текстовый редактор и сохраните его как "test.js"

import { Selector } from ‘testcafe’;

fixture `Getting Started`
    .page `http://devexpress.github.io/testcafe/example`;

test(‘My first test’, async t => {
    await t
        .typeText(‘#developer-name’, ‘John Smith’)
        .click(‘#submit-button’)
        .expect(Selector(‘#article-header’).innerText).eql(‘Thank you, John Smith!‘);
});

2) Запустите тестирование в вашем браузере (например, chrome), введя следующую команду в cmd:

testcafe chrome test.js

3) Получить описательный результат в выводе консоли.

TestCafe позволяет тестировать против различных браузеров: локальных, удаленных (на устройствах, будь то браузер для Raspberry Pi или Safari для iOS), облачных (например, Sauce Labs) или безголовых (например, Nightmare). Это означает, что вы можете легко использовать TestCafe со своей инфраструктурой Continious Integration.

You can use the same to scrape data and save to file easily

Я рекомендую вам https://scrapy.org/. Он использует витой под капотом, поэтому он очень эффективен.

Если вам нужно выполнить JavaScript, есть также пакет scrapy-splash: https://github.com/scrapy-plugins/scrapy-splash.

В разделе часто задаваемых вопросов по Scrapy есть специальная страница о страницах входа: https://doc.scrapy.org/en/latest/topics/request-response.html

Другой альтернативой является модуль 'grab':

from grab import Grab

g = Grab()
g.go('https://www.timeform.com/horse-racing/account/sign-in?returnUrl=%2Fhorse-racing%2F')
g.doc.set_input('EmailAddress','some@email.com')
g.doc.set_input('Password','somepass')
g.doc.submit()

print g.doc.body

Использование безголового браузера потребляет значительно меньше ресурсов процессора и памяти, попробуйте PhantomJS настаивать на Chrome. здесь есть хороший пост об использовании PhantomJS с селеном:

https://realpython.com/blog/python/headless-selenium-testing-with-python-and-phantomjs/

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

from mechanize import Browser
import time    #just to check elapsed time and check performance
started_time = time.time()

browser = Browser()
url = 'https://www.timeform.com/horse-racing/account/sign-in?returnUrl=%2Fhorse-racing%2F'
browser.open(url)
browser.select_form(nr = 0)
browser["EmailAddress"] = 'putyouremailhere'
browser["Password"] = 'p4ssw0rd'

logged = browser.submit()
redirected_url = logged.read()
print redirected_url

#you can delete this section:
elapsed_time = time.time() - started_time
print elapsed_time,' seconds'

Я надеюсь, что это помогает!:)

Есть несколько способов сделать это:

  1. если вам действительно нужна вся функциональность Selen (Javascript и т. д.), попробуйте использовать драйвер браузера без монитора (например, ghostdriver), однако, вы не сэкономите столько времени процессора, сколько выбрали бы второй способ (ниже)
  2. вместо селена, который является довольно тяжелым, вы можете использовать некоторые легковесные инструменты, такие как robobrowser (py3), mechanize или browserplus. Таким образом вы можете сэкономить много времени процессора, однако они не поддерживают javascript и не имеют некоторых расширенных функций, которые поддерживает селен.

Да, кроме селена или хрома, и, скорее, я должен сказать, что это не браузер без заголовка, вы должны использовать концепцию http (совершать вызовы по URL).

запросы и модули urllib помогут здесь.

Для этого вам необходимо определить параметры и тип метода. После того, как вы определили, что нужно сделать для вызова URL, вы можете использовать request или urllib. Вы также должны отслеживать, какой ответ вы получите или получите.

Вот хорошая документация для запросов

Пример использования запросов:

Случай: здесь мы отправляем форму, которая имеет 2 поля id и pwd, метод, указанный в форме, это post, а имена, указанные в формах, являются user_id и user_pwd для id и pwd соответственно. При нажатии на кнопку он вызывает "некоторый URL"

dataToSend = {'user_id':'id you want to pass', 'user_pwd':'specify pwd here'}
# Here you can specify headers and cookie, specify if required 
response = requests.post(url, data=dataToSend, headers={'content-type':'specify if required', 'user-agent':'chrome...'})

if(response.status_code == 200):
     contentReceived = response.content
     # Here you need to observe the received content, most of the time content will be in json format, so you need to decode here.
     if(contentReceived == 'Response is same that you have expected'):
          print "Successfully"
     else:
          print "Failed"
else:
     print "Failed"

См. Мои другие ответы о том, как использовать запросы, cookie и селен.

Другие вопросы по тегам