2015-02-09 2 views
3

Я пытаюсь очистить данные со страницы, на которой есть много вызовов AJAX и выполнения javascript для рендеринга веб-страницы. Поэтому я пытаюсь использовать scrapy with selenium для этого. Принцип работы заключается в следующем:Scrapy with selenium для веб-страницы, требующей аутентификации

  1. Добавить страницу Войти URL в список Scrapy start_urls

  2. Используйте СформироватьЗапрос от метода ответа на сообщение имя пользователя и пароль, чтобы получить аутентификацией.

  3. После входа в систему запросите нужную страницу для очистки.
  4. Передайте этот ответ веб-обозревателю Selenium, чтобы щелкнуть по кнопкам на странице.
  5. После нажатия кнопок и создания новой веб-страницы запишите результат.

код, что я до сих пор выглядит следующим образом:

from scrapy.spider import BaseSpider 
from scrapy.http import FormRequest, Request 
from selenium import webdriver 
import time 


class LoginSpider(BaseSpider): 
    name = "sel_spid" 
    start_urls = ["http://www.example.com/login.aspx"] 


    def __init__(self): 
     self.driver = webdriver.Firefox() 


    def parse(self, response): 
     return FormRequest.from_response(response, 
       formdata={'User': 'username', 'Pass': 'password'}, 
       callback=self.check_login_response) 

    def check_login_response(self, response): 
     if "Log Out" in response.body: 
      self.log("Successfully logged in") 
      scrape_url = "http://www.example.com/authen_handler.aspx?SearchString=DWT+%3E%3d+500" 
      yield Request(url=scrape_url, callback=self.parse_page) 
     else: 
      self.log("Bad credentials") 

    def parse_page(self, response): 
     self.driver.get(response.url) 
     next = self.driver.find_element_by_class_name('dxWeb_pNext') 
     next.click() 
     time.sleep(2) 
     # capture the html and store in a file 

2 блокпостов я ударил до сих пор являются:

  1. Шаг 4 не work.Whenever селеном открытым окно firefox, оно всегда находится на экране входа в систему и не знает, как пройти мимо него.

  2. Я не знаю, как достичь шаг 5

Любая помощь будет принята с благодарностью

+1

Теоретически, вы можете передать печенье ответа SCRAPY драйверу с помощью 'add_cookie' методу см: HTTP : //stackoverflow.com/questions/16563073/how-to-pass-scrapy-login-cookies-to-selenium и http://stackoverflow.com/questions/19082248/python-selenium-rc-create-cookie. Хотя, почему бы не войти в систему с помощью 'selenium', как предложил Эрик? Благодарю. – alecxe

+0

Я мог бы это сделать, но я не хочу потерять потрясающий скрученный код, работающий под капотом. Я собираюсь очистить большое количество URL-адресов, как только я пройду проверку подлинности, и надеялся сделать это не блокирующим образом. .Я думаю неправильно? – Amistad

ответ

2

Я не верю, что вы можете переключаться между Scrapy запросов и селена, как это. Вам нужно зайти на сайт, используя селен, а не выполнить Request(). Сеанс регистрации, который вы создали с помощью scrapy, не переносится на сеанс селена. Вот пример (элемент иды/XPath будет отличаться для вас):

scrape_url = "http://www.example.com/authen_handler.aspx" 
    driver.get(scrape_url) 
    time.sleep(2) 
    username = self.driver.find_element_by_id("User") 
    password = self.driver.find_element_by_name("Pass") 
    username.send_keys("your_username") 
    password.send_keys("your_password") 
    self.driver.find_element_by_xpath("//input[@name='commit']").click() 

, то вы можете сделать:

time.sleep(2) 
    next = self.driver.find_element_by_class_name('dxWeb_pNext').click() 
    time.sleep(2) 

т.д.

EDIT: Если вам нужно, чтобы сделать JavaScript и беспокоятся о скорости/неблокировании, вы можете использовать http://splash.readthedocs.org/en/latest/index.html, который должен сделать трюк.

http://splash.readthedocs.org/en/latest/scripting-ref.html#splash-add-cookie имеет подробную информацию о передаче файла cookie, вы должны быть в состоянии передать его из scrapy, но я этого не делал раньше.

+0

большое спасибо sooooooo! Работает как шарм! – rzaaeeff

0

Войти с Scrapy апите первый

# call scrapy post request with after_login as callback 
    return FormRequest.from_response(
     response, 
     # formxpath=formxpath, 
     formdata=formdata, 
     callback=self.browse_files 
    ) 

пройти сеанс драйвер селена хрома

# logged in previously with scrapy api 
def browse_files(self, response): 
    print "browse files for: %s" % (response.url) 

    # response.headers   
    cookie_list2 = response.headers.getlist('Set-Cookie') 
    print cookie_list2 

    self.driver.get(response.url) 
    self.driver.delete_all_cookies() 

    # extract all the cookies 
    for cookie2 in cookie_list2: 
     cookies = map(lambda e: e.strip(), cookie2.split(";")) 

     for cookie in cookies: 
      splitted = cookie.split("=") 
      if len(splitted) == 2: 
       name = splitted[0] 
       value = splitted[1] 
       #for my particular usecase I needed only these values 
       if name == 'csrftoken' or name == 'sessionid': 
        cookie_map = {"name": name, "value": value} 
       else: 
        continue 
      elif len(splitted) == 1: 
       cookie_map = {"name": splitted[0], "value": ''} 
      else: 
       continue 

      print "adding cookie" 
      print cookie_map 
      self.driver.add_cookie(cookie_map) 

    self.driver.get(response.url) 

    # check if we have successfully logged in 
    files = self.wait_for_elements_to_be_present(By.XPATH, "//*[@id='files']", response) 
    print files 
Смежные вопросы