2010-03-16 5 views
24

Я хочу SCRAPY сканировать страницы, где переходить к следующей ссылке выглядит следующим образом:Как использовать CrawlSpider из scrapy, чтобы щелкнуть ссылку с javascript onclick?

<a href="#" onclick="return gotoPage('2');"> Next </a> 

Будет Scrapy иметь возможность интерпретировать яваскрипт кода этого?

С LiveHTTPHeaders расширения я обнаружил, что нажав Далее генерирует POST с действительно огромный кусок «мусора», начиная, как это:

encoded_session_hidden_map=H4sIAAAAAAAAALWZXWwj1RXHJ9n 

Я пытаюсь построить мой паук на CrawlSpider класса, но я не могу понять, как кодировать его с BaseSpider я использовал метод parse() обрабатывать первый URL, который случается быть формой Войти, где я сделал POST с:

def logon(self, response): 
    login_form_data={ 'email': '[email protected]', 'password': 'mypass22', 'action': 'sign-in' } 
    return [FormRequest.from_response(response, formnumber=0, formdata=login_form_data, callback=self.submit_next)] 

И затем я определил submit_next(), чтобы сказать, что делать дальше. Я не могу понять, как сообщить CrawlSpider, какой метод использовать по первому URL?

Все запросы в моем сканировании, кроме первого, являются запросами POST. Они чередуют два типа запросов: вставка некоторых данных и нажатие «Далее» для перехода на следующую страницу.

+1

Дайте мне еще один контекст, scrapy не может интерпретировать javascript, но вы можете имитировать сообщение POST, которое отправляет javascript, если вы можете найти это (encoded_session_hidden_map) как некоторое скрытое поле формы или что-то. – Joshkunz

+0

Попробуйте PhantomJS .. –

ответ

3

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

  1. Разместите запрос, чтобы достигнуть страницы (как вы делаете)
  2. Extract ссылку на следующую страницу с этой конкретной реакции
  3. Простой Запрос следующая страница, если это возможно, или снова использовать СформироватьЗапрос в применимом

Все это должны быть упрощены с механизмом реакции сервера, например:

  • Вы можете попробовать использовать dont_click = true в FormRequest.from_response
  • Или вы можете справиться с перенаправлением (302), поступающий от сервера (в этом случае вам придется указать в мета, что вам требуется запрос ручки перенаправления также для отправки обратного вызова)

Теперь, как понять все это:. используйте веб-отладчик, как скрипач или вы можете использовать Firefox плагин FireBug, или просто ударить F12 в IE 9; и проверить запросы, которые пользователь действительно делает на веб-сайте, так же, как вы просматриваете веб-страницу.