curl 抓取网页(curl模拟登陆过程中get到的技能以及了解到知识 )
优采云 发布时间: 2022-01-08 10:19curl 抓取网页(curl模拟登陆过程中get到的技能以及了解到知识
)
我今天使用 curl 进行了模拟登录。我以前从未接触过curl,我也不知道。简单说一下我在模拟登录过程中获得的技能和知识:
1、CURL:curl是一个使用URL语法开发的开源传输工具,相当于一个模拟浏览器。可以通过post/get、上传下载文件、操作cookies、传递代理等方式获取想要的页面信息。服务器(代理服务器是浏览器和Web服务器之间的中转站,相当于一个缓冲池)向服务器发送请求等,支持FTP、FTPS、TELNET等各种文件传输协议。起初只能在命令行中使用,现在也支持 PHP,并且拥有强大的函数库,函数库很多,可以支持不同的功能。在采集页面信息之前,我使用了file_get_contents,采集整个页面,然后使用正则匹配得到想要的内容。一些只有登录或验证才能获取的信息,是无法获取的。到达的。
curl发送url请求的步骤为:curl初始化--->设置具体参数信息--->执行curl并获取返回结果--->关闭curl session
下面是使用curl模拟登录获取用户信息的过程:
function login_post($url, $cookie, $post){
$curl = curl_init($url);//初始化
curl_setopt($curl, CURLOPT_URL, $url);//登录提交的地址
curl_setopt($curl, CURLOPT_COOKIEJAR, $cookie); //设置Cookie信息保存在指定的文件中
curl_setopt($curl, CURLOPT_POST, 1);//post方式提交
curl_setopt($curl, CURLOPT_POSTFIELDS, $post);//要提交的信息
//var_dump(http_build_query($post));exit;//打印要post的信息
$data = curl_exec($curl);//执行命令
curl_close($curl);//关闭URL请求
}
function get_content($url, $cookie) {
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_URL, $url);//需要获取信息的页面
//curl_setopt($ch, CURLOPT_HEADER, 1);//不输出头部
curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);//设置将获取到的信息输出在浏览器上
curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie); //读取cookie
$rs = curl_exec($ch); //执行cURL抓取页面内容
curl_close($ch);
return $rs;
}
//设置post数据
$post = array(
"uname" => "xxxxxxxx",
"passwd" => "xxxxxx",
……
);//这里要传输的数据很重要,决定了能否成功登陆页面,生成cookie文件
//其实只要post的数据正确,一般都能生成cookie文件,之后就很简单了。
//登录地址
$url = "URL";
$cookie = dirname(__FILE__) . '/cookie.txt'; // 设置cookie保存路径
$url2 = "URL"; //登录后要获取信息的页面
login_post($url, $cookie, $post);// 模拟登录
$content = get_content($url2, $cookie);//获取登录页的信息
echo $content.'';//匹配页面信息
$preg = '/\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}/i';
$bool = preg_match($preg,$content,$time);
echo '注册时间:'.$time[0];
2、php抓取页面信息有以下几种方式
(1)file_get_contents($url) 会抓取整个页面,打印返回的结果就是整个页面
(2)file($url)会抓取整个页面,打印返回的结果是一个数组(分页的结果),然后implode之后打印就是整个页面
(3)fopen() 应该和fread() 和fclose() 一起使用来抓取整个页面并在处理后打印整个页面
3、cookies的原理
cookie 是浏览器自动生成的一个小文件,用于在服务器响应客户端请求时,通过在 HTTP 响应头中添加特殊指令(创建 cookie 对象)来保存用户信息和状态。只有当客户端发送请求或浏览器本身具有创建 cookie 的能力时才会创建 cookie。Cookies包括会话cookies(存储在内存中,一旦关闭浏览器就自动销毁,不能被多个窗口共享)和持久cookies(存储在硬盘中,直到过期时间才销毁,可以被多个窗口共享)同一浏览器的窗口)。浏览器发送请求时,会在客户端寻找对应范围的cookie文件。如果有,它将cookie放入http请求头中并发送给服务器,服务器将响应相应的内容。cookie的内容主要包括:名称、值、过期时间、路径和域(这两个构成cookie的作用域)
4、session的原理
Session是存储在服务器端的信息,哈希表的结构。当浏览器向服务器发送请求时,如果请求头中有一个sessionid(一般在一个cookie中,并通过请求头与cookie一起发送),那么服务器会在请求头上找到这个id对应的内容服务器根据 sessionid。请求信息决定是否向客户端返回相关信息。如果没有,则会为用户创建一个会话(只有在服务器端调用HttpServletRequest.getSession(true)语句时才会创建,用户可以决定是否创建文件或数据表等。 ),并将 sessionid 返回给浏览器并保存。在浏览器端传递 sessionid 的方法有很多:
(1)将sessionid保存在cookie中,发送请求时直接附加到请求头中
(2) 通过url重写发送sessionid,即在url后面加上sessionid
步:
1) 在服务器端 php.ini 配置文件中设置: session.use_cookies=0 && session.use_only_cookie=0 session.use_trans_sid=1
2)如果你使用的是nginx,在nginx的根目录下创建一个index.php,内容如下:
然后
一、使用php命令直接解析dos下的php文件(如:php index.php),此时会出现问题:
如果你的lnmp服务器的php版本为5.7或更高,执行上面的php index.php会报错,这里我报告core dumped;
二、浏览器通过ip访问这个文件也会报错
如果你在浏览器设置中禁用了cookies,那么每次刷新页面时,浏览器都会向服务器发送一个请求,但是由于我们在php.ini中设置了sessionid不传递cookies,那么在这个请求的header中有没有 sessionid 信息传输到服务器。服务端收到请求,没有找到sessionid后,会自动生成一个session文件,然后用sessionid响应客户端。这时候客户端禁用cookies后就无法使用了。cookie是用来保存这个sessionid的,所以当你再次刷新页面时,sessionid不能传给服务器进行比对,服务器会生成一个新的session文件,每次刷新一个。
所以客户端不能设置禁用cookies,只需要设置php.ini,且php版本最好5.6及以下,即可成功看到url中的sessionid
那么这一步完成后,如果继续深入调查,就会发现问题,比如:
session_url.php:
一个:PHP:
上述结果的差异可能与nginx的行为有关,没有进一步探索,但是在没有添加ip地址的情况下,如果是同域的文件,一般可以自动显示在url上. 添加会话ID
(3)以隐藏表单的形式传递sessionid,服务器会自动修改表单
可以在表单中设置一个隐藏输入将session_id()传给后端,也可以在后端直接获取session_id(),可以直接使用也可以保存到文件中,这样在访问同一个服务器时,不同的可以在域中使用相同的sessionid;将会话信息保存到数据库中,然后另一台服务器也可以使用文件中的sessionid来访问本服务器中的会话信息,实现会话共享
5、session和cookie的区别
session是保存在服务器端的,sessionid默认是通过cookie保存的,所以如果客户端禁用cookie并且服务器端没有设置trans-sid选项,那么sessionid就没有地方保存了,那么会话将不会被使用;sessionid 一般保存在session cookie中,所以关闭浏览器时找不到sessionid;安全性高,可存储用户名、密码等重要信息。
cookie存储在浏览器端,安全性不如session,可以存储一些不太重要的信息。
6、服务器比对验证码的机制
服务器端请求客户端时,首先随机生成一串字符串并保存在会话中,然后将字符串写入图片发送给浏览器显示。比较存储在 .
7、hosts文件和dns域名解析系统
hosts文件中保存了ip和域名的对应关系。用户访问域名时,需要找到该域名对应的IP。首先,客户端会向本地域名服务器发送请求,本地域名服务器会在自己的映射表中查找该域名对应的IP。如果是,则将ip返回给客户端,如果不是,则继续向根域名服务器发送请求,根域名服务器会在自己中查找所请求域的主域名服务器的ip映射表,然后返回给本地dns,本地dns向主域名服务器发送请求。如果主域名服务器没有找到映射关系,则返回下一级域名服务器ip,直到找到正确的ip,