使用 Scrapy 检测表单(并填写)

Detecting forms (and filling them in) with Scrapy

我正在努力寻找一种通用方法来检测 HTML 中的表单然后提交它。当给定页面的页面结构预先已知时,我们当然有几种选择:

-- Selenium/Webdriver(通过填写字段和 'clicking' 按钮)

-- 手动确定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 的主要附加值是它跟踪链接的能力。我认为这还包括最终通过提交表单获得的链接。然后可以使用此功能来构建 "following" 表单提交的通用方法吗?

澄清:如果表单有多个下拉菜单,我通常会将它们保留为默认值,并且只填写搜索词输入字段。所以找到这个字段和 'filling it in' 最终是这里的主要挑战。

Link 提取器不能按照Scrapy中的表单提交。还有另一种称为 FormRequest 的机制,专门用于简化提交表单。

请注意,当 JavaScript 参与提交时,FormRequests 无法处理表单。

您可以使用 PhantomJS 查看 Selenium。它可以处理 JS,然后您可以使用 Selenium 中的 CSS 选择器来选择网页上的特定元素。