找回密码

火车采集器软件交流官方论坛

搜索
火车采集器V9版免费下载火车浏览器 - 可视采集,万能群发,全自动脚本工具
查看: 18004|回复: 22

javascript之post网站用get方式采集实例

[复制链接]
发表于 2010-11-26 19:28:04 | 显示全部楼层 |阅读模式
有些网站内容页可能会有post提交表单来请求数据,火车步支持内容页的post,那摩这些有时候也不是不能采集的,也不需要插件,有时把表单的提交换成get提交的方式,也可能请求道数据,下面是一个网站的实例:http://mie168.com/job/2009-12/307837.htm,这个内容页,要点全文按钮才能看到全文,而有藏在了
  1. <script language='javascript' src='/Login.js'></script>
复制代码
,下载这个js,http://mie168.com/Login.js,这是这个js里德源码
  1. document.writeln("      <table bgcolor=#FEFEEF border="0" bordercolordark="#F9C7A2" cellpadding="0" cellspacing="0" width='640' align='center'> ");
  2. 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>");
  3. document.writeln("                   <input type='submit' name='Submit' class='inputDetail' value=' *  点这里阅读全文   ' title='点击这里阅读全文'>");
  4. document.writeln("      <input type='hidden' name='htmlpath' value='" +strHtmlpath + "'>");
  5. document.writeln("      </form></td> </tr>");

  6. document.writeln("  </table>");
复制代码
输出了一个表单,method='post' 提交方式post,用到的参数有htmlpath,通过
  1. <input type='hidden' name='htmlpath' value='" +strHtmlpath + "'>,提交的地址是 action='/read.aspx',补全是http://mie168.com/read.aspx

复制代码
可了解到htmlpath的值=strHtmlpath变量,接下来就是要找到strHtmlpath,在本页源码里有
  1. <script language='JavaScript'>
  2.         var strHtmlpath="/job/2009-12/307837.htm";       
  3. </script>
复制代码


由于是在内容页,而且又是post提交的,所以看上去确实有些麻烦,但可以把表单的提交方式换成get试试,get提交是把表单的各个参数用&连接后,用?连载提交的地址,所以写成http://mie168.com/read.aspx?htmlpath=/job/2009-12/307837.htm,测试可以成功看到全文

还是要用多页。列表直接自定义出这个地址好像不行

规则

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?加入会员

x
发表于 2010-11-27 05:54:39 | 显示全部楼层
顶你,人才。厉害。加油。
发表于 2010-11-27 08:17:12 | 显示全部楼层
这个强大啊。不错。一定要顶啊。
发表于 2010-11-28 17:35:26 | 显示全部楼层
谢谢楼主,楼主很厉害
发表于 2010-11-29 10:24:15 | 显示全部楼层
请教一下楼主,http://blog.cpecc.net/XASP/BLOG/user/UserInterface/UserBlog/UserBlogMain.aspx?BlogID=7这个网站如何用用火车采集器采集呢,采集到lxblog中,
 楼主| 发表于 2010-11-29 12:03:23 | 显示全部楼层
本帖最后由 zhouchanglin 于 2011-5-11 14:29 编辑

b]回复 5# zsc0916

这个网站很不好菜,有框架调用,列表页用,内容页也用了框架,这些都不是问题,关键是它列表里德网址也是用post提交的,而列表的翻页也是用post提交,而2者的提交的,翻页是
  1. <a id="btnNext" href="javascript:__doPostBack('btnNext','')" style="color:Navy;font-family:verdana;font-size:8pt;">下一页</a>&nbsp;
复制代码
内容是
  1. <a id="DL1__ctl9_lbnArticle" href="javascript:__doPostBack('DL1$_ctl9$lbnArticle','')" style="font-style:italic;text-decoration:underline;">点击此处进入原文</a></FONT></TD>
复制代码
根据
  1. <script language="javascript" type="text/javascript">
  2. <!--
  3.         function __doPostBack(eventTarget, eventArgument) {
  4.                 var theform;
  5.                 if (window.navigator.appName.toLowerCase().indexOf("microsoft") > -1) {
  6.                         theform = document.Form1;
  7.                 }
  8.                 else {
  9.                         theform = document.forms["Form1"];
  10.                 }
  11.                 theform.__EVENTTARGET.value = eventTarget.split("$").join(":");
  12.                 theform.__EVENTARGUMENT.value = eventArgument;
  13.                 theform.submit();
  14.         }
  15. // -->
  16. </script>
复制代码
eventTarget参数是不会相同的,它也没有可以跳转页码的功能,只能点下一页,因此我只能把前10篇文章用post,只菜了一页




修改:现在可以做出这个网站了,用php生成内容页,写入文本文件,导入火车头采集


文件:需要php运行环境,并开启curl扩展
内容页url,导入火车头即可使用

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?加入会员

x
发表于 2010-11-29 15:05:06 | 显示全部楼层
谢谢,我研究一下,学习啦……
发表于 2010-12-5 19:48:19 | 显示全部楼层
回复  zsc0916

这个网站很不好菜,有框架调用,列表页用,内容页也用了框架,这些都不是问题,关键是它 ...
zhouchanglin 发表于 2010-11-29 12:03



太强大啊~~
发表于 2011-2-16 10:51:04 | 显示全部楼层
谁能帮忙看看这个网站怎么采集吗?
http://www.njhrd.com/search/index.aspx?align=S&worckcity=%u5357%u4eac%2c&kwType=1
能不能写个分页规则给我呢 , 谢谢啦!
 楼主| 发表于 2011-2-16 14:26:48 | 显示全部楼层
回复 9# sunxm89

这个网站有个问题就是这个地址
  1. 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/inde ... %AC%2C&kwType=1,即搜索后地址栏的地址

搜索地址通过分析点搜索按钮,触发的函数,可以得出,当选择完搜索条件,按搜索时会触发SearchJobList()函数,下面是代码
  1. function SearchJobList()
  2. {
  3.       var

  4. jobType,worckcity,publishdate,workYear,salary,eduRequire,workMethod,keywords,kwType;
  5.       var url="../search/index.aspx?align=S";
  6.       jobType=document.getElementById("div_show").value;//职位类别
  7.       var flag=0;
  8.       if(jobType=="")
  9.       {
  10.       //  alert("请选择职位类别");
  11.       //  return false;
  12.       }
  13.       else
  14.       {
  15.         flag=1;
  16.       url+="&jobType="+encodeURIComponent(jobType);//encodeURIComponent编码职位类别
  17.       }
  18.       worckcity=document.getElementById("divcity_show").value;//工作地点
  19.       if(worckcity=="")
  20.       {
  21.       //  alert("请选择工作城市");
  22.       //  return false;
  23.       }
  24.        else
  25.       {
  26.         flag=1;
  27.       url+="&worckcity="+encodeURIComponent(worckcity);//encodeURIComponent 编码工作地点
  28.       }
  29.       publishdate=document.getElementById('ddlPublishDate').options[document.getElementById

  30. ('ddlPublishDate').selectedIndex].value;//发布日期
  31.       if(publishdate!="" && publishdate!="-1")
  32.       {
  33.         url+="&publishdate="+publishdate;
  34.       }
  35.       workYear=document.getElementById('ddlWorkYear').options[document.getElementById

  36. ('ddlWorkYear').selectedIndex].value;//工作年限
  37.       if(workYear!="" && workYear!="-1")
  38.       {
  39.         url+="&workYear="+workYear;
  40.       }
  41.       salary=document.getElementById('ddlSalary').options[document.getElementById

  42. ('ddlSalary').selectedIndex].value;//月薪范围
  43.       if(salary!="" && salary!="选择月薪范围"&& salary!="-1")
  44.       {
  45.         url+="&salary="+salary;
  46.       }
  47.       eduRequire=document.getElementById('ddlEduRe').options[document.getElementById

  48. ('ddlEduRe').selectedIndex].value;//学历要求
  49.       if(eduRequire!="" && eduRequire!="-1")
  50.       {
  51.         url+="&eduRequire="+eduRequire;
  52.       }
  53.        workMethod=document.getElementById('chkWorkMethod').options[document.getElementById

  54. ('chkWorkMethod').selectedIndex].value;//工作类型
  55.       if(workMethod!="" && workMethod!="-1")
  56.       {
  57.         url+="&workMethod="+workMethod;
  58.       }

  59.       keywords=document.getElementById("txtKeyword").value;//关键字
  60.       if(keywords!="")
  61.       {
  62.         url+="&keywords="+encodeURIComponent(keywords);
  63.        // flag=1;
  64.       }
  65.       
  66.         var KWopts =document.getElementsByName("rdkwtype");
  67.         kwType="1";
  68.         if(KWopts[1].checked==true)
  69.         {
  70.             kwType="2";
  71.         }
  72.         else
  73.         {
  74.              kwType="1";
  75.         }
  76.         url+="&kwType="+kwType;
  77.         if(flag==0)
  78.         {
  79.         alert("职位类别,工作地点至少选择一个");
  80.             return false;
  81.         }
  82.     //  alert(url);
  83.      window.parent.location=url;//重定向地址栏url
  84. }
复制代码
:这个函数主要是根据用户搜索条件,重定向地址栏,而后面的参数,有些选项只有不为空或-1时,才会&组合,而职位类别和工作地点路过选择都要被encodeURIComponent编码


考虑翻页:页脚部分源码非第一页
  1. <a id="lnkbtnFirst" href="javascript:__doPostBack('lnkbtnFirst','')">首页</a>
  2.           &nbsp; <a id="lnkbtnPre" href="javascript:__doPostBack('lnkbtnPre','')">上页</a>
  3.           &nbsp;
  4.     <a id="lnkbtnNext" href="javascript:__doPostBack('lnkbtnNext','')">下页</a>
  5.           &nbsp; <a id="lnkbtnLast" href="javascript:__doPostBack('lnkbtnLast','')">尾页</a></div>
复制代码
可以看到点击 上页 下页 尾页 都是触发__doPostBack函数,不同的是传递的参数,而作分页请求,要考虑下一页的,这个网站只能下一页翻页

下一页翻页::__doPostBack('lnkbtnNext','')
  1. var theForm = document.forms['form1'];//提交的表单
  2. if (!theForm) {
  3.     theForm = document.form1;
  4. }
  5. function __doPostBack(eventTarget, eventArgument) {
  6.     if (!theForm.onsubmit || (theForm.onsubmit() != false)) {
  7.         theForm.__EVENTTARGET.value = eventTarget;//翻页方式,下一页是lnkbtnNext'
  8.         theForm.__EVENTARGUMENT.value = eventArgument;
  9.         theForm.submit();//提交表单
  10.     }
  11. }
复制代码
这样post数据是:
  1. __EVENTTARGET=lnkbtnNext&__EVENTARGUMENT=&__VIEWSTATE=[POST随机值1]&__EVENTVALIDATION=[POST随机值2]&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

我用的抓包获得数据,都是经过编码的,应该不会出错


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?加入会员

x
您需要登录后才可以回帖 登录 | 加入会员

本版积分规则

温馨提示:建议您联系官方定制服务,通过官方支付方式完成支付。您与其他非官方账号发生的交易,我方概不承担责任。网络有风险,交易需谨慎

QQ| 手机版|Archiver| 火车采集器官方站

Copyright © 2001-2013 Comsenz Inc.  Template by Comeings! All Rights Reserved.

Powered by Discuz! X3.4( 皖ICP备06000549 )

快速回复 返回顶部 返回列表