3
votes

Impossible de passer des cookies entre le sélénium et les requêtes afin de faire le grattage en utilisant ce dernier

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?


2 commentaires

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.


3 Réponses :


1
votes

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)


2 commentaires

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



0
votes

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 .


0 commentaires

3
votes

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)


3 commentaires

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é?