用php写爬虫去爬数据

这里是我自己写的一个小需求

<?php
/**
采集http://www.959.cn/school,即时更新的最新的文章内容;每分钟采集一次。采集结束后实时入库并展示。
*/
header("Content-Type: text/html;charset=utf-8");
date_default_timezone_set('PRC');
$con = mysqli_connect('127.0.0.1', 'xxxxx', 'xxxxx', 'xxxxx');
mysqli_set_charset($con,'UTF8');

// 日志位置
//把当前的最新一条文章的id.shtml的id 存入一个max.log的文件中,实时读取 实时更改
$log_path = '/home/logs';
if(!file_exists($log_path)){
        mkdir($log_path,0755,true);
}
$max_log = $log_path.'/kecheng_max.log';
$path = './img/';
$max = file_get_contents($max_log) ? file_get_contents($max_log) : 4613925; //当前的最新一条文章的id.shtml的id

//记录日志
$message_log = $log_path.'/kecheng_message.log';

$now_max = 0; //当前网站实际的最新一条的文章的id.shtml的id
$url = "http://www.959.cn/school/kecheng/";//要爬取的网址
$res = file_get_contents("compress.zlib://".$url);//curl封装方法
//var_dump($con);die;
preg_match_all('/<h3>.*<\/h3>/',$res,$arr_all);//文章列表内容
//var_dump($arr_all[0]);
foreach($arr_all[0] as $k => $v){
    // 先去匹配a标签 如果不是a标签直接继续下一个
    preg_match_all('/<a href="(.*)">.*<\/a>/',$v,$v_all);
    if (empty($v_all[1])){// 不是a标签
        continue;
    }

    $title =  strip_tags($v_all[0][0]); //文章标题
    $href = $v_all[1][0];//url

    // 截取当前url的shtml前面的id
    $href_one = substr($href, strrpos($href, '/')+1);
    $href_id = substr($href_one, 0, strpos($href_one, '.'));

    if ($k === 0) {
        $now_max = $href_id;
    }

    if ($href_id <=  $max){ // 只爬大于保存的最大id的数据
        $max = file_put_contents($max_log, $now_max, LOCK_EX); // 爬完之后让maxid更新为最新的
        break;
    }

    // 获取标题缩略图
    preg_match_all('/<img src="(.*)" alt="'.$title.'" \/>/',$res,$title_img);
    $title_img_url = $title_img[1][0];
    if(!file_exists($path)){
        mkdir($path,0755,true);
    }
    $title_img = file_get_contents ("http:{$title_img_url}");
    $cover_img_name = microtime_float().'.jpg';
    file_put_contents($path.$cover_img_name, $title_img);
    $cover_img = '/public/uploads/img/'.date('Y/md',time()).'/'.$cover_img_name; // 标题缩略图位置

    // 获取文章内容
    $article_res = file_get_contents("compress.zlib://".$href);
    //var_dump($article_res);die;
    $article_res = trimall($article_res);
    //var_dump($article_res);die;
    preg_match_all('/<div class="detail">(.*?)<\/div>/',$article_res,$article_all);//文章详情内容

    $text = $article_all[1][0]; // 文章内容
    //var_dump($text);die;

    //筛选图片 并下载到本地
    preg_match_all('/<img .*? src="(.*?)" .*? \/>/',$article_all[1][0],$img_all); //文章详情图片
    //preg_match_all('/<imgalt="创业项目"src="(.*?)"title="创业项目" \/>/',$article_all[0][0],$img_all); //文章详情图片
    //var_dump($img_all[1]);
    foreach($img_all[1] as $key => $value){
        $message_img = file_get_contents ("http:{$value}");
        $message_img_name = microtime_float().'.jpg';
        file_put_contents($path.$message_img_name, $message_img);

        $text = str_replace($value,'/public/uploads/img/'.date('Y/md',time()).'/'.$message_img_name,$text);
    }
    // 去掉【如果还有什么问题点击留言咨询】 和  >>>>想了解更多创业资讯,点击咨询详情 和 其他的a标签
    $text = preg_replace("/<a[^>]*>(.*?)<\/a>/is", "", $text);
    //var_dump($text);die;

    // 入库数据
    $cid = 2;// 1:行业资讯,2:创业故事
    $source = '88加盟网';
    $create_time = time();
    $update_time = time();

    // 入库前转码
    $title = mb_convert_encoding($title,'UTF-8');
    $text = mb_convert_encoding($text,'UTF-8');
    //var_dump($title, $text);

    // 插入数据库
    $sql = "insert into zs_message (cid, title, create_time, update_time, source, cover_img, text) values ($cid, '$title', $create_time, $update_time, '$source', '$cover_img', '$text')";
    $result = mysqli_query($con,$sql);

    if ($result) {
        $msg = "当前抓取的页面url为:{$href},入库sql为:{$sql},结果:入库成功";
    } else {
        $msg = "当前抓取的页面url为:{$href},入库sql为:{$sql},结果:入库失败";
    }
    file_put_contents($message_log, $msg, FILE_APPEND | LOCK_EX);
    file_put_contents($message_log, "\n\r", FILE_APPEND | LOCK_EX);

}

function microtime_float()
{
    list($usec, $sec) = explode(" ", microtime());
    return $sec.substr($usec,2,6);
}

function trimall($str){
    $qian=array("\n","\r");
    return str_replace($qian, '', $str);
}

function curl_get_contents($url,$cookie='',$referer='',$timeout=300,$ishead=0) {
  $curl = curl_init();
  curl_setopt($curl, CURLOPT_RETURNTRANSFER,1);
  curl_setopt($curl, CURLOPT_FOLLOWLOCATION,1);
  curl_setopt($curl, CURLOPT_URL,$url);
  curl_setopt($curl, CURLOPT_TIMEOUT,$timeout);
  curl_setopt($curl, CURLOPT_USERAGENT,'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36');
  if($cookie)
  {
    curl_setopt( $curl, CURLOPT_COOKIE,$cookie);
  }
  if($referer)
  {
    curl_setopt ($curl,CURLOPT_REFERER,$referer);
  }
  $ssl = substr($url, 0, 8) == "https://" ? TRUE : FALSE;
  if ($ssl)
  {
    curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false);
    curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
  }
  $res = curl_exec($curl);
  return $res;
  curl_close($curl);
}

爬虫主要的思路是:用正则去筛选我们爬取我们的页面,然后从列表页获取到的url,再一个个去爬取详情页的内容
注意事项:

  1. 如果用file_get_contens去获取内容的话,gzip压缩,会出现乱码的情况
file_get_contents("compress.zlib://".$url);

如是用的curl的话

function curl_get($url, $gzip=false){
        $curl = curl_init($url);
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($curl, CURLOPT_CONNECTTIMEOUT, 10);
        if($gzip) curl_setopt($curl, CURLOPT_ENCODING, "gzip"); // 关键在这里
        $content = curl_exec($curl);
        curl_close($curl);
        return $content;
}

无论页面是否经过gzip压缩,上述代码都可以正常工作!
参考出处
2.在获取到页面后,在匹配之前,一定要先把字符串中的\r\n空格换行都去掉,在进行匹配,否则会出现匹配为空的情况

function trimall($str){
    $qian=array("\n","\r");
    return str_replace($qian, '', $str);
}

3.去掉文章中的超链接或者将锚文本,只保留文字,去掉链接,去掉加粗格式

$text = preg_replace("/<a[^>]*>(.*?)<\/a>/is", "", $text);//去掉文章中的超链接
$str = preg_replace("/<a[^>]*>(.*?)<\/a>/is", "$1", $str);//只保留文字

4.生成图片的路径和文件名(参考)

$cover_img_name = microtime_float().'.jpg';
$cover_img = '/public/uploads/img/'.date('Y/md',time()).'/'.$cover_img_name;
function microtime_float()
{
    list($usec, $sec) = explode(" ", microtime());
    return $sec.substr($usec,2,6);
}

5.入库的时候,有可能会出现,存入的数据读出来全是???,或者乱码 要把页面设置为utf8,数据库设置为utf8

header("Content-Type: text/html;charset=utf-8");
date_default_timezone_set('PRC');
$con = mysqli_connect('127.0.0.1', 'xx', 'xx', 'xx');
mysqli_set_charset($con,'UTF8');

// 入库前转码
$title = mb_convert_encoding($title,'UTF-8');
$text = mb_convert_encoding($text,'UTF-8');

原文地址:https://www.cnblogs.com/djwhome/p/11959408.html

时间: 2024-08-06 09:05:07

用php写爬虫去爬数据的相关文章

【爬虫笔记】第一次写爬虫,爬取新浪新闻网标题

昨晚在网易云课堂上看到了这个爬虫教程,是个基础入门教程,看了几节课,按照示例也去爬了一下新闻标题 课程一些截图:

使用selenium爬虫抓取数据

写在前面 本来这篇文章该几个月前写的,后来忙着忙着就给忘记了.ps:事多有时候反倒会耽误事.几个月前,记得群里一朋友说想用selenium去爬数据,关于爬数据,一般是模拟访问某些固定网站,将自己关注的信息进行爬取,然后再将爬出的数据进行处理.他的需求是将文章直接导入到富文本编辑器去发布,其实这也是爬虫中的一种.其实这也并不难,就是UI自动化的过程,下面让我们开始吧. 准备工具/原料 1.java语言2.IDEA开发工具3.jdk1.84.selenium-server-standalone(3.

用JAVA制作一个爬取商品信息的爬虫(爬取大众点评)

很多企业要求利用爬虫去爬取商品信息,一般的开发模型如下: for i=1;i<=最大页号;i++ 列表页面url=商品列表页面url+?page=i(页号) 列表页面=爬取(列表页面url) 商品链接列表=抽取商品链接(列表页面)  for 链接 in 商品链接列表: 商品页面=爬取(链接) 抽取(商品页面); 这样的模型看似简单,但是有一下几个问题: 1)爬虫没有线程池支持. 2)没有断点机制. 3)没有爬取状态存储,爬取商品网站经常会出现服务器拒绝链接(反问次数过多),导致一旦出现 拒绝链接

Python写爬虫-爬甘农大学校新闻

Python写网络爬虫(一) 关于Python: 学过C. 学过C++. 最后还是学Java来吃饭. 一直在Java的小世界里混迹. 有句话说: "Life is short, you need Python!"  翻译过来就是: 人生苦短, 我用Python 究竟它有多么强大,  多么简洁? 抱着这个好奇心, 趁不忙的几天. 还是忍不住的小学了一下.(- - 其实学了还不到两天) 随便用一个"HelloWorld"的例子 //Java class Main{ pu

爬虫要违法了吗?小编告诉大家:守住规则,大胆去爬

最近我学习和实践网络爬虫,总想着在这儿抓点数据在那儿抓点数据. 但不知为什么,抓取别人网站数据时,总会产生莫名恐慌生怕自己一不小心就侵权了,然后被关在监狱摩擦 所以我想现在这个时候,非常有必要仔细研究一下有关网络爬虫的规则和底线. 我们生活中几乎每天都在爬虫应用,如百度,你在百度中搜索到的内容几乎都是爬虫采集下来的(百度自营的产品除外,如百度知道.百科等),所以网络爬虫作为一门技术,技术本身是不违法的. 哪些情况下网络爬虫采集数据后具备法律风险? 当采集的站点有声明禁止爬虫采集或者转载商业化时:

可变变量常用用于在写程序的时候不确定需要用哪个变量去处理数据的情形

可变变量常用用于在写程序的时候不确定需要用哪个变量去处理数据的情形.$gif = “logo.gif”;$jpg = “logo.jpg”;$png = “logo.png”;假设用户可以填写一个表单,以决定其想要什么类型的logo图片,$f1 = $_GET[‘fileType’]; //用户选择所需要的图片类型的后缀,可以是“gif”,“jpg”,“png”sendFile( $$f1 ); //假设sendFile()可以发送文件,

又写了个爬取小姐姐图片的爬虫,(比上次写的稍微复杂了点)

1 #导入模块 2 import requests,os,sys,re 3 from bs4 import BeautifulSoup 4 5 6 #创建文件夹 7 path = os.getcwd() 8 new_path = os.path.join(path,'小姐姐') 9 if not os.path.isdir(new_path): 10 os.mkdir(new_path) 11 12 #开始写爬虫的主体程序 13 14 #爬虫头部信息,有些网站要有头部信息,不然爬取不到(具体为什

【Python】从0开始写爬虫——把扒到的豆瓣数据存储到数据库

1. 我们扒到了什么? id, 名称, 上映年份,上映日期,所属类目, 导演,主演,片长,评分,星评,评价人数 2. 把这些数据做一个分类. a..基本信息 :名称, 导演,上映年份, 所属类目, 片长 b.评价信息:评分,星评,评价人数 c.主演表: 主演(我在纠结要不要单独列一张表) 3 .表设计.现在有点蛋疼的是主键.用自增主键还是电影id做主键.经过我的多方面考虑,我慎重(草率)地决定,用电影id(反正都要建唯一索引,为什么不拿来当主键呢..), 所以我刚才又在id那转了一下数据 m_i

使用进程池模拟多进程爬取url获取数据,使用进程绑定的回调函数去处理数据

1 # 使用requests请求网页,爬取网页的内容 2 3 # 模拟使用进程池模拟多进程爬取网页获取数据,使用进程绑定的回调函数去处理数据 4 5 import requests 6 from multiprocessing import Pool 7 8 # response = requests.get('http://www.baidu.com') # 访问网页获取网页内容,得到一个网页内容的结果对象<Response [200]>这个200是一个状态码,200表示网页正常的返回,40