PHP登入网站抓取并且抓取数据
有时候需要登入网站,然后去抓取一些有用的信息,人工做的话,太累了。有的人可以很快的做到登入,但是需要在登入后再去访问其他页面始终都访问不了,因为他们没有带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登入网站抓取并且抓取数据的更多相关文章
- 突破IP限制登入网站后台
后台: http://www.zhuna.cn/sys_admin/ 输入账号密码 点击确定后,跳转到登录界面: http://www.zhuna.cn/sys_admin/login.php 很自然 ...
- 网站爬取-案例三:今日头条抓取(ajax抓取JS数据)
今日头条这类的网站制作,从数据形式,CSS样式都是通过数据接口的样式来决定的,所以它的抓取方法和其他网页的抓取方法不太一样,对它的抓取需要抓取后台传来的JSON数据,先来看一下今日头条的源码结构:我们 ...
- 使用 Python 抓取欧洲足球联赛数据
Web Scraping在大数据时代,一切都要用数据来说话,大数据处理的过程一般需要经过以下的几个步骤 数据的采集和获取 数据的清洗,抽取,变形和装载 数据的分析,探索和预测 ...
- 抓取Js动态生成数据且以滚动页面方式分页的网页
代码也可以从我的开源项目HtmlExtractor中获取. 当我们在进行数据抓取的时候,如果目标网站是以Js的方式动态生成数据且以滚动页面的方式进行分页,那么我们该如何抓取呢? 如类似今日头条这样的网 ...
- 测试开发Python培训:抓取新浪微博抓取数据-技术篇
测试开发Python培训:抓取新浪微博抓取数据-技术篇 poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标.在poptest的se ...
- Fiddler抓取Android手机网络数据包
也许你也有疑问,如果开发没有完备的接口文档,我如何知道他API的信息? 这时我们就得通过一些抓包工具抓取这些API信息. 常见抓包工具 HTTP抓包工具:Fiddler.Charles.Firebug ...
- 抓取猫眼TOP100的数据
import requests import re import json from multiprocessing import Pool from multiprocessing import M ...
- 如何用python抓取js生成的数据 - SegmentFault
如何用python抓取js生成的数据 - SegmentFault 如何用python抓取js生成的数据 1赞 踩 收藏 想写一个爬虫,但是需要抓去的的数据是js生成的,在源代码里看不到,要怎么才能抓 ...
- 【转】Python爬虫:抓取新浪新闻数据
案例一 抓取对象: 新浪国内新闻(http://news.sina.com.cn/china/),该列表中的标题名称.时间.链接. 完整代码: from bs4 import BeautifulSou ...
随机推荐
- elementUI 学习入门之 input 输入框
基础用法 <el-input v-model="input1" palcehoder="请输入"></el-input> var Mai ...
- SCU 4445 Right turn
模拟. 每次找一下即将要遇到的那个点,这个数据范围可以暴力找,自己的写的时候二分了一下.如果步数大于$4*n$一定是$-1$. #include<bits/stdc++.h> using ...
- 什么情况下调用doGet()和doPost()?
Jsp页面中的FORM标签里的method属性为get时调用doGet(),为post时调用doPost().
- [APIO2015]巴厘岛的雕塑 --- 贪心 + 枚举
[APIO2015]巴厘岛的雕塑 题目描述 印尼巴厘岛的公路上有许多的雕塑,我们来关注它的一条主干道. 在这条主干道上一共有\(N\)座雕塑,为方便起见,我们把这些雕塑从 1 到\(N\)连续地进行 ...
- django深入-ORM操作
1 ORM添加 1.1 一对多添加 方式一: pub_obj=Publish.objects.get(id=2) Book.objects.create(title="python" ...
- ajax请求数据填充表格———使用art-template模板提高效率
一.为什么要用art-template模板 在实习的一次项目中,因为需求中展示表格的字段有很多个,后端返回的也是json数据,这时候如果还是使用之前的字符串拼接,这样会开发得比较慢,而且容易出错,而且 ...
- [转]android中listview点击事件失效
首先说明一下我想实现的功能: 点击某个item之后,让其颜色发生变化.如果变化网上有很多例子,我就不班门弄斧了.Listview之所以点击没有反应是因为上图中绿色部分(自己定义的一个继承BaseAda ...
- mp4网页播放代码,有声音无图像的解决办法~
mp4网页播放代码,有声音无图像的解决办法~ 关于网页播放mp4格式的视频,找了一些插件,这里推荐一下video.js 官方网址:http://www.videojs.com/ github ...
- HDU 4671 Backup Plan (2013多校7 1006题 构造)
Backup Plan Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65535/65535 K (Java/Others)Total ...
- Fast-settling synchronous-PWM-DAC filter has almost no ripple
An inexpensive way to implement high-resolution digital-to-analog conversion is to combine microcont ...