Scrapy: Войти с помощью веб-драйвера Selenium, передавать файлы cookie объекту-пауку? - PullRequest
4 голосов
/ 24 февраля 2012

Мне просто интересно, есть ли какой-нибудь разумный способ передать куки аутентификации из экземпляра webdriver.Firefox () в самого паука?Было бы полезно выполнить какую-то работу с веб-драйверами, а затем заняться поиском "дела как обычно".Что-то с эффектом:

def __init__(self):
    BaseSpider.__init__(self)
    self.selenium = webdriver.Firefox()

def __del__(self):
    self.selenium.quit()
    print self.verificationErrors

def parse(self, response):

    # Initialize the webdriver, get login page
    sel = self.selenium
    sel.get(response.url)
    sleep(3)

    ##### Transfer (sel) cookies to (self) and crawl normally??? #####
    ...
    ...

Ответы [ 4 ]

1 голос
/ 19 апреля 2015

Передача печенья из селена в Scrapy Spider

Файл соскоба

from selenium import webdriver
driver=webdriver.Firefox()  
data=driver.get_cookies()
# write to temp file        
with open('cookie.json', 'w') as outputfile:
    json.dump(data, outputfile)
    driver.close()
    outputfile.close()

....

Паук

import os
if os.stat("cookie.json").st_size > 2:
    with open('./cookie.json', 'r') as inputfile:
        self.cookie = json.load(inputfile)
    inputfile.close()
0 голосов
/ 20 октября 2018
driver = webdriver.Chrome()

Затем выполните вход в систему или взаимодействуйте со страницей через браузер.Теперь при использовании сканера в scrapy установите параметр cookie:

request = Request(URL, cookies=driver.get_cookies(), callback=self.mycallback)
0 голосов
/ 30 июня 2016

Это работает с драйвером Chrome, но не с Firefox (протестировано)
см. https://christopher.su/2015/selenium-chromedriver-ubuntu/ для установки.

import scrapy
from scrapy.spiders.init import InitSpider
from scrapy.http import Request
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import pickle


class HybridSpider(InitSpider):
    name = 'hybrid'
    def init_request(self):
        driver = webdriver.Chrome()`

        driver.get('https://example.com')
        driver.find_element_by_id('js-login').click()
        driver.find_element_by_id('email').send_keys('mymail@example.net')
        driver.find_element_by_id('password').send_keys('mypasssword',Keys.ENTER)

        pickle.dump( driver.get_cookies() , open(os.getenv("HOME")+"/my_cookies","wb"))
        cookies = pickle.load(open(os.getenv("HOME")+"/my_cookies", "rb"))
        FH = open(os.getenv("HOME")+"/my_urls", 'r')

        for url in FH.readlines():
            pass
            yield Request(url,cookies=cookies,callback=self.parse)


    def parse(self, response):
        pass

Не пробовал напрямую передавать куки, как

yield Request(url,cookies=driver.get_cookies(),callback=self.parse)

Может работать тоже ..

0 голосов
/ 25 февраля 2012

Вы можете попробовать переопределить BaseSpider.start_requests метод для прикрепления к начальным запросам необходимых файлов cookie с помощью scrapy.http.cookies.CookieJar.

См. Также: Scrapy - как сделатьуправлять куки / сессиями

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...