Использование Selenium для входа в Gmail / сохранения файлов cookie, а затем использования запросов - PullRequest
0 голосов
/ 28 декабря 2018

Я пытаюсь войти в Gmail с помощью Selenium, а затем с помощью запросов (или aiohttp) выполнять поиск в Google.

До этого я использовал чистый Selenium для входа в систему и поиска, смотрел YouTube и т. Д. Однако недавно я начал спрашивать, могу ли я использовать чистые запросы для входа в Gmail.Мне сказали, что это было чрезвычайно сложно из-за большого количества используемого JavaScript.Поэтому я подумал о новом способе (использование Selenium для входа в систему, а затем перейти к использованию запросов) и хотел посмотреть, будет ли он работать.

driver = webdriver.Chrome()
driver.get("https://accounts.google.com/signin")
email_phone = driver.find_element_by_xpath("//input[@id='identifierId']")
email_phone.send_keys("your_emailid_phone")
driver.find_element_by_id("identifierNext").click()
password = WebDriverWait(driver, 5).until(
EC.element_to_be_clickable((By.XPATH, "//input[@name='password']")))
password.send_keys("your_password")
driver.find_element_by_id("passwordNext").click()

time.sleep(5)
driver.get("https://google.com")
pickle.dump( driver.get_cookies() , open("cookies.pkl","wb"))



session = requests.session()
with open('cookies.pkl', 'rb') as f:
    session.cookies.update(pickle.load(f))
    session.get("https://youtube.com") 

Нет ошибок при запуске этого кода.Тем не менее, я был обеспокоен тем, будет ли этот подход работать.Если я загружу файлы cookie, которые были там, когда я вошел в Gmail (используя Selenium), все мои действия отразятся на моем Gmail (мое намерение).

1 Ответ

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

Если вы настаиваете на использовании selenium, вы должны знать, что

  1. password не должно быть WebDriverWait(driver, ....WebDriverWait(driver, ... не вернет ничего полезного для вас в этом случае.Также возникает ошибка, когда не удается найти конкретный элемент в течение определенного времени.
  2. Вы должны сохранить cookie-файл и срок его действия вместе, чтобы вы могли получить новый файл снова, когда он вам действительно нужен
  3. BeТщательный вопрос домена.В вашем случае вы наконец получаете доступ к основному сайту Google, что означает, что если вы используете driver.get_cookies() после этого, вы не сможете получить файлы cookie, принадлежащие https://myaccount.google.com/

Полный код

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import time
import pickle

def save_cookies():
    email = "@gmail.com"
    password = ""

    driver = webdriver.Chrome()
    driver.get("https://accounts.google.com/signin")
    email_phone = driver.find_element_by_xpath("//input[@id='identifierId']")
    email_phone.send_keys(email)
    driver.find_element_by_id("identifierNext").click()
    WebDriverWait(driver, 5).until(EC.element_to_be_clickable((By.XPATH, "//input[@name='password']")))
    password = driver.find_element_by_xpath("//input[@name='password']")
    password.send_keys(password)
    driver.find_element_by_id("passwordNext").click()
    time.sleep(5)

    google_cookies = driver.get_cookies()
    cookies = ({cookie.get("name"):cookie.get("value") for cookie in google_cookies}, google_cookies[0].get("expiry"))

    with open("cookies.pkl","wb") as fd:
        pickle.dump(cookies, fd)

    return cookies


import requests

with requests.Session() as s:
    with open("cookies.pkl","rb") as fd:
        cookies, expiry = pickle.load(fd)
        if expiry < time.time():
            cookies, expiry = save_cookies()
    headers = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36",
        "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8",
        "Referer": "https://www.google.com/",
        "Accept-Encoding": "deflate",
        "Accept-Language": "en;q=0.6",
        }

    resp = s.get("https://myaccount.google.com/"
        ,headers=headers,cookies=cookies)
    print(resp.url)
...