Очистка сайта с помощью python3.6. Я не могу пройти мимо страницы входа
HTML-код формы для сайта:
<form class="m-t" role="form" method="POST" action="">
<div class="form-group text-left">
<label for="username">Username:</label>
<input type="text" class="form-control" id="username" name="username" placeholder="" autocomplete="off" required />
</div>
<div class="form-group text-left">
<label for="password">Password:</label>
<input type="password" class="form-control" id="pass" name="pass" placeholder="" autocomplete="off" required />
</div>
<input type="hidden" name="token" value="/bGbw4NKFT+Yk11t1bgXYg48G68oUeXcb9N4rQ6cEzE=">
<button type="submit" name="submit" class="btn btn-primary block full-width m-b">Login</button>
Пока все достаточно просто. В прошлом я без проблем просматривал несколько сайтов.
Я пробовал: селен, механизировать (хотя пришлось вернуться к более ранней версии Python), механическое соединение, запросы.
Я прочитал: несколько постов здесь на SO, а также: https://kazuar.github.io/scraping-tutorial/ http://docs.python-requests.org/en/latest/user/advanced/ и многое, многое другое.
Образец кода:
import requests
from lxml import html
session_requests = requests.session()
result = session_requests.get(url)
tree = html.fromstring(result.text)
authenticity_token = list(set(tree.xpath("//input[@name='token']/@value")))[0]
result = session_requests.post(
url,
data = payload,
headers = dict(referer=url)
)
result = session_requests.get(url3)
print(result.text)
а также
import mechanicalsoup
import requests
from http import cookiejar
c = cookiejar.CookieJar()
s = requests.Session()
s.cookies = c
browser = mechanicalsoup.Browser(session=s)
login_page = browser.get(url)
login_form = login_page.soup.find('form', {'method':'POST'})
login_form.find('input', {'name': 'username'})['value'] = username
login_form.find('input', {'name': 'pass'})['value'] = password
response = browser.submit(login_form, login_page.url)
Попробуйте, как я мог, я просто не могу вернуть ничего, кроме HTML-кода для страницы входа в систему, и я не знаю, где искать дальше, чтобы на самом деле выяснить, что не происходит и почему.
url = переменная, которая содержит URL страницы входа, url3 = страницу, которую я хочу очистить.
Любая помощь приветствуется!
2 ответа
Вы пробовали заголовки?
Сначала попробуйте в браузере и посмотрите, какие заголовки требуются, и отправьте заголовки в запросах. Заголовки являются важной частью для идентификации пользователя или клиента.
Попробуйте с другого IP, может быть кто-то смотрит запрошенный Ip.
Попробуйте этот пример. Здесь я использую селен и хром-драйвер. Сначала я получаю файл cookie от селена и сохраняю его в файле для дальнейшего использования, а затем использую запросы с сохраненным файлом cookie для доступа к страницам, требующим входа в систему.
from selenium import webdriver
import os
import demjson
# download chromedriver from given location and put at some accessible location and set path
# utl to download chrome driver - https://chromedriver.storage.googleapis.com/index.html?path=2.27/
chrompathforselenium = "/path/chromedriver"
os.environ["webdriver.chrome.driver"]=chrompathforselenium
driver=webdriver.Chrome(executable_path=chrompathforselenium)
driver.set_window_size(1120, 550)
driver.get(url1)
driver.find_element_by_name("username").send_keys(username)
driver.find_element_by_name("pass").send_keys(password)
# you need to find how to access button on the basis of class attribute
# here I am doing on the basis of ID
driver.find_element_by_id("btnid").click()
# set your accessible cookiepath here.
cookiepath = ""
cookies=driver.get_cookies()
getCookies=open(cookiepath, "w+")
getCookies.write(demjson.encode(cookies))
getCookies.close()
readCookie = open(cookiepath, 'r')
cookieString = readCookie.read()
cookie = demjson.decode(cookieString)
headers = {}
# write all the headers
headers.update({"key":"value"})
response = requests.get(url3, headers=headers, cookies=cookie)
# check your response
Это код, который работал:
from selenium import webdriver
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities
import demjson
import requests
capabilities = DesiredCapabilities.FIREFOX.copy()
import os
os.chdir('C:\\...') #chdir to the dir with geckodriver.exe in it
driver = webdriver.Firefox(capabilities=capabilities, firefox_binary='C:\\Program Files\\Mozilla Firefox\\firefox.exe')
username = '...'
password = '...'
url = 'https://.../login.php' #login url
url2 = '...' #1st page you want to scrape
driver.get(url)
driver.find_element_by_name("usr").send_keys(username)
driver.find_element_by_name("pwd").send_keys(password)
driver.find_element_by_name("btn_id").click()
s = requests.session()
for cookie in driver.get_cookies():
c = {cookie['name']: cookie['value']}
s.cookies.update(c)
response = s.get(url2)