php curl模拟登陆抓取数据

  最近由于项目的需要,需要做数据抓取,也就是用的curl相关的函数库,在这之前还真心没有接触过这么高大上的东西,然后从刚开始到今天才研究curl算是第四天了,写这篇博客记录一下这几天的一个过程,在使用curl模拟登陆抓取数据过程中需要注意的一些事项,以及介绍一款支持跨平台(windows、linux、mac)的抓包软件 charles(这个软件是收费的,但是你不花钱也可以使用) ,想要尽快上手,必须要去熟悉两个东西:http协议、curl的相关参数选项的作用

一、介绍curl

  这是curl的维基百科地址:https://zh.wikipedia.org/wiki/CURL,有兴趣的朋友可以去看看

  curl支持的通讯协定:FTP、FTPS、HTTP、HTTPS、TFTP、SFTP、Gopher、SCP、Telnet、DICT、FILE、LDAP、LDAPS、IMAP、POP3、SMTP和RTSP

  curl可以做的事情有很多,向我们经常用到很多的就是模拟登陆,抓取一些数据,上传下载文件啥的,其他的一些高深的估计很少接触到,我最近也就接触了模拟登陆啥的

二、curl的使用

  curl的使用很简单,主要分为四部:

  1>.curl_init();//初始化 cURL 会话

  2>.curl_setopt();//设置 cURL 传输选项(这一步也是最重要的,也是最复杂的它有很多参数,大家可以看一下php官方信息:http://php.net/manual/zh/function.curl-setopt.php)

  3>.curl_exec();//执行 cURL 会话

  4>.curl_close();//关闭 cURL 会话

  要想使用好curl,必须去看curl相关的传输参数(http://php.net/manual/zh/function.curl-setopt.php),不需要记住,只要有个印象就行,把常用的几个记住就行了

三、curl模拟登陆

  1.准备工作:既然是模拟登陆,那就要像那么回事,要模拟浏览器发生登陆请求一样,所以我们要模拟登陆某个网站之前,需要对该网站进行抓包,来分析这个网站登陆的时候都传了些什么参数、传的参数是否加密、加密方式是什么、发送请求的heder里边都有些啥、传输的方式是啥、是什么通信协议(http、https)、是否有图片验证码、获取的登陆地址是否有重定向302等等这些东西你都要去观察,把这些东西都搞清楚了,你才能进行模拟登陆(当然了,首先你自己要有这个网站的账户密码,不然你拿什么来使用curl模拟登陆,对不对?)

  2.开始阶段:

    a.获取cookie,这一步至关重要,你要模拟登陆必须要先获取网站的cookie,之前伪造下 USER-AGENT 就可以抓数据,但是现在却不行了,没有cookie的话就相当于没有身份,你都没有身份,那网站肯定拒绝你的任何操作,简单点说这就是个标志,下面是获取cookie的代码:

# 1.获取cookie
    $cookie_file = dirname(__FILE__) . ‘/cookie.txt‘;//保存cookie的文件
    $login_url   = "http://xxxxxxxxxxxxxx";//登陆页面网址

    $cookie_curl = curl_init();
    $timeout     = 5;
    curl_setopt($cookie_curl, CURLOPT_URL, $login_url);
    curl_setopt($cookie_curl, CURLOPT_RETURNTRANSFER, 1);//将curl_exec()获取的信息以字符串返回,而不是直接输出。
    curl_setopt($cookie_curl, CURLOPT_CONNECTTIMEOUT, $timeout);//在尝试连接时等待的秒数。设置为0,则无限等待
    curl_setopt($cookie_curl, CURLOPT_COOKIEJAR,$cookie_file); //获取COOKIE并存储,在执行curl_close连接介绍,保存获取的cookie的文件
    $contents = curl_exec($cookie_curl);
    curl_close($cookie_curl);

    b.获取图片验证码(针对没有图片验证码的网站可以忽略),这一步也是重要的一环,图片验证码要是获取的不正确,你是没有办法登陆成功的

  # 2.获取验证码
    $cookie_file         = dirname(__FILE__) . ‘/cookie.txt‘;//保存cookie的文件
    $verify_code_url     = "http://xxxxxxxxxxxx";//获取图片验证码url
    $verify_code_referer = "http://xxxxxxxxxxxx";//登陆页面url
    $verify_curl         = curl_init();
    curl_setopt($verify_curl, CURLOPT_URL, $verify_code_url);
    curl_setopt($verify_curl, CURLOPT_COOKIEFILE, $cookie_file);//第一步获取的cookie文件
    curl_setopt($verify_curl, CURLOPT_HEADER, 0);//启用时会将头文件的信息作为数据流输出。
    // curl_setopt($verify_curl, CURLOPT_HTTPHEADER, array($login_url_header[‘2‘]));//获取验证码需要的header数据
    curl_setopt($verify_curl, CURLOPT_REFERER, $verify_code_referer);//在HTTP请求头中"Referer: "的内容,访问来源
    curl_setopt($verify_curl, CURLOPT_RETURNTRANSFER, 1);//将curl_exec()获取的信息以字符串返回,而不是直接输出。
    $img = curl_exec($verify_curl);
    curl_close($verify_curl);
    $fp = fopen("verifyCode.jpg","w");//将获取的验证码写入图片中
    fwrite($fp,$img);
    fclose($fp);

    注意:(1).获取图片验证码url后面一般会跟一个参数,那就是时间戳(什么毫秒级别的、中国标准时间),有可能需要函数处理一下这些参数,我遇到的是需要使用 urlencode 来处理参数,参数格式什么不正确是获取不到验证码的;(2).那就是代码中注释的一行,CURLOPT_HTTPHEADER  这个参数的作用是设置请求时的header头数据,有些网站比较严格,就需要,还有像什么 CURLOPT_REFERERCURLOPT_USERAGENT  这些参数,在你试了上面的方法不行的时候,就试着把这几个参数的值补上试试;(3).这里获取了图片验证码,网上有些人是使用代码,暂停20秒,我们人为的去查看这个图片验证码的值,然后写到一个txt的文件中,然后再用file_get_contents读取出我们填写的验证码;当然你也可以使用其他的办法,怎么方便就怎么来吧(代码:sleep(20);$code = file_get_contents("./code_bj.txt");)。

    c.拼接登陆需要发送的数据,以及数据是否加密,使用什么方式加密,这些都需要处理,这里的数据不能是二维数组 ,只能是一维数组(key=>value),或者是"&username=zhangsan&password=123456&code=2z2s",以上两种格式都行,在传输数据时,如果是一维数组格式的,需要使用函数 http_build_query 进行相应的处理,代码如下:  

  //提交的参数有两种格式
    # 1.一维数组(绝对不能是二维数组)
    $post = array(
                ‘username‘ => ‘zhangsan‘,
                ‘password‘ => ‘123456‘,
                ‘code‘     => ‘2z2s‘,
            );
    # 1.1一维数组格式在传输时需要使用函数(http_build_query)处理
    curl_setopt($curl, CURLOPT_POST, 1);//post方式提交
    curl_setopt($curl, CURLOPT_POSTFIELDS, http_build_query($post));

    # 2.字符串形式
    $post = "&username=zhangsan&password=123456&code=2z2s";
    # 2.1一维数组格式在传输时需要使用函数(http_build_query)处理
    curl_setopt($curl, CURLOPT_POST, 1);//post方式提交
    curl_setopt($curl, CURLOPT_POSTFIELDS, $post);

  3.模拟登陆,代码如下:

  # 3.模拟登陆
    $cookie_file    = dirname(__FILE__) . ‘/cookie.txt‘;//保存cookie的文件
    $submit_url     = ‘http://xxxxxxxxxxxx‘;//数据提交的url(form表单提交数据的地址)
    $submit_referer = "http://xxxxxxxxxxxx";//登陆页面url
    $submit_curl    = curl_init();//初始化curl模块
    curl_setopt($submit_curl, CURLOPT_URL, $submit_url);//登录提交的地址
    curl_setopt($submit_curl, CURLOPT_HEADER, 0);//是否显示头信息
    curl_setopt($submit_curl, CURLOPT_RETURNTRANSFER, 1);//将curl_exec()获取的信息以字符串返回,而不是直接输出。
    curl_setopt($submit_curl, CURLOPT_COOKIEFILE, $cookie_file); //设置Cookie信息保存在指定的文件中
    curl_setopt($submit_curl, CURLOPT_REFERER, $submit_referer);//来源
    curl_setopt($submit_curl, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.155 Safari/537.36");//来路
    curl_setopt($submit_curl, CURLOPT_HTTPHEADER, array(‘Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8‘,‘Upgrade-Insecure-Requests: 1‘,‘Content-Type: application/x-www-form-urlencoded‘,‘Accept-Encoding: gzip, deflate‘,‘Accept-Language: zh-CN,zh;q=0.8‘,‘Content-Length:‘.strlen($post)));
    curl_setopt($submit_curl, CURLOPT_POST, 1);//post方式提交(这里我使用的数据格式是字符串拼接格式)
    curl_setopt($submit_curl, CURLOPT_POSTFIELDS, $post);//要提交的信息
    $contents = curl_exec($submit_curl);//执行cURL
    curl_close($submit_curl);//关闭cURL资源,并且释放系统资源

   感兴趣的输出上面的结果集,看看是什么就知道了,到此模拟登陆就成功了,接下来就做你想做的事情,比如登陆成功后你要获取你用户个人中心的账户姓名,头像,手机号等等信息都是可以的

  4.总结

    1.在使用curl的时候,一定要先去看看curl相关参数,不然会带来很无聊的麻烦(本人就是,把CURLOPT_COOKIEJAR和CURLOPT_COOKIEFILE搞错了,结果找了半天才找到原因)

    2.在模拟登陆之前一定要仔细分析网站登陆的过程都发生了些什么,使用抓包工具,抓取数据进行分析,一些网站比较严格的,你必须要加上几个参数:CURLOPT_REFERER(访问来源,从哪个网页过来的)、CURLOPT_USERAGENT(仿造来路咯!模拟是google发的请求或者火狐发的请求)、CURLOPT_HTTPHEADER(这个很关键,就是发送请求的网址的请求头--request header,看看里面都有哪些参数,必要的时候,在模拟发请求的时候把这些header参数全部设置上去,成功几率很大哦!)

    3.一定要有耐心,前期把抓包分析工作做仔细,多看看http协议和curl参数,祝君成功!

  暂时就先写这么多,以上内容纯属我自己实践,如有错误欢迎批评指正,谢谢!!!

时间: 2024-08-25 06:37:21

php curl模拟登陆抓取数据的相关文章

Java模拟新浪微博登陆抓取数据

前言:  兄弟们来了来了,最近有人在问如何模拟新浪微博登陆抓取数据,我听后默默地抽了一口老烟,暗暗的对自己说,老汉是时候该你出场了,所以今天有时间就整理整理,浅谈一二. 首先:  要想登陆新浪微博需要预登陆,即是将账号base64加密,密码rsa加密以及请求http://login.sina.com.cn/sso/prelogin.php链接获取一些登陆需要参数,返回的接送字符串如: {"retcode":0,"servertime":1487292003,&quo

PHP curl模拟浏览器抓取网站信息

curl是一个利用URL语法在命令行方式下工作的文件传输工具. 官方解释 curl是一个利用URL语法在命令行方式下工作的文件传输工具.curl是一个利用URL语法在命令行方式下工作的文件传输工具.它支持很多协议:FTP, FTPS, HTTP, HTTPS, GOPHER, TELNET, DICT, FILE 以及 LDAP.curl同样支持HTTPS认证,HTTP POST方法, HTTP PUT方法, FTP上传, kerberos认证, HTTP上传, 代理服务器, cookies,

C# WebBrowser控件 模拟登录 抓取数据

参考博客:C#中的WebBrowser控件的使用 参考博客:C#中利用WebBrowser控件,获得HTML源码 一.问题点: 1.模拟登录后,如果带有嵌套的iframe嵌套,不好读取iframe内容,可以直接指定iframe抓取网址 2.C# 清除WebBrowser控件的Session和Cookie 参考文档:http://www.360doc.com/content/14/0810/12/9200790_400769010.shtml 代码如下: [DllImport("wininet.d

使用PHP curl模拟浏览器抓取网站信息

curl是一个利用URL语法在命令行方式下工作的文件传输工具.curl是一个利用URL语法在命令行方式下工作的文件传输工具.它支持很多协议:FTP, FTPS, HTTP, HTTPS, GOPHER, TELNET, DICT, FILE 以及 LDAP.curl同样支持HTTPS认证,HTTP POST方法, HTTP PUT方法, FTP上传, kerberos认证, HTTP上传, 代理服务器, cookies, 用户名/密码认证, 下载文件断点续传,上载文件断点续传, http代理服务

python3下scrapy爬虫(第五卷:利用cookie模拟登陆抓取个人中心页面)

之前我们爬取的都是那些无需登录就要可以使用的网站但是当我们想爬取自己或他人的个人中心时就需要做登录,一般进入登录页面有两种 ,一个是独立页面登陆,另一个是弹窗,我们先不管验证码登陆的问题 ,现在试一下直接登陆的爬取: 爬虫是模拟人的行为来请求网页读取数据的现在我们划分一下过程,从登陆到获取: 先看一下我们到个人中心的过程: 登陆界面->输入账号密码->进入个人中心 1 进入登陆页面 可以说是第一次请求 此时会产生相应的COOKIE值,因为你只要先进入到页面才可以进行密码输入等行为 cookie

curl模拟多线程抓取网页(优化)

通过上篇文章清楚了通过curl_multi_*函数可以一次请求多个url,但是也留下了问题,就是结果要等所有数据请求结束一起返回,才能逐个处理数据.优化代码,使先成功请求的url先返回处理结果,而不是等着所有一起返回. //修改后的模型 do { while (($execrun = curl_multi_exec($mh, $running)) == CURLM_CALL_MULTI_PERFORM) ; //CURLM_OK只是意味着数据传送完毕或者没有数据 可传送 if ($execrun

PHP Curl模拟登录并抓取数据

使用PHP的Curl扩展库可以模拟实现登录,并抓取一些需要用户账号登录以后才能查看的数据.具体实现的流程如下(个人总结): 1. 首先需要对相应的登录页面的html源代码进行分析,获得一些必要的信息: (1)登录页面的地址: (2)验证码的地址: (3)登录表单需要提交的各个字段的名称和提交方式: (4)登录表单提交的地址: (5)另外要需要知道要抓取的数据所在的地址. 2. 获取cookie并存储(针对使用cookie文件的网站): $login_url = 'http://www.xxxxx

PHP的cURL库:抓取网页,POST数据及其他,HTTP认证 抓取数据

From : http://developer.51cto.com/art/200904/121739.htm 下面是一个小例程: ﹤?php// 初始化一个 cURL 对象$curl = curl_init(); // 设置你需要抓取的URLcurl_setopt($curl, CURLOPT_URL, 'http://cocre.com'); // 设置headercurl_setopt($curl, CURLOPT_HEADER, 1); // 设置cURL 参数,要求结果保存到字符串中还

模拟web访问有登录且有验证码的登录后抓取数据

模拟web访问有登录且有验证码的登录后抓取数据 1 取验证码 1 在窗体上放一个picturebox (imgValidate)存放获取的验证码图片, 2 用浏览器的开发者工具firefox (f12) 分析出验证码的网址 private void GetValidateImage() { cookies = new CookieContainer(); string strUrl = "http://www.xxx.com/ValidateCodePicture.aspx?Key="