单击Javascript链接以在Python中发布帖子请求

时间:2015-01-15 00:02:58

标签: javascript python selenium beautifulsoup python-requests

我正在编写一个webscraper /自动化工具。此工具需要使用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;">

我一直在使用请求和BeautifulSoup。我知道这些库可以与Javascript交互,人们推荐Selenium。但据我所知,Selenium无法进行POST。我怎么处理这个?是否可以不打开像Selenium那样的实际浏览器?

2 个答案:

答案 0 :(得分:6)

是。您只需将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)

如果您无法确定实际发布的网址,只需在您自己手动点击链接时监控网络标签(在Chrome开发工具中),您应该能够找到正确的请求并拉动任何有关的信息。

祝你好运!

答案 1 :(得分:1)

使用selenium模仿真实用户在真实浏览器中的互动 - 告诉它找到输入,在里面写文字,点击按钮等 - 高级方法 - 你甚至不会需要知道底层是什么,你看到真正的用户看到了什么。这里的缺点是有一个真正的浏览器,至少会减慢速度。但是,您可以自动化无头浏览器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,您可以使用浏览器开发人员工具来研究/分析对服务器的请求并在代码中模仿它们。有时,构建页面的方式和发出的请求太复杂,无法自动化,或者使用了反网络抓取技术。

有优点&amp;两种方法的缺点 - 选择哪个选项取决于很多事情。