网贷之家的爬虫之旅

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS PostgreSQL,集群系列 2核4GB
简介: [导读]  因为本人公司正处于P2P的行业,分析行业数据,对平台的运营决策有着很大的作用,因此需要爬网贷之家的相关数据。 1、分析        通过右键查看页面源代码发现页面结构为表格布局,因此设想可以分为四个步骤来采集数据:       1、使用爬虫将页面抓取下来;       2、对页面数据进行解析;       3、入库(mysql);       4、写个定时服务每天定时抓取。

[导读]  因为本人公司正处于P2P的行业,分析行业数据,对平台的运营决策有着很大的作用,因此需要爬网贷之家的相关数据。

1、分析

       通过右键查看页面源代码发现页面结构为表格布局,因此设想可以分为四个步骤来采集数据:

      1、使用爬虫将页面抓取下来;

      2、对页面数据进行解析;

      3、入库(mysql);

      4、写个定时服务每天定时抓取。

      因为公司网站使用PHP,最近也学习了一点,curl非常适合用来爬去网页,决定用PHP程序进行抓取。

image

2、抓取页面

       网贷之家有一个数据的二级域名,展示所有接入的P2P公司的各种成交数据,输入日期可以查询对应日期的数据(http://shuju.wangdaizhijia.com/indexs-0-0-0-400-0-0.html?startTime=2015-04-04&endTime=2015-04-04),分析url发现只要改变后面的日期就可以分别的抓取各个日期下的数据,分析完毕,找一个url开始抓取;有一个小插曲,刚开始抓取的时候,返回的页面信息都是404.html,最后分析发现网站对非浏览器的请求进行了屏蔽,直接跳转404。后台加绿色代码的部分,成功抓取数据。

function crawl($url){
         $ch = curl_init();
         curl_setopt($ch, CURLOPT_URL, $url);
         curl_setopt($ch, CURLOPT_HEADER, false);
         

curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; .NET CLR 1.1.4322)');

         curl_setopt($curl, CURLOPT_POST, 1); 
         curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
         $result=curl_exec($ch);
         curl_close($ch);
         return $result;
    }

3、解析数据

     查看页面源代码发现,第一行为title去掉,最后两列为平台的连接和关注,均过滤掉。第一列的id需要根据下列的连接来截取,中间的所有数据会有汉子的单位和一些特殊字符,使用preg_replace进行替换,最后按照网贷之家平台的数据格式进行拼接入库的SQL,返回done。

function  analyze($dom,$satTime){
        $html = new simple_html_dom();
        $sql= "insert into XXX_data (XXPlatId,platName,averageMonth,dayTotal,averageRate,investNumber,averageInvestMoney,averageBorrowTime,borrowNumer,borrowBidNumber,averageBorrowMoney,firstTenInvestRate,firstTenBorrowRate,bidEndTime,registerTime,registerMoney,leverageFund,invest30total,repay60total,repayTotal,statisticsTime,excuteTime) values ";                
        $html->load($dom);
        $istitle=0;
        foreach($html->find('tr') as $tr){
          $istitle=$istitle+1;
          if($istitle==1){
            continue;
          }
          $sql.="(";
          $count=0;
          foreach($tr->find('td') as $element){       
              $count=$count+1;
              if($count==1){
                $href=$element->next_sibling()->find('a', 0)->href;
                $href=strstr($href, '.', TRUE);
                $href=strstr($href,'-');            
                $sql.="'".substr($href,1)."',";
              }elseif($count==2){
                $val=$element->find('a', 0)->innertext;
                $sql.="'".$val."',";
              }elseif($count<21){
                $patterns = array();
                $patterns[0] = '/([\x80-\xff]*)/i';
                $patterns[1] = '/[%*]/';
                $val=preg_replace($patterns,'',$element->innertext);
                $sql.="'".$val."',";
              }
          }
          $sql.="'".$satTime."','".date('Y-m-d H:i:s')."'),";    
        } 
        $sql = substr($sql,0,strlen($sql)-1);
        $sql = strip_tags($sql);
        return $sql;
    }

4、入库

         通过网上的查找学习,发现PHP操作mysql比起java来说更简单,几句代码搞定.

 function  save($sql){
        $con = mysql_connect("192.168.0.1","root","root");
        if (!$con){
           die('Could not connect: ' . mysql_error());
        }
        mysql_select_db("xx_data", $con);
        mysql_query("set names utf8");
        mysql_query($sql);
        mysql_close($con);
    }

5、批量爬取

     通过分析数据的查询条件,每次的查询都是根据url后缀的日期来查询当日交易数据,  http://XXX/indexs.html?startTime=2015-04-01&endTime=2015-04-01,因为只需要遍历历史日期来拼接URl就用来爬取历史的所有交易。

function execute(){
      $starttime="2014-04-15";
      $endtime="2015-04-15";
      for($start = strtotime($starttime); $start <= strtotime($endtime);$start += 86400){
         $date=date('Y-m-d',$start);
         $url="http://shuju.XX.com/indexs.html?startTime=".$date."&endTime=".$date;
         //第一步 抓取
         $dom=crawl($url);
         //第二步  解析
         $sql=analyze($dom,$date);
         //第三步 入库
         save($sql);
     }
      echo  "execute end";
    }
     
     execute();

6、设置定时服务

       设置定时任务来每天固定时间来抓取最新的数据,以免每次手工来执行,php也有自己的定时任务,但是网上看了下实现起来太复杂,因此利用linux的crontab来实现,linux下面输入crontab –e 进入编辑状态,添加一条定时利用curl来调用,至此爬虫功能完毕。

    30 09 * * * curl  http://192.168.0.1/crawl.php

 

此程序仅供学习交流,如果有需要完整源码的朋友可以单独联系我。

相关文章
|
6月前
|
前端开发 JavaScript 开发者
【杂谈】做独立开发者赚钱吗?
最近看一些论坛上,独立开发越来越火爆🔥。 例如 1. xxx网站SEO做的好,靠网站广告月入3000dollar 2. 开发了xxx软件,上架 Apple Store,睡后收入可以不用上班等~
218 0
|
消息中间件 设计模式 存储
查漏补缺第六期(京东一面)
前言 目前正在出一个查漏补缺专题系列教程, 篇幅会较多, 喜欢的话,给个关注❤️ ~ 本专题主要以Java语言为主, 好了, 废话不多说直接开整吧~ Kafka的应用场景有哪些,在项目里是如何应用的 Kafka 是一个高吞吐量、可扩展的分布式流处理平台,主要用于构建实时数据流应用程序和数据管道。以下是一些Kafka的应用场景:
|
JSON 运维 前端开发
分享 10 个我常逛的国外技术社区,真的受益匪浅
分享 10 个我常逛的国外技术社区,真的受益匪浅
|
6月前
大咖与小白的日常:不会开发,如何快速搭建公司网站?
开发哥哥需求多到排不过来,产品经理又要加。有没有不需要开发代码搭建网站的办法,让小白也能上手?
|
XML 数据采集 Web App开发
学习XPath助力爬取中秋各大电商平台数据
学习XPath助力爬取中秋各大电商平台数据
121 0
学习XPath助力爬取中秋各大电商平台数据
|
数据采集 前端开发 NoSQL
听说你到现在还不会爬取携程评论?
这几天在辰哥的技术交流群里有读者反应说不会爬取携程的评论数据,今天辰哥给读者安排上。作为辰哥的文章读者,辰哥必须教会大家如何爬取携程评论数据(哈哈哈)。 下面就以长隆野生动物世界为例,讲解如何去爬取携程评论数据。
239 0
|
移动开发 开发工具 双11
你知道现在很火的APP推广神器Deeplink是什么吗?
Deeplink,又叫深度链接技术,是指在App/短信/广告里点击链接,能直接跳转到目标App具体位置的技术,深度链接打破了网站与App间的壁垒,成为实现网站与App相互跳转的桥梁。
|
JSON 运维 前端开发
分享 10个我常逛的国外技术社区,真的受益匪浅!
国内技术博客满足不了你?那来看看这些吧!
3498 0
分享 10个我常逛的国外技术社区,真的受益匪浅!
|
数据采集 移动开发 算法
【云栖号案例 | 教育与科研机构】上学帮上云 阿里云助力教育资讯平台防爬虫
上学帮短信接口存在被盗刷情况、平台没有成熟的爬虫情报,担心影响正常的搜索访问。上云后在实现防爬的同时,没有影响业务平台正常使用和搜索排名。
【云栖号案例 | 教育与科研机构】上学帮上云 阿里云助力教育资讯平台防爬虫
【官方】支付宝小程序创新讲堂开课啦
本周的蚂蚁金服科技创新讲堂我们请来了老朋友五方同学给大家讲解小程序模板消息的接入教程。 模板消息功能适用于开发者高效触达用户的场景,比如:交易状态、物流进度等,促进商户与用户互动,提升商户精细化运营等。
2431 0