zoukankan      html  css  js  c++  java
  • PHP爬虫入门--简单的登录抓取内容

    以上为背景```
    
    ----
    ### PHP 写爬虫 ###
      说实话我也想用Python的,毕竟人家招牌。无奈我Python还停留在看语法的阶段,实在太惭愧,鞭笞一下自己加油学习。这里用php的CURL库进行页面抓取。
      同事使用的系统需要先登录,然后有很多自定义图表。每个图表有一个`graph_id`,根据`graph_id`可以导出某段时间的csv格式报表以及对应的图形png。
    #### 1. 登录cookie ####
      可能做爬虫遇到的第一关就是登录了,通常你要抓取的网页需要先验证登录用户。我们知道通常用户会话状态都是通过`SessionID`来识别,而`SessionID`通过`cookie`保存到客户端。所以当你要先登录在抓取页面的时候,先请求登录接口,获取到`cookie`保存到本地,后面抓取内容的时候每次带上这个`cookie`文件就可以了。保存`cookie`的CURL选项*`CURLOPT_COOKIEJAR`*:
    
        # 保存cookie的代码
        $this->cookie_file = '/tmp/cookie.curl.tmp';
        curl_setopt($ch, CURLOPT_COOKIEJAR      , $this->cookie_file);
    
      然后页面抓取的时候通过设置*`CURLOPT_COOKIEFILE`*带上这个cookie:
    
        # 设置cookie的代码
        curl_setopt($ch, CURLOPT_COOKIEFILE     , $this->cookie_file);
    
    #### 2. 页面重定向 ####
      解决了会话session的问题,第二的头疼的就是`302`和`301`重定向了。重定向的页面response一般没有body部分,头部大概长这样:
    
        HTTP/1.1 302 Found
        Date: Thu, 29 Jun 2017 09:49:51 GMT
        Server: Apache/2.2.15 (CentOS)
        ...
        Location: curl_test.php?action=real_page
        Content-Length: 0
        Connection: close
        Content-Type: text/html; charset=UTF-8
    
      那怎么办呢?仔细观察头部信息可以发现里面包含了重定向的目标页面`Location: xxx...`。而CURL可以通过`curl_getinfo($ch, CURLINFO_HTTP_CODE)`来获取http状态码,到这里似乎就很清楚接下来该干嘛了。
    
            // 获取的curl结果
            $re = curl_exec($ch);
            list ($header, $body) = explode("
    
    ", $re, 2);
            $http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
            // 有的网站会检查referer地址来判断是否请求来自重定向,这里保存上次请求的url供重定向构造referer使用
            $last_url = curl_getinfo($ch, CURLINFO_EFFECTIVE_URL);
            curl_close($ch);
            if ($http_code == 301 || $http_code == 302) {
                if (preg_match('/Location:(.*?)
    /', $header, $matches)) {
                    // 继续抓取目标页面
                    $urlinfo = parse_url($url);
                    // 这里match的url地址可能不一样,所以不一定这么简单的拼接就行
                    $re_url = $urlinfo['scheme'] . '://' . $urlinfo['host'] . substr($urlinfo['path'], 0, strrpos($urlinfo['path'], '/')+1) . trim($matches[1]);
                    return $this->_http_get($re_url, $last_url);
                } else {
                    return FALSE;
                }
            } else if ($http_code == 200) {
                return $body;
            } else {
                echo 'Error: CURL failed.[url='.$url.']; [http code= '. $http_code.']';
                return FALSE;
            }
    
      有的网站会检查referer地址来判断是否请求来自重定向,通过设置curl的`CURLOPT_REFERER`参数来伪造`HTTP_REFERER`。
    
    ### 小结 ###
      以上可以说是最最基础的爬虫知识,至于正则这里就不介绍了。再往后可能就是下载内容根据Content-type判断文件类型,抓取效率问题,反爬虫策略。总之爬虫就是尽量模拟用户的行为去抓取页面,反爬虫就是尽量挑出哪些请求是爬虫哪些不是,彼此斗智斗勇。等哪天有对爬虫更深入的研究的时候再继续说吧,就到这里了。
  • 相关阅读:
    549 小程序阶段2:小程序架构和配置
    548 小程序阶段1:邂逅小程序开发
    546 JavaScript的 动态 import 导入
    544 Promise.allSettled,可选链操作符 --> ?.
    543 class类的私有属性
    542 Array.prototype.flat 与 flatMap
    540 Object.fromEntries,trimStart 和 trimEnd
    539 对象的rest、spread 属性
    简单梳理Redux的源码与运行机制
    7个有用的Vue开发技巧
  • 原文地址:https://www.cnblogs.com/dapianzi/p/7095594.html
Copyright © 2011-2022 走看看