我正在使用Python进行一些繁重的网页抓取。在某些情况下,发布数据不是通过表单提交发送的,而是通过一些Javascript发送的,我无法通过这种方法与之交互。为了避免这种情况,我已经将帖子请求的名称和值附加到网址,然后访问该网址。
这种方法运行正常,直到我遇到使用这种结构的网站: [sitename] .com /?[pagename] .do /.我承认完全无知这个.do扩展,虽然一些轻微的搜索告诉我它与Struts和基于Java的后端有关。在这种情况下,它似乎是一种动态生成表的方式;我试图过滤该表的结果。我想要输入的是 [sitename] .com /?[pagename] .do?[name] = [value]& [name] = [value] ,但这并不是&#39工作,甚至看起来都不应该起作用。我尝试使用语法中的几种变体。这似乎是我不太了解的事情。
我希望我能指导你到实际的网站,但不幸的是我不能因为项目的敏感性。但是,请告诉我,是否有任何其他信息可以帮助我们提供答案。提前致谢。
编辑:这不是真正的"我的代码没有工作"问题,因为它是我想在我的代码中模仿的基本功能,这让我感到不安,但我会尽我所能来加入。我合同约束不要分享我们正在研究的网站的名称,但我会尝试对问题进行建模。我希望有一些熟悉后端活动的人将这个.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' );
}
)
}
答案 0 :(得分:1)
我不知道你正在解析什么网站,但是这个:[sitename].com/?[pagename].do/
不是我称之为默认的Struts行为,假设它确实是一个Struts应用程序。
拥有.do
扩展程序确实是Struts用作请求映射的内容,但在这种情况下,网址应为[sitename].com/[pagename].do
而不是[sitename].com/?[pagename].do/
在第二种形式中,该动作实际上是查询字符串中的参数。这就是为什么这种语法被破坏的原因:[sitename].com/?[pagename].do?[name]=[value]&[name]=[value]
。您希望向操作发送查询字符串,但操作本身是查询字符串中的参数。
但这不是问题。问题是该网站正在使用该参数执行某些操作,并期望以某种方式接收数据,这是您无法进行逆向工程的方式。
再次假设这是一个Struts应用程序,Struts使用前端控制器拦截所有action.do
URL,然后使用该操作调用应用程序中的特定类,该类映射到该特定操作。格式应为[sitename].com/[pagename].do
。这类似于[sitename].com/[pagename].php
。
但是将操作作为参数使我认为该站点有一个不同的前端控制器(不是Struts),它从查询字符串中获取参数并将其传递给Struts框架。
使用这种时髦的处理请求的方式可能有很多原因,包括让其他人更难以抓住网站,尽管这似乎有点直接:
$.post("/?dumps.do/", {s: id, pg: 2}, ...
您是否尝试使用查询字符串中的操作对应用程序的根目录进行POST?