Вход с помощью Mechanize - PullRequest
       20

Вход с помощью Mechanize

0 голосов
/ 19 декабря 2018

Я пытаюсь извлечь некоторые данные с веб-сайта - не много - но достаточно, чтобы оправдать небольшой сценарий ... Я пытаюсь сначала войти на сайт https://squashlevels.com, используя mechanize и cookielib, но у меня не получается ...

В настоящее время у меня есть

from bs4 import BeautifulSoup
import requests
import re
import urllib2 
import cookielib
import mechanize

cj = cookielib.CookieJar()
br = mechanize.Browser()

br.set_cookiejar(cj)
br.open("https://squashlevels.com/menu_login.php")

# How do I log in?

r = requests.get('https://squashlevels.com/players.php?all&club=1314')
soup = BeautifulSoup(r.content, "html.parser")

## Do stuff...

Какой код я должен использовать для входа на этот сайт?

Спасибо за ваше время.

Ответы [ 3 ]

0 голосов
/ 19 декабря 2018

Вот решение, использующее просто requests, я не уверен, что mechanize предоставит какое-либо дополнительное значение.Используя requests.Session, вы сохраняете cookie-файлы, возвращаемые процессом входа в систему, чтобы включить их при запросе players.php.

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

email = 'user@host.com'
password = 'secret'

s = requests.Session()
s.post('https://squashlevels.com/menu_login.php', data={
    'action': 'login',
    'email': email,
    'password': password,
    'md5password': hashlib.md5(password.encode('utf-8')).hexdigest()
})

r = s.get('https://squashlevels.com/players.php?all&club=1314')
soup = BeautifulSoup(r.content, 'html.parser')

for row in soup.select('table.ranking tr'):
    print([col.text.strip() for col in row.select('td')])

Вывод:

['1', 'Nathan Miller', 'Bluecoat Sports Horsham', 'East England Masters 2018/19', '6', '15 Dec 2018', '4,706', '70%', '']
['2', 'Kit Pearman', 'Dorking', 'Surrey Winter League 2018/19', '2', '20 Nov 2018', '4,469', '64%', '']
['3', 'Simon Millard', 'Bluecoat Sports Horsham', 'Sussex Mens League 2018/2019', '1', '04 Dec 2018', '2,680', '57%', '']
...
0 голосов
/ 20 декабря 2018

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

<form action="menu_login.php" method="POST" class="login" data-op-form-id="1"></form>

это приводит к mechanize обнаружению 0 "элементов управления" внутри формы входа в систему .

Поведение кнопки отправки контролируется через JavaScript.

0 голосов
/ 19 декабря 2018

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

from selenium import webdriver
import bs4 

email = 'username@email.com'
password = 'password'

driver = webdriver.Chrome()
driver.get('https://squashlevels.com/menu_login.php')

# log in
driver.find_element_by_name("email").send_keys(email)
driver.find_element_by_name("password").send_keys(password)
driver.find_element_by_css_selector("input[type='submit'][value='Login']").click()

# get the html then do some stuff
html = driver.page_source
soup = bs4.BeautifulSoup(html,'html.parser')
...