2016-02-08 3 views
1

Я изо всех сил пытаюсь найти общий подход к обнаружению формы в HTML и затем ее отправку. Когда структура страницы знать заранее для данной страницы, мы, конечно, есть несколько вариантов:Обнаружение форм (и их заполнение) Scrapy

- Селен/WebDriver (путем заполнения полей и «щелчок» кнопки)

- Определение формы запроса POST вручную, а затем реконструировать его с urllib2 непосредственно:

import urllib2 
import urllib 
import lxml.html as LH 

url = "http://apply.ovoenergycareers.co.uk/vacancies/#results" 
params = urllib.urlencode([('field_36[]', 73), ('field_37[]', 76), 
('field_32[]', 82)]) 
response = urllib2.urlopen(url, params) 

или запросов:

import requests 
r = requests.post("http://apply.ovoenergycareers.co.uk/vacancies/#results", data = 'Manager') 
r.text 

Но хотя большинство форм включает в себя запрос POST, некоторые поля ввода и кнопку отправки, они сильно различаются при их реализации под капотом. Когда количество страниц, подлежащих очистке, попадает в сотни, нецелесообразно определять индивидуальный подход заполнения форм для каждого.

Мое понимание таково: Основная добавочная стоимость Scrapy - его способность следовать ссылкам. Я предполагаю, что это также будет включать ссылки, в конечном итоге полученные через форму представления. Может ли эта способность использоваться для создания общего подхода к «следующему» представлению формы?

CLARIFICATION: В случае формы с несколькими раскрывающимися меню, я обычно оставляю их по умолчанию и заполняю только поле ввода поискового запроса. Поэтому найти это поле и «заполнить его» в конечном итоге является главной проблемой здесь.

ответ

3

Ссылка Экстракторы не могут следовать представлениям формы в Scrapy. Существует еще один механизм под названием FormRequest, который специально разработан для облегчения подачи форм.

Обратите внимание, что FormRequest s не может обрабатывать формы, когда JavaScript участвует в представлении.

+0

Я не знал, что 'lxml' имел возможности обнаружения и отображения формы. Я думаю, что мне нужно будет сделать для каждой формы, с которой я сталкиваюсь, используйте 'lxml.html.submit_form()', чтобы отправить форму со всеми полями, оставленными пустыми, а затем очистить результирующую страницу для ключевого слова, а не пытаться определить это поле в форме - это поле ключевого слова. – Pyderman

1

Вы можете посмотреть в Selenium с PhantomJS. Он может обрабатывать JS, а затем вы можете использовать селектора CSS из Selenium для выбора определенных элементов на веб-странице.

+0

Спасибо. Но независимо от того, используется ли PhantomJS или обычный браузер с Selenium, программе по-прежнему потребуются знания (XPath/CSS) элементов страницы. – Pyderman

+0

Да. Это все равно потребует знания точных элементов CSS. – raggingfox

Смежные вопросы