zhouchanglin 发表于 2010-11-26 19:28:04

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,测试可以成功看到全文

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

规则

你人真好 发表于 2010-11-27 05:54:39

顶你,人才。厉害。加油。

shaochang 发表于 2010-11-27 08:17:12

这个强大啊。不错。一定要顶啊。

zdy2ye 发表于 2010-11-28 17:35:26

谢谢楼主,楼主很厉害

zsc0916 发表于 2010-11-29 10:24:15

请教一下楼主,http://blog.cpecc.net/XASP/BLOG/user/UserInterface/UserBlog/UserBlogMain.aspx?BlogID=7这个网站如何用用火车采集器采集呢,采集到lxblog中,

zhouchanglin 发表于 2010-11-29 12:03:23

本帖最后由 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>&nbsp;内容是<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 发表于 2010-11-29 15:05:06

谢谢,我研究一下,学习啦……

sekmart 发表于 2010-12-5 19:48:19

回复zsc0916

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


太强大啊~~

sunxm89 发表于 2011-2-16 10:51:04

谁能帮忙看看这个网站怎么采集吗?
http://www.njhrd.com/search/index.aspx?align=S&worckcity=%u5357%u4eac%2c&kwType=1
能不能写个分页规则给我呢 , 谢谢啦!

zhouchanglin 发表于 2011-2-16 14:26:48

回复 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>
          &nbsp; <a id="lnkbtnPre" href="javascript:__doPostBack('lnkbtnPre','')">上页</a>
          &nbsp;
    <a id="lnkbtnNext" href="javascript:__doPostBack('lnkbtnNext','')">下页</a>
          &nbsp; <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

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


页: [1] 2 3
查看完整版本: javascript之post网站用get方式采集实例