http - 无法将 POST 参数输入到 ".do"页面的 url

标签 http post web-scraping struts uri

我正在使用 Python 进行一些繁重的网络抓取。在某些情况下,发布数据不是通过表单提交发送的,而是通过一些 Javascript 发送的,我无法通过这种方法与之交互。为了避免这种情况,我一直在将发布请求的名称和值附加到 url,然后访问该 url。

在我遇到一个使用这种结构的网站之前,这种方法一直很好用:[sitename].com/?[pagename].do/。我承认我完全不知道这个 .do扩展,尽管一些简单的搜索告诉我它与 Struts 和基于 Java 的后端有关。在这种情况下,它似乎是一种动态生成表的方式;我正在尝试过滤该表的结果。我想输入的是类似 [sitename].com/?[pagename].do?[name]=[value]&[name]=[value] 的内容,但这不起作用,它甚至看起来也不应该起作用。我尝试使用多种语法变体。好像这里发生了一些我不太明白的事情。

我希望我能引导您到实际站点,但不幸的是,由于该项目的敏感性,我不能。不过,如果有任何其他信息有助于提供答案,请告诉我。提前致谢。

编辑:这并不是一个真正的“我的代码不工作”的问题,因为它是我想在我的代码中模拟的底层功能,这让我很困扰,但我会尽我最大的努力变得更加坚韧。根据契约(Contract)规定,我不能分享我们正在研究的网站的名称,但我会尝试对问题进行建模。我希望对将此 .do 页面发送到浏览器的后端事件有一定了解的人能够阐明。

import urllib
import urllib2
#
## case 1: a site that i have success in scraping
url = 'http://[sitename]/[pagename]' 
values = {'s' : '40', 'pg' : '1'}
data = urllib.urlencode(values)
req = urllib2.Request(url, data)
response = urllib2.urlopen(req)
the_page = response.read()
print the_page #i get the filtered data that i am looking for

#
## case 2: the site that poses a problem for the encoding of post parameters
url = 'http://[sitename]/?[pagename].do/' # this site uses a .do file to generate 
        # the content i want to filter. note that the page name is preceded by ?. 
values = {'s' : '40', 'pg' : '1'}
data = urllib.urlencode(values)
req = urllib2.Request(url, data)
response = urllib2.urlopen(req)
the_page = response.read()
print the_page # i am taken back to the root of the site, 
        # the same result i would get if i entered nonsense 
        # post parameters that did not correspond with actual control names.  

这也是页面上一些 javascript 的示例,它完成了我想用我的抓取工具做的事情:

function page_next (id) {
$("#loading").fadeIn("normal");
   $.post("/?dumps.do/", {s: id, pg: 2},
      function( data ) {
                    var content = $( data ).find( '#dumps' );
           }
      )
}

最佳答案

我不知道你在解析哪个站点,但是这个:[sitename].com/?[pagename].do/ 不是我称之为默认 Struts 行为的东西,假设它确实是一个 Struts 应用程序。

.do 扩展确实是 Struts 用来作为请求映射的东西,但在那种情况下,URL 应该是 [sitename].com/[pagename].do 不是 [sitename].com/?[pagename].do/

在第二种形式中,操作实际上是查询字符串中的一个参数。这就是此语法被破坏的原因:[sitename].com/?[pagename].do?[name]=[value]&[name]=[value]。您想要向操作发送查询字符串,但操作本身是查询字符串中的参数。

但这不是问题。问题在于该站点正在使用该参数执行某些操作,并希望以某种方式接收它的数据,而这种方式您无法进行逆向工程。

再次假设这是一个Struts应用程序,Struts使用一个前端 Controller 拦截所有的action.do URL,然后使用action调用应用程序中的一个特定类,一个被映射的类到那个特定的 Action 。此格式应为 [sitename].com/[pagename].do。这类似于拥有 [sitename].com/[pagename].php

但将操作作为参数让我觉得该站点有一个不同的前端 Controller (不是 Struts 的),它从查询字符串中获取参数并将其传递到下游的 Struts 框架。

采用这种处理请求的时髦方式可能有很多原因,包括让其他人更难抓取网站,尽管这看起来有点直截了当:

$.post("/?dumps.do/", {s: id, pg: 2}, ...

您是否尝试过使用查询字符串中的操作对应用程序的根目录执行 POST?

关于http - 无法将 POST 参数输入到 ".do"页面的 url,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27235525/

相关文章:

jquery - 在 MVC 4 中将多个参数传递给操作时,困惑是使用 GET 还是 POST

python - 如何使用 <span> 标签获取 <li> 中的每个值 BeautifulSoup

python - Scrapy - 获得响应的时机

python - BeautifulSoup ,get_text 但不是 <span> 文本..我怎样才能得到它?

php - 从 PHP/Apache 返回 100-Continue

c++ - 使用 C++ Socket API 通过套接字连接将 HTML 标记发送到浏览器

.net - HttpWebRequest - POST 中不允许使用括号

java - sun.net.httpserver 写入流的字节太多

javascript - 是否可以从地址栏使用注入(inject) $.post() ?

php - 在 PHP 中使用 POST 响应