J'ai écrit un script en python en combinaison avec du sélénium pour me connecter à un site, puis transférer les cookies du driver vers les requêtes afin que je puisse continuer en utilisant demande de faire d'autres activités.
J'ai utilisé item = soup.select_one ("div [class ^ = 'gravatar-wrapper -']"). get ("title") code> cette ligne pour vérifier si le script peut récupérer mon nom d'utilisateur lorsque tout est terminé.
Voici mon essai jusqu'à présent:
import requests
from bs4 import BeautifulSoup
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
url = "https://stackoverflow.com/users/login"
driver = webdriver.Chrome()
driver.get(url)
driver.find_element_by_css_selector("#email").send_keys("your_username")
driver.find_element_by_css_selector("#password").send_keys("your_password")
driver.find_element_by_css_selector("#submit-button").click()
driver_cookies = driver.get_cookies()
c = {c['name']:c['value'] for c in driver_cookies}
res = requests.get(driver.current_url,cookies=c)
soup = BeautifulSoup(res.text,"lxml")
item = soup.select_one("div[class^='gravatar-wrapper-']").get("title")
print(item)
driver.quit()
Quand je cours mon script, il ne trouve pas le nom d'utilisateur et donne None comme sortie.
Comment puis-je passer des cookies entre les requêtes sélénium et code > pour faire le scraping à l'aide de requêtes après m'être connecté en utilisant du sélénium?
3 Réponses :
Dans mon cas, cela m'a aidé à nous faire savoir si cela fonctionne dans votre cas.
import requests
from selenium import webdriver
driver = webdriver.Firefox()
url = "some_url" #a redirect to a login page occurs
driver.get(url)
#storing the cookies generated by the browser
request_cookies_browser = driver.get_cookies()
#making a persistent connection using the requests library
params = {'os_username':'username', 'os_password':'password'}
s = requests.Session()
#passing the cookies generated from the browser to the session
c = [s.cookies.set(c['name'], c['value']) for c in request_cookies_browser]
resp = s.post(url, params) #I get a 200 status_code
#passing the cookie of the response to the browser
dict_resp_cookies = resp.cookies.get_dict()
response_cookies_browser = [{'name':name, 'value':value} for name, value in dict_resp_cookies.items()]
c = [driver.add_cookie(c) for c in response_cookies_browser]
#the browser now contains the cookies generated from the authentication
driver.get(url)
Vous venez de faire le contraire @akshay patil. Je voulais me connecter en utilisant du sélénium, puis faire le reste en utilisant des requêtes. Merci.
car avant de vous connecter, vous devez passer des cookies, vous ne pouvez pas le faire après les mots car il doit être passé avant sinon dans les cookies
Essayez d'utiliser selenium-requests .
Étend les classes Selenium WebDriver pour inclure la fonction de requête à partir de la bibliothèque de requêtes, tout en effectuant tous les cookies nécessaires et Gestion des en-têtes de demande .
Vous êtes déjà sur la bonne voie. Il ne vous reste plus qu'à faire attendre un peu le script pour que les cookies se chargent. Voici comment obtenir la réponse:
import time
import requests
from bs4 import BeautifulSoup
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
url = "https://stackoverflow.com/users/login"
with webdriver.Chrome() as driver:
driver.get(url)
driver.find_element_by_css_selector("#email").send_keys("your_username")
driver.find_element_by_css_selector("#password").send_keys("your_password")
driver.find_element_by_css_selector("#submit-button").click()
time.sleep(5) #This is the fix
driver_cookies = driver.get_cookies()
c = {c['name']:c['value'] for c in driver_cookies}
res = requests.get(driver.current_url,cookies=c)
soup = BeautifulSoup(res.text,"lxml")
item = soup.select_one("div[class^='gravatar-wrapper-']").get("title")
print(item)
utilisez des attentes explicites plutôt que time.sleep ()
Explicit Wait est certainement la voie à suivre. Cependant, j'ai juste essayé de montrer que cela fonctionne sans rien changer. Merci pour votre suggestion @Corey Goldberg.
Lorsque je fais cela et que je modifie manuellement les cookies, par ex. en appuyant sur Je consens à un formulaire de consentement, les demandes ne le reflètent pas, c'est comme si Il n'incluait pas les cookies, une idée de ce qui pourrait être erroné?
Vous devez utiliser requests.session () et vous connecter avec cela. C'est beaucoup plus simple que ce que vous faites.
Je sais mais c'est ce qui est exigé en ce moment @pguardiario. Merci.