有时候需要登入网站,然后去抓取一些有用的信息,人工做的话,太累了。有的人可以很快的做到登入,但是需要在登入后再去访问其他页面始终都访问不了,因为他们没有带Cookie进去而被当做是两次会话。下面看看代码

<?php  //test.php
function getWebContent($host,$page="/",$paramstr="",$cookies='',$medth="POST",$port=80){
    $fp = fsockopen($host,$port);
    if(!$fp){
        return false;
    }
    $medth = strtoupper($medth);
    $medth = $medth=="POST" ? "POST":"GET";
    $length = strlen($paramstr);
    if($medth == "GET" && $paramstr){
        $page .= "?".$paramstr;
    }
    $out = "$medth $page  HTTP/1.1\r\n";
    $out .= "Accept: */*\r\n"; 
    $out .= "Host: www.exaple.com\r\n"; 
    $out .= "Content-Length: ".$length."\r\n";
    $out .= "Content-Type: application/x-www-form-urlencoded\r\n";
    if($cookies){
        $out .= "Cookie: ".$cookies." \r\n";
    }
    $out .= "Connection: Keep-Alive\r\n\r\n";
    if($medth=='POST' && $paramstr){
        $out .= $paramstr."\r\n";
    }
    fwrite($fp, $out);
    $cookie = "";
    $content = "";
    while (!feof($fp)) {
        $str = fgets($fp);
        if(preg_match("/Set-Cookie:([^\n]*)/",$str,$matchs)){
            if($cookie){
                $cookie .= ";".$matchs[1];
            }else{
                $cookie = $matchs[1];
            }
        }
        $content .= $str;
        echo $str;
    }
    fclose($fp);
    return array('content'=>$content,'cookie'=>$cookie);
}

$params = "name=admin&pwd=admin";
$rs = getWebContent("127.0.0.1","/test/login.php",$params,"","POST",8080);
echo $rs['content'];
$rs = getWebContent("127.0.0.1","/test/index.php","",$rs['cookie'],"POST",8080);
//这里传入上次cookie是关键,否则会被当成两次会话
echo $rs['content'];
?>

<?php //login.php
    $name = $_REQUEST['name'];
    $pwd = $_REQUEST['pwd'];
    if($name == "admin" && $pwd == "admin"){
        setcookie("cname",$name);
        echo "success";
    }else{
        echo "failed";   
    }
?>

<?php //index.php
if(isset($_COOKIE['cname']) && $_COOKIE['cname']){
    echo "<ul><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li></ul>";
}else{
    echo "please login first!";
}
?>

将上面三个文件分别保存,login.php和index.php放在root目录下的test目录下。然后test.php放在任意目录,然后去命令行运行php test.php,结果就能出来。

还有一种更简单的方式,就是用curl,代码如下,可以用下面的代码替换test.php
<?php
$post_data = array (
    "name" => "admin",
    "pwd" => "admin",
);
$cookie_jar = tempnam('./', 'cookie');//新建cookie文件
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "http://localhost:8080/test/login.php");
//设定返回的数据是否自动显示
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
// 我们在POST数据哦!
curl_setopt($ch, CURLOPT_POST, 1);
// 把post的变量加上
curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data);
//把返回来的cookie信息保存在$cookie_jar文件中
curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie_jar);
echo curl_exec($ch);
curl_close($ch);

$ch2 = curl_init();
curl_setopt($ch2, CURLOPT_URL, "http://localhost:8080/test/index.php");
curl_setopt($ch2, CURLOPT_HEADER, false);
curl_setopt($ch2, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch2, CURLOPT_COOKIEFILE, $cookie_jar);
echo curl_exec($ch2);
unlink($cookie_jar);
curl_close($ch2);
?>

PHP登入网站抓取并且抓取数据的更多相关文章

  1. 突破IP限制登入网站后台

    后台: http://www.zhuna.cn/sys_admin/ 输入账号密码 点击确定后,跳转到登录界面: http://www.zhuna.cn/sys_admin/login.php 很自然 ...

  2. 网站爬取-案例三:今日头条抓取(ajax抓取JS数据)

    今日头条这类的网站制作,从数据形式,CSS样式都是通过数据接口的样式来决定的,所以它的抓取方法和其他网页的抓取方法不太一样,对它的抓取需要抓取后台传来的JSON数据,先来看一下今日头条的源码结构:我们 ...

  3. 使用 Python 抓取欧洲足球联赛数据

    Web Scraping在大数据时代,一切都要用数据来说话,大数据处理的过程一般需要经过以下的几个步骤    数据的采集和获取    数据的清洗,抽取,变形和装载    数据的分析,探索和预测    ...

  4. 抓取Js动态生成数据且以滚动页面方式分页的网页

    代码也可以从我的开源项目HtmlExtractor中获取. 当我们在进行数据抓取的时候,如果目标网站是以Js的方式动态生成数据且以滚动页面的方式进行分页,那么我们该如何抓取呢? 如类似今日头条这样的网 ...

  5. 测试开发Python培训:抓取新浪微博抓取数据-技术篇

    测试开发Python培训:抓取新浪微博抓取数据-技术篇   poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标.在poptest的se ...

  6. Fiddler抓取Android手机网络数据包

    也许你也有疑问,如果开发没有完备的接口文档,我如何知道他API的信息? 这时我们就得通过一些抓包工具抓取这些API信息. 常见抓包工具 HTTP抓包工具:Fiddler.Charles.Firebug ...

  7. 抓取猫眼TOP100的数据

    import requests import re import json from multiprocessing import Pool from multiprocessing import M ...

  8. 如何用python抓取js生成的数据 - SegmentFault

    如何用python抓取js生成的数据 - SegmentFault 如何用python抓取js生成的数据 1赞 踩 收藏 想写一个爬虫,但是需要抓去的的数据是js生成的,在源代码里看不到,要怎么才能抓 ...

  9. 【转】Python爬虫:抓取新浪新闻数据

    案例一 抓取对象: 新浪国内新闻(http://news.sina.com.cn/china/),该列表中的标题名称.时间.链接. 完整代码: from bs4 import BeautifulSou ...

随机推荐

  1. Java变量和运算符

    1.变量 变量概述 什么是变量?变量是一个内存中的小盒子(小容器),容器是什么?生活中也有很多容器,例如水杯是容器,用来装载水:你家里的大衣柜是容器,用来装载衣裤:饭盒是容器,用来装载饭菜.那么变量是 ...

  2. Scrapy实战篇(八)之简书用户信息全站抓取

    相对于知乎而言,简书的用户信息并没有那么详细,知乎提供了包括学习,工作等在内的一系列用户信息接口,但是简书就没有那么慷慨了.但是即便如此,我们也试图抓取一些基本信息,进行简单地细分析,至少可以看一下, ...

  3. 【BZOJ 3560】 3560: DZY Loves Math V (欧拉函数)

    3560: DZY Loves Math V Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 241  Solved: 133 Description ...

  4. 91网漏洞打包#越权+爆破+存储xss可打cookie

    漏洞一.主站存在登录口爆破 抓包,爆破一下 爆破成功 漏洞二.检测app时一处存储xss 在app登录后 我要提问那里插入xss 然后弹窗 可以打到cookie 漏洞三.app个人资料处平行越权可查看 ...

  5. Android背后的设计思想——功能共享机制

    Android的系统设计,与别的智能手机操作系统有很大区别,甚至在以往的任何操作系统里,很难找到像Android这样进行全面地系统级创新的操作系统.从创新层面上来说,Android编程上的思想和支持这 ...

  6. hdu 1171 多重背包

    题意:给出价值和数量,求能分开的最近的两个总价值,例如10,20*2,30,分开就是40,40 链接:点我 #include<cstdio> #include<iostream> ...

  7. Educational Codeforces Round 10 A. Gabriel and Caterpillar 模拟

    A. Gabriel and Caterpillar 题目连接: http://www.codeforces.com/contest/652/problem/A Description The 9-t ...

  8. mysqldump导出CSV格式及where导出时间范围问题解决

    众所周知,mysqldump不但可以导出sql格式,还可以导出csv格式. 导出CSV格式的具体使用如下命令. mysqldump -uroot -ppassword -S /tmp/mysql999 ...

  9. CentOS 6下搭建LAMP环境

    第一步,使用Xshell管理工具连接远程服务器 第二步,输入服务器账号密码登录远程服务器 如果centos内置的yum源可用的软件偏少或者版本过低,请更新! 首先备份/etc/yum.repos.d/ ...

  10. Android开发:ListView加上长按事件

    为ListView加上长按事件 lvMain.setOnItemLongClickListener(new OnItemLongClickListener() { @Override public b ...