javascript之post网站用get方式采集实例
有些网站内容页可能会有post提交表单来请求数据,火车步支持内容页的post,那摩这些有时候也不是不能采集的,也不需要插件,有时把表单的提交换成get提交的方式,也可能请求道数据,下面是一个网站的实例:http://mie168.com/job/2009-12/307837.htm,这个内容页,要点全文按钮才能看到全文,而有藏在了<script language='javascript' src='/Login.js'></script>,下载这个js,http://mie168.com/Login.js,这是这个js里德源码document.writeln(" <table bgcolor=#FEFEEF border=\"0\" bordercolordark=\"#F9C7A2\" cellpadding=\"0\" cellspacing=\"0\" width='640' align='center'> ");document.writeln(" <tr><td height=\"40\" ></td></tr> <tr><td height=\"70\"align='center' bgcolor=#e5eefa><form name='frmmie168' method='post' action='/read.aspx'><p></p>");
document.writeln(" <input type='submit' name='Submit' class='inputDetail' value=' *点这里阅读全文 ' title='点击这里阅读全文'>");
document.writeln(" <input type='hidden' name='htmlpath' value='" +strHtmlpath + "'>");
document.writeln(" </form></td> </tr>");
document.writeln("</table>");输出了一个表单,method='post' 提交方式post,用到的参数有htmlpath,通过<input type='hidden' name='htmlpath' value='" +strHtmlpath + "'>,提交的地址是 action='/read.aspx',补全是http://mie168.com/read.aspx
可了解到htmlpath的值=strHtmlpath变量,接下来就是要找到strHtmlpath,在本页源码里有<script language='JavaScript'>
var strHtmlpath="/job/2009-12/307837.htm";
</script>;
由于是在内容页,而且又是post提交的,所以看上去确实有些麻烦,但可以把表单的提交方式换成get试试,get提交是把表单的各个参数用&连接后,用?连载提交的地址,所以写成http://mie168.com/read.aspx?htmlpath=/job/2009-12/307837.htm,测试可以成功看到全文
还是要用多页。列表直接自定义出这个地址好像不行
规则 顶你,人才。厉害。加油。 这个强大啊。不错。一定要顶啊。 谢谢楼主,楼主很厉害 请教一下楼主,http://blog.cpecc.net/XASP/BLOG/user/UserInterface/UserBlog/UserBlogMain.aspx?BlogID=7这个网站如何用用火车采集器采集呢,采集到lxblog中, 本帖最后由 zhouchanglin 于 2011-5-11 14:29 编辑
b]回复 5# zsc0916
这个网站很不好菜,有框架调用,列表页用,内容页也用了框架,这些都不是问题,关键是它列表里德网址也是用post提交的,而列表的翻页也是用post提交,而2者的提交的,翻页是<a id="btnNext" href="javascript:__doPostBack('btnNext','')" style="color:Navy;font-family:verdana;font-size:8pt;">下一页</a> 内容是<a id="DL1__ctl9_lbnArticle" href="javascript:__doPostBack('DL1$_ctl9$lbnArticle','')" style="font-style:italic;text-decoration:underline;">点击此处进入原文</a></FONT></TD>根据<script language="javascript" type="text/javascript">
<!--
function __doPostBack(eventTarget, eventArgument) {
var theform;
if (window.navigator.appName.toLowerCase().indexOf("microsoft") > -1) {
theform = document.Form1;
}
else {
theform = document.forms["Form1"];
}
theform.__EVENTTARGET.value = eventTarget.split("$").join(":");
theform.__EVENTARGUMENT.value = eventArgument;
theform.submit();
}
// -->
</script>
eventTarget参数是不会相同的,它也没有可以跳转页码的功能,只能点下一页,因此我只能把前10篇文章用post,只菜了一页
修改:现在可以做出这个网站了,用php生成内容页,写入文本文件,导入火车头采集
文件:需要php运行环境,并开启curl扩展
内容页url,导入火车头即可使用 谢谢,我研究一下,学习啦…… 回复zsc0916
这个网站很不好菜,有框架调用,列表页用,内容页也用了框架,这些都不是问题,关键是它 ...
zhouchanglin 发表于 2010-11-29 12:03 http://bbs.locoy.com/images/common/back.gif
太强大啊~~ 谁能帮忙看看这个网站怎么采集吗?
http://www.njhrd.com/search/index.aspx?align=S&worckcity=%u5357%u4eac%2c&kwType=1
能不能写个分页规则给我呢 , 谢谢啦! 回复 9# sunxm89
这个网站有个问题就是这个地址http://www.njhrd.com/search/index.aspx?align=S&worckcity=%u5357%u4eac%2c&kwType=1
在火车头中是乱码,搜索的城市不是南京,而是%u5357%u4eac%2c字符串,我用火车的源代码查看器测试post数据都是这样的,因为但在浏览器中这个地址可以请求到数据,这点就不知道怎么回事了
解决的办法是:把 “南京, ” 用encodeURIComponent()函数编码才是正确的编码字符串encodeURIComponent("南京,"),编码后是%E5%8D%97%E4%BA%AC%2C
这样正确的post地址应该是http://www.njhrd.com/search/index.aspx?align=S&worckcity=%E5%8D%97%E4%BA%AC%2C&kwType=1,即搜索后地址栏的地址
搜索地址通过分析点搜索按钮,触发的函数,可以得出,当选择完搜索条件,按搜索时会触发SearchJobList()函数,下面是代码function SearchJobList()
{
var
jobType,worckcity,publishdate,workYear,salary,eduRequire,workMethod,keywords,kwType;
var url="../search/index.aspx?align=S";
jobType=document.getElementById("div_show").value;//职位类别
var flag=0;
if(jobType=="")
{
//alert("请选择职位类别");
//return false;
}
else
{
flag=1;
url+="&jobType="+encodeURIComponent(jobType);//encodeURIComponent编码职位类别
}
worckcity=document.getElementById("divcity_show").value;//工作地点
if(worckcity=="")
{
//alert("请选择工作城市");
//return false;
}
else
{
flag=1;
url+="&worckcity="+encodeURIComponent(worckcity);//encodeURIComponent 编码工作地点
}
publishdate=document.getElementById('ddlPublishDate').options[document.getElementById
('ddlPublishDate').selectedIndex].value;//发布日期
if(publishdate!="" && publishdate!="-1")
{
url+="&publishdate="+publishdate;
}
workYear=document.getElementById('ddlWorkYear').options[document.getElementById
('ddlWorkYear').selectedIndex].value;//工作年限
if(workYear!="" && workYear!="-1")
{
url+="&workYear="+workYear;
}
salary=document.getElementById('ddlSalary').options[document.getElementById
('ddlSalary').selectedIndex].value;//月薪范围
if(salary!="" && salary!="选择月薪范围"&& salary!="-1")
{
url+="&salary="+salary;
}
eduRequire=document.getElementById('ddlEduRe').options[document.getElementById
('ddlEduRe').selectedIndex].value;//学历要求
if(eduRequire!="" && eduRequire!="-1")
{
url+="&eduRequire="+eduRequire;
}
workMethod=document.getElementById('chkWorkMethod').options[document.getElementById
('chkWorkMethod').selectedIndex].value;//工作类型
if(workMethod!="" && workMethod!="-1")
{
url+="&workMethod="+workMethod;
}
keywords=document.getElementById("txtKeyword").value;//关键字
if(keywords!="")
{
url+="&keywords="+encodeURIComponent(keywords);
// flag=1;
}
var KWopts =document.getElementsByName("rdkwtype");
kwType="1";
if(KWopts.checked==true)
{
kwType="2";
}
else
{
kwType="1";
}
url+="&kwType="+kwType;
if(flag==0)
{
alert("职位类别,工作地点至少选择一个");
return false;
}
//alert(url);
window.parent.location=url;//重定向地址栏url
}
:这个函数主要是根据用户搜索条件,重定向地址栏,而后面的参数,有些选项只有不为空或-1时,才会&组合,而职位类别和工作地点路过选择都要被encodeURIComponent编码
考虑翻页:页脚部分源码非第一页<a id="lnkbtnFirst" href="javascript:__doPostBack('lnkbtnFirst','')">首页</a>
<a id="lnkbtnPre" href="javascript:__doPostBack('lnkbtnPre','')">上页</a>
<a id="lnkbtnNext" href="javascript:__doPostBack('lnkbtnNext','')">下页</a>
<a id="lnkbtnLast" href="javascript:__doPostBack('lnkbtnLast','')">尾页</a></div>可以看到点击 上页 下页 尾页 都是触发__doPostBack函数,不同的是传递的参数,而作分页请求,要考虑下一页的,这个网站只能下一页翻页
下一页翻页::__doPostBack('lnkbtnNext','')var theForm = document.forms['form1'];//提交的表单
if (!theForm) {
theForm = document.form1;
}
function __doPostBack(eventTarget, eventArgument) {
if (!theForm.onsubmit || (theForm.onsubmit() != false)) {
theForm.__EVENTTARGET.value = eventTarget;//翻页方式,下一页是lnkbtnNext'
theForm.__EVENTARGUMENT.value = eventArgument;
theForm.submit();//提交表单
}
}这样post数据是:__EVENTTARGET=lnkbtnNext&__EVENTARGUMENT=&__VIEWSTATE=&__EVENTVALIDATION=&hid_action=align%3DS%26worckcity%3D%25E5%258D%2597%25E4%25BA%25AC%252c%26kwType%3D1&head1%24hid_topID=1&div_show=&divcity_show=%E5%8D%97%E4%BA%AC%2C&ddlPublishDate=-1&ddlWorkYear=-1&ddlSalary=-1&ddlEduRe=-1&chkWorkMethod=-1&txtKeyword=&rdkwtype=1其中参数的意思:
hid_action-------------------地址栏当前搜索地址
div_show-------职位类别
divcity_show-------工作地点
ddlPublishDate-------发布日期
ddlWorkYear------工作年限
ddlSalary-----------月薪范围
chkWorkMethod-----------工作类型
ddlEduRe-------学历
txtKeyword---------搜索关键字
rdkwtype--------------职位1 还是企业2
我用的抓包获得数据,都是经过编码的,应该不会出错