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.