【问题标题】:Detecting forms (and filling them in) with Scrapy使用 Scrapy 检测表单(并填写)
【发布时间】:2016-05-18 09:58:46
【问题描述】:

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

-- Selenium/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 的主要附加值是它能够跟踪链接。我认为这也将包括最终通过表单提交到达的链接。然后可以使用此功能构建通用方法来“跟踪”表单提交吗?

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

【问题讨论】:

    标签: python xpath web-scraping scrapy lxml


    【解决方案1】:

    链接提取器无法跟随 Scrapy 中的表单提交。还有一种称为FormRequest 的机制专门用于简化提交表单。

    请注意,FormRequests 在提交过程中涉及 JavaScript 时无法处理表单。

    【讨论】:

    • 我不知道lxml 具有表单检测和表单提交功能。我认为我需要对遇到的每个表单使用lxml.html.submit_form() 提交所有字段留空的表单,然后为关键字抓取结果页面,而不是尝试确定表单中的哪个字段是关键字字段。
    【解决方案2】:

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

    【讨论】:

    • 谢谢。但无论是 PhantomJS 还是普通浏览器与 Selenium 一起使用,该程序仍然需要页面元素的知识(XPath / CSS)。
    • 是的。它仍然需要确切的 CSS 元素知识。
    猜你喜欢
    • 1970-01-01
    • 2014-03-22
    • 2018-10-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多