单击 Javascript 链接以在 Python 中发出发布请求
Posted
技术标签:
【中文标题】单击 Javascript 链接以在 Python 中发出发布请求【英文标题】:Clicking a Javascript link to make a post request in Python 【发布时间】:2015-03-13 07:58:15 【问题描述】:我正在编写一个网络爬虫/自动化工具。该工具需要使用 POST 请求来提交表单数据。最终操作使用此链接:
<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;">
我一直在使用 requests 和 BeautifulSoup。我知道这些库不能与 Javascript 交互,人们推荐 Selenium。但据我了解,Selenium 不能做 POST。我该如何处理?是否可以不打开像 Selenium 那样的实际浏览器?
【问题讨论】:
Selenium 可以正常发布。重要的是您在运行时中执行,该运行时可以通过单击链接来执行链接上的 javascript,就像 selenium 提供的 webdriver 一样 当然,您可以只提取表单输入字段的名称并插入您想要的任何值,然后使用请求自己发送帖子。如果这只是您的应用程序的一小部分,您不打算在其他地方做,这可能是更好的选择。 所以,当我点击上面的链接时,它会发布表单中的内容并刷新页面。我可以简单地向同一个 URL 发出 post 请求而不是使用链接吗?此外,当为该字段保存数据时,表单具有 value 属性,但上面的 input 元素显示它没有输入任何数据,因此没有 value 属性。我可以使用请求在我的帖子有效负载中添加 'value: "blah"' 吗? 是的。我添加了一些详细信息和文档链接的答案。 【参考方案1】:是的。您完全可以通过将 POST 提交到正确的 url 来完全复制链接正在执行的操作(实际上,这最终将与单击链接时触发的 javascript 相同)。
您可以在此处的请求文档中找到相关部分: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,只需在您自己手动单击链接时监控网络选项卡(在 chrome 开发工具中),您应该能够找到正确的请求并拉取任何信息。
祝你好运!
【讨论】:
有效!谢谢。它正在正确更新表单,但由于某种原因,我收到了 500 响应代码。 @StevenWerner,如果错误代码是真实的,这意味着您在帖子中提供的数据正在破坏服务器上的某些内容。也许您正在发送不良数据? 我发现有时唯一的 id 与必须抓取并添加到 POST 的链接相关联。【参考方案2】:使用selenium
,您可以模拟真实浏览器中的真实用户交互 - 告诉它定位输入、在其中写入文本、单击按钮等 - 高级方法 - 您甚至不需要知道什么是否在幕后,您会看到真实用户所看到的。这里的缺点是涉及到一个真正的浏览器,它至少会减慢速度。但是,您可以自动化 headless 浏览器 (PhantomJS
),或者如果您没有条件打开带有 UI 的浏览器,则可以使用 Xvfb
virtual framebuffer。示例:
from selenium import webdriver
driver = webdriver.PhantomJS()
driver.get('url here')
button = driver.find_element_by_id('linkSaveDestination')
button.click()
使用requests+BeautifulSoup
,您将进入裸机 - 使用浏览器开发人员工具研究/分析向服务器发出的请求并在您的代码中模仿它们。有时,页面的构建方式和发出的请求过于复杂而无法自动化,或者使用了反网络抓取技术。
这两种方法各有利弊 - 选择哪个选项取决于很多事情。
【讨论】:
谢谢,我以后可能会试试这个。我宁愿完全没有浏览器,而且这些页面上很少使用 javascript,所以我想我现在可以坚持使用 requests 和 BeautifulSoup以上是关于单击 Javascript 链接以在 Python 中发出发布请求的主要内容,如果未能解决你的问题,请参考以下文章
为 android 应用项目创建链接,用户可以单击以在应用中查看它