使用 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 参与提交时,FormRequest
s 无法处理表单。
您可以使用 PhantomJS 查看 Selenium。它可以处理 JS,然后您可以使用 Selenium 中的 CSS 选择器来选择网页上的特定元素。
我正在努力寻找一种通用方法来检测 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 参与提交时,FormRequest
s 无法处理表单。
您可以使用 PhantomJS 查看 Selenium。它可以处理 JS,然后您可以使用 Selenium 中的 CSS 选择器来选择网页上的特定元素。