获(爬)取需要填写表单的网页(查询)内容

Posted by Struggle on June 5, 2016

之前我们介绍了如何通过自己已有的数据开发一个查询。

今天,我们介绍获取网页查询的内容,就是自动帮用户填写好表单。

首先我们需要知道大部分网页表单(form)填写时基本上都是通过post或者get传输需要填写的数据


## 首先我们需要打开浏览器开发者模式,如果是Chrome,按下Ctrl+Shift+i,即可 ___

1.get形式 大多可以在url(网页链接)中直接看得到,如下图

webcx1

我们可以看到一开始网页http://hi.wxhand.cn/wxplug/zb/gk/上显示的 我们需要填写“姓名”,“性别”,“考点”,然后点击“确定”,我们可以发现网页url改变了,而且右边出现了toutu.php,我们打开看看,可以发现传输了数据。具体如下图

webcx2

我们可以从上图看到,网页链接url已经改变了而且显示了我们刚才填的数据 ?name=Ralph&sex=男&kd=江大一中 同时在截图的右边,我们可以看到 Request Method:GET 以及在 Query String Parameters中有我们传输的数据!

2.post形式,一般不会直接在Url中展示,只能在开发者模式下看到。如下图

webcx3

可以去网页http://hi.wxhand.cn/wxplug/zb/mh/中看我们填写好数据后,点击“生成”,我们可以看到结果如下.

webcx4

我们可以看到网页url变成了toutu.php,然后在右下角部分,我们可以看传输方式是 Request Method:POST POST方式,然后在 Query String Parameters中也能够看到我们填写的数据.

下面我学会如爬取这些信息

  • 操作是

    1. 找到指定网页

    2. 查看源代码,确定要传输的字段

    3. 修改示例代码,上传后访问从而实现内容抓取

1.GET形式的爬取

<?php
/*
php 获取GET传输后的数据
代码仅作参考,不一定完全适用
*/
//通用格式
$id="xxxx";

$url="http://xxx.com/result.php?id=".$id;   //网页位置

$curlobj = curl_init();		
curl_setopt($curlobj, CURLOPT_URL, $url);		
curl_setopt($curlobj, CURLOPT_RETURNTRANSFER, true);		
$s=curl_exec($curlobj);
curl_close($curlobj);

echo $s;	
?>

我们以我刚才展示的网页为例进行爬取http://hi.wxhand.cn/wxplug/zb/gk/

首页我们可以打开浏览器开发者模式,先进行一次正常的数据传输测试,可以在传输成功时,看到传输的数据格式.

webcx5 webcx6

我们发现需要传输的数据格式是 name:姓名 sex:姓名 kd:考点 下面我们改造上面通用代码

<?php
$name="Root";
$sex="男";
$kd="北大一中";
$url="http://hi.wxhand.cn/wxplug/zb/gk/?name=".$name."&sex=".$sex."&kd=".$kd;

$curlobj = curl_init();		
curl_setopt($curlobj, CURLOPT_URL, $url);		
curl_setopt($curlobj, CURLOPT_RETURNTRANSFER, true);		
$s=curl_exec($curlobj);
curl_close($curlobj);	

echo $s;
?>

我们保存代码后,访问可以看到如下图片

webcx7

我们发现没能出现预计的图片,然后上面查看下网页源代码,发现img的路径是相对路径,相当于我们无法确定这个toutu.php的位置。

webcx8

于是我们加入str_replcae函数,将toutu.php替换为 http://hi.wxhand.cn/wxplug/zb/gk/toutu.php

//在echo前加入下面代码
$s=str_replace("toutu.php","http://hi.wxhand.cn/wxplug/zb/gk/toutu.php",$s);
echo $s;

此时我们再访问,发现一切正常了

webcx9

2.POST形式的爬取

<?php
$id="xx";//要传输的变量的值

$data="id=".$id;
$url="http://xxx.com/result.php";

$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl, CURLOPT_POST, 1);
curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
$s = curl_exec($curl);
curl_close($curl);

echo $s;
?>

我们以我刚才展示的网页为例进行爬取http://hi.wxhand.cn/wxplug/zb/mh/

首页我们可以打开浏览器开发者模式,先进行一次正常的数据传输测试,可以在传输成功时,看到传输的数据格式.

webcx10

我们发现需要传输的数据格式是 name:姓名 id:编号 下面我们改造上面通用代码

<?php
$name="Ralph";
$id=2;

$data="name=".$name."&id=".$id;	  //要传的格式

$url="http://hi.wxhand.cn/wxplug/zb/mh/toutu.php";  //post到的位置

$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl, CURLOPT_POST, 1);
curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
$s = curl_exec($curl);
curl_close($curl);

echo $s;
?>

我们保存代码后,访问可以看到如下图片

webcx11

由于这是我改造的,没有出现GET形式中的那样的图片,因此不需要考虑路径问题。如果出现,也可以使用str_replace等函数改造

最后再说一句:在弄的时候一定要学会仔细观察代码及其注释,不需要改的放着不动就行。此外要知道相对路径和绝对路径。就是相当于你的news.php在你电脑中有个音乐文件夹,你在命令行中只需要输入cd music即可进入音乐库,此时就是相对路径,而如果我们要访问你的音乐库,那么就需要先知道的电脑的位置然后进入音乐库,此时就是觉得路径。

篇幅所限,还有一些我在后面会继续介绍。可以先自己尝试下这两种方法!


如果仍然有疑问,联系

qqgroup ___