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("\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爬虫入门 - 登录抓取内容的更多相关文章
- python3.4学习笔记(十七) 网络爬虫使用Beautifulsoup4抓取内容
python3.4学习笔记(十七) 网络爬虫使用Beautifulsoup4抓取内容 Beautiful Soup 是用Python写的一个HTML/XML的解析器,它可以很好的处理不规范标记并生成剖 ...
- 第三百四十一节,Python分布式爬虫打造搜索引擎Scrapy精讲—编写spiders爬虫文件循环抓取内容—meta属性返回指定值给回调函数—Scrapy内置图片下载器
第三百四十一节,Python分布式爬虫打造搜索引擎Scrapy精讲—编写spiders爬虫文件循环抓取内容—meta属性返回指定值给回调函数—Scrapy内置图片下载器 编写spiders爬虫文件循环 ...
- 二十 Python分布式爬虫打造搜索引擎Scrapy精讲—编写spiders爬虫文件循环抓取内容—meta属性返回指定值给回调函数—Scrapy内置图片下载器
编写spiders爬虫文件循环抓取内容 Request()方法,将指定的url地址添加到下载器下载页面,两个必须参数, 参数: url='url' callback=页面处理函数 使用时需要yield ...
- PHP爬虫入门--简单的登录抓取内容
给同事写一个小工具,抓取月报表然后统计加工.第一反应是做一个爬虫把需要的表和图抓下来,这样就不用再自己去连数据库然后组织表格生成图片之类的. 以上为背景 PHP 写爬虫 说实话我也想用Python的, ...
- Java模拟登录系统抓取内容【转载】
没有看考勤的习惯,导致我的一天班白上了,都是钱啊,系统也不发个邮件通知下.... 为了避免以后还有类似状况特别写了个java模拟登录抓取考勤内容的方法(部分代码来自网络),希望有人修改后也可以 ...
- 爬虫入门之爬取策略 XPath与bs4实现(五)
爬虫入门之爬取策略 XPath与bs4实现(五) 在爬虫系统中,待抓取URL队列是很重要的一部分.待抓取URL队列中的URL以什么样的顺序排列也是一个很重要的问题,因为这涉及到先抓取那个页面,后抓取哪 ...
- 如何让Python爬虫一天抓取100万张网页
前言 文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者: 王平 源自:猿人学Python PS:如有需要Python学习资料的 ...
- PHP网络爬虫实践:抓取百度搜索结果,并分析数据结构
百度的搜索引擎有反爬虫机制,我先直接用guzzle试试水.代码如下: <?php /** * Created by Benjiemin * Date: 2020/3/5 * Time: 14:5 ...
- php正则表达式,在抓取内容进行匹配的时候表现不稳定
最近做了一个 抓取内容的程序,使用php的正则表达式对抓取的内容进行匹配,当进行大量匹配运算的时候,发现偶尔会出现匹配失败的情况.检查不出任何原因. 匹配失败导致匹配结果为空,最终导致写入数据库失败. ...
随机推荐
- 不装插件,查看.rp文件
AxShare国内平台地址:http://share.axure.org临时急用可以使用公用帐户.用户名:axure@webppd.com,密码:webppd123 上传.rp文件,点击 url 地址 ...
- jmeter的基本功能使用详解
jmeter是apache公司基于java开发的一款开源压力测试工具,体积小,功能全,使用方便,是一个比较轻量级的测试工具,使用起来非常简 单.因为jmeter是java开发的,所以运行的时候必须先要 ...
- git操作:WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! (警告:远程主机标识已更改!)
问题背景: 前几日,把云服务器系统由centos改成Ubuntu之后,重新搭建的git服务器环境. 问题描述: 从本机不能clone远程git仓库. 报错如下: @@@@@@@@@@@@@@@@@@@ ...
- vue-cli 构建的项目中 如何使用less
vue-cli 构建的项目默认是不支持 less 的,需要自己添加. 首选,安装 less 和 less-loader ,在项目目录下运行如下命令 npm install less less-load ...
- Yarn集群的搭建、Yarn的架构和WordCount程序在集群提交方式
一.Yarn集群概述及搭建 1.Mapreduce程序运行在多台机器的集群上,而且在运行是要使用很多maptask和reducertask,这个过程中需要一个自动化任务调度平台来调度任务,分配资源,这 ...
- yum clear all无反应
卸载重装yum 操作系统版本:centos7 [root@linux-node3 ~]# uname -r 3.10.0-514.el7.x86_64 一.将现有的yum源卸载 [root@linux ...
- 使用第三方插件Gear Tacks 画齿轮
以下介绍第二种方法: 重复再生成一个大的齿轮 两个都保存起来: 再创建一个装配体环境. 接下来就是要达到使两个轮子配合转起来的效果! 步骤如下:
- Django 启动源码
handler = self.get_handler(*args, **options) run(self.addr, int(self.port), handler,ipv6=self.use_ip ...
- vue中,对象数组多层嵌套时,更新数据更新页面
vue中的对象和数组的元素直接赋值修改时,是不能响应到view中去的 1.对象更新 this.a={title:'列表1’}; this.a.title='列表2’; <h1>{{a.ti ...
- angular.isArray()
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...