以上为背景```

----
### 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("\r\n\r\n", $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:(.*?)\n/', $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判断文件类型,抓取效率问题,反爬虫策略。总之爬虫就是尽量模拟用户的行为去抓取页面,反爬虫就是尽量挑出哪些请求是爬虫哪些不是,彼此斗智斗勇。等哪天有对爬虫更深入的研究的时候再继续说吧,就到这里了。

PHP爬虫入门--简单的登录抓取内容的更多相关文章

  1. php爬虫入门 - 登录抓取内容

    PHP 写爬虫 说实话我也想用Python的,毕竟人家招牌.无奈我Python还停留在看语法的阶段,实在太惭愧,鞭笞一下自己加油学习.这里用php的CURL库进行页面抓取. 同事使用的系统需要先登录, ...

  2. Python爬虫入门教程 45-100 Charles抓取兔儿故事-下载小猪佩奇故事-手机APP爬虫部分

    1. Charles抓取兔儿故事背景介绍 之前已经安装了Charles,接下来我将用两篇博客简单写一下关于Charles的使用,今天抓取一下兔儿故事里面关于小猪佩奇的故事. 爬虫编写起来核心的重点是分 ...

  3. scrapy爬虫成长日记之将抓取内容写入mysql数据库

    前面小试了一下scrapy抓取博客园的博客(您可在此查看scrapy爬虫成长日记之创建工程-抽取数据-保存为json格式的数据),但是前面抓取的数据时保存为json格式的文本文件中的.这很显然不满足我 ...

  4. Python爬虫入门教程 46-100 Charles抓取手机收音机-手机APP爬虫部分

    1. 手机收音机-爬前叨叨 今天选了一下,咱盘哪个APP呢,原计划是弄荔枝APP,结果发现竟然没有抓到数据,很遗憾,只能找个没那么圆润的了.搜了一下,找到一个手机收音机 下载量也是不错的. 2. 爬虫 ...

  5. 爬虫学习一系列:urllib2抓取网页内容

    爬虫学习一系列:urllib2抓取网页内容 所谓网页抓取,就是把URL地址中指定的网络资源从网络中读取出来,保存到本地.我们平时在浏览器中通过网址浏览网页,只不过我们看到的是解析过的页面效果,而通过程 ...

  6. python3.4学习笔记(十七) 网络爬虫使用Beautifulsoup4抓取内容

    python3.4学习笔记(十七) 网络爬虫使用Beautifulsoup4抓取内容 Beautiful Soup 是用Python写的一个HTML/XML的解析器,它可以很好的处理不规范标记并生成剖 ...

  7. iOS—网络实用技术OC篇&网络爬虫-使用java语言抓取网络数据

    网络爬虫-使用java语言抓取网络数据 前提:熟悉java语法(能看懂就行) 准备阶段:从网页中获取html代码 实战阶段:将对应的html代码使用java语言解析出来,最后保存到plist文件 上一 ...

  8. iOS开发——网络实用技术OC篇&网络爬虫-使用java语言抓取网络数据

    网络爬虫-使用java语言抓取网络数据 前提:熟悉java语法(能看懂就行) 准备阶段:从网页中获取html代码 实战阶段:将对应的html代码使用java语言解析出来,最后保存到plist文件 上一 ...

  9. python爬虫构建代理ip池抓取数据库的示例代码

    爬虫的小伙伴,肯定经常遇到ip被封的情况,而现在网络上的代理ip免费的已经很难找了,那么现在就用python的requests库从爬取代理ip,创建一个ip代理池,以备使用. 本代码包括ip的爬取,检 ...

随机推荐

  1. FileInputStream 原理总结 把文件作为字节流进行读操作

    package io; import java.io.FileInputStream; import java.io.IOException; public class IOUtil { /** * ...

  2. codeforces 652D D. Nested Segments(离散化+sort+树状数组)

    题目链接: D. Nested Segments time limit per test 2 seconds memory limit per test 256 megabytes input sta ...

  3. linux命令学习笔记( 7 ) : mv 命令

    mv命令是move的缩写,可以用来移动文件或者将文件改名(move (rename) files),是Linux系统下常用的命令, 经常用来备份文件或者目录. .命令格式: mv [选项] 源文件或目 ...

  4. JSTL标签提示:"items" does not support runtime expressions

    今天在使用JSTL的 c:forEach 标签时,jsp提示:"items" does not support runtime expressions,后来才发现是因为taglib ...

  5. Cassini(卡西尼)投影

     

  6. POJ1112 Team Them Up!

    Team them up! Input file teams.in Output file teams.out Your task is to divide a number of persons i ...

  7. jquery--find与children方法的区别

      children方法: find方法: 通过以上的解释,可以总结如下: 1:children及find方法都用是用来获得element的子elements的,两者都不会返回 text node,就 ...

  8. BZOJ1636&&1699:[USACO2007JAN]Balanced Lineup

    浅谈\(RMQ\):https://www.cnblogs.com/AKMer/p/10128219.html 题目传送门:https://lydsy.com/JudgeOnline/problem. ...

  9. NSDictionary 用法

    //Dictionary //不可变 //字典里面:是以键值对存放的 //字典存放顺序是无序的 //字典里面:value可以重复,但key不能重复 //字典里面:key一般用字符串表示,value可用 ...

  10. asp.net异常处理和错误页配置

    最近做一个项目,直接拷贝了前辈写的程序,结果报错了查了半天都没查出原因,也看不出哪里报错,最后发现有一个错误被try...catch了,所以我们做项目的时候一般不需要try...catch. 假设所有 ...