单击 Javascript link 以在 Python 中发出 post 请求

Clicking a Javascript link to make a post request in Python

我正在编写一个 webscraper/automation 工具。本工具需要使用POST次请求提交表单数据。最后的动作用这个link:

<a id="linkSaveDestination" href='javascript:WebForm_DoPostBackWithOptions(new WebForm_PostBackOptions("linkSaveDestination", "", true, "", "", false, true))'>Save URL on All Search Engines</a>

通过此表单提交数据:

<input name="sem_ad_group__destination_url" type="text" maxlength="1024" id="sem_ad_group__destination_url" class="TextValueStyle" style="width:800px;">

我一直在使用请求和 BeautifulSoup。我知道这些库无法与 Javascript 交互,人们推荐使用 Selenium。但据我了解,Selenium 不能做 POSTs。我该如何处理?是否可以像 Selenium 那样不打开实际的浏览器?

使用 selenium,您可以在真实浏览器中模拟真实用户交互 - 告诉它定位输入、在其中写入文本、单击按钮等 - 高级方法 - 你甚至不需要需要知道引擎盖下有什么,你看到的是真实用户看到的。这里的缺点是涉及到一个真正的浏览器,它至少会减慢速度。但是,您可以自动化 无头浏览器 PhantomJS), or use a Xvfb virtual framebuffer 如果您没有条件打开带有 UI 的浏览器。示例:

from selenium import webdriver

driver = webdriver.PhantomJS()
driver.get('url here')

button = driver.find_element_by_id('linkSaveDestination')
button.click()

使用 requests+BeautifulSoup,您将深入到裸机 - 使用浏览器开发工具,您可以 research/analyze 向服务器发出哪些请求并在您的代码中模拟它们。有时构建页面和发出请求的方式太复杂而无法自动化,或者使用了反网络抓取技术。

这两种方法各有利弊 - 选择哪个选项取决于很多因素。

是的。您完全可以通过将 POST 提交给正确的 url 来完全复制 link 所做的事情(实际上,这最终将与 javascript 会在单击 link 时触发)。

您可以在此处的请求文档中找到相关部分:http://docs.python-requests.org/en/latest/user/quickstart/#more-complicated-post-requests

因此,对于您的特定情况,这看起来像这样:

payload = {'sem_ad_group__destination_url': 'yourTextValueHere'}
r = requests.post("theActionUrlForTheFormHere", data=payload)

如果您无法确定 url 它实际发布到什么,只需在手动单击 link 你自己,你应该能够找到正确的请求并从中提取任何信息。

祝你好运!