当前位置: 首页 > 后端技术 > PHP

PHP实现简单的数据采集

时间:2023-03-29 19:40:22 PHP

介绍说到数据采集,大家首先会想到python,代码简洁高效,轻松实现数据采集。PHP是如何实现数据采集的?很简单。概念那么什么是数据收集?以下是百度百科的介绍:数据采集,又称数据采集,是用一个设备从系统外部采集数据,输入到系统内部的一个接口中。数据采集??技术广泛应用于各个领域。你可以简单的理解为窃取别人网站的数据。所需的扩展包1.Guzzle这是一个PHPHTTP客户端,可以轻松发送HTTP请求并轻松与Web服务集成。安装方法:composerrequireguzzlehttp/guzzle:~6.0或者:在composer.json中添加"require":{"guzzlehttp/guzzle":"~6.0"}}2.QueryListQueryList是一个基于phpQuery的PHP通用列表集合类,感谢phpQuery,使用QueryList几乎没有学习成本。只要了解CSS3选择器,就可以轻松使用QueryList。它使PHP集合像jQuery选择元素一样简单。QueryList的几个特点:简单易学:只有一个核心API简单易用:使用jQuery选择器选择页面元素内置过滤功能,可以过滤掉无用的内容支持无限嵌套集合集合结果可以直接列出集合规则有序returnssupportextensions我们可以用它来过滤html内容安装方式:composerrequirejaeger/querylist:V3.2.1收集案例我们以LearnKu社区为例,我们将收集社区的帖子信息,并将信息保存到文件中,放入mysql数据库。1.安装依赖在命令行输入如下命令composerinit导入依赖{"require":{"guzzlehttp/guzzle":"~6.0@dev","jaeger/querylist":"V3.2.1"},"autoload":{"psr-4":{"App\\":"app/"}}}安装依赖composerinstall2。集合类appHandleClientHandle.phpclient=newClient(['verify'=>false]);}publicfunctionqueryBody($url,$rules){$html=$this->sendRequest($url);$data=QueryList::Query($html,$rules)->getData(function($item){if(array_key_exists('link',$item)){$content=$this->sendRequest($item['链接']);$item['post']=QueryList::Query($content,['title'=>['div.pull-left>span','text'],'review'=>['p>span.text-mute:eq(0)','文本'],'comment'=>['p>span.text-mute:eq(1)','text'],'content'=>['div.content-body','html'],'created_at'=>['p>a>span','title'],'updated_at'=>['p>a:eq(2)','data-tooltip']])->data[0];}返回$item;});//查看采集结果return$data;}privatefunctionsendRequest($url){$response=$this->client->request('GET',$url,['headers'=>['User-Agent'=>'testing/1.0','Accept'=>'application/json','X-Foo'=>['Bar','Baz']],'form_params'=>['foo'=>'bar','baz'=>['hi','那里!']],'超时'=>3.14,]);$body=$response->getBody();//获取页面源$html=(string)$body;返回$html;}}简单点分析:在__construct构造函数中,我们实例化了一个guzzleClient。用于发起http请求的sendRequest是传入url,然后发起http请求,返回目标html源码。queryBody,接收一个url,以及需要收集的规则。这里没有扩展查询列表。只要会jquery,相信很快就会上手。publicfunctionqueryBody($url,$rules){//发起请求并接收html源码$html=$this->sendRequest($url);//静态方法将内容$html和规则$rules传递给QueryList进行查询处理,并获取数据。$data=QueryList::Query($html,$rules)->getData(function($item){//我先获取列表页面,然后通过列表的link链接获取文章的详细信息。//判断是否匹配链接if(array_key_exists('link',$item)){//获取详情页html源码$content=$this->sendRequest($item['link']);//为QueryList提交处理数据$item['post']=QueryList::Query($content,['title'=>['div.pull-left>span','text'],'review'=>['p>span.text-mute:eq(0)','text'],'comment'=>['p>span.text-mute:eq(1)','text'],'content'=>['div.content-body','html'],'created_at'=>['p>a>span','title'],'updated_at'=>['p>a:eq(2)','data-tooltip']])->data[0];//集合是一个集合,所以我只取第一个data[0]}return$item;});//检查收集结果return$data;}3.PDOclassAppHandlePdoHandle.php我们使用PDO来操作数据库,这里我简单实现一个classdriver=$driver;$this->host=$host;$this->dbname=$dbname;$this->用户名=$用户名;$this->密码=$密码;$dsn=$this->驱动程序。':主机='。$这个->主机。';数据库名='。$this->数据库名;$this->source=new\PDO($dsn,$this->用户名,$this->密码);$this->source->setAttribute(\PDO::ATTR_ERRMODE,\PDO::ERRMODE_EXCEPTION);}}相信大家看的懂的,就不介绍了4.写入文件我们将采集到的内容写入文件['span.topic-title:lt(5)','文本'],'链接'=>['a.topic-title-wrap:lt(5)','href']];//收集$url="https://learnku.com/laravel";$client=new\App\Handle\ClientHandle();$data=$client->queryBody($url,$rules);//因为我们请求了两级,所以返回的数组需要处理成一级数组$data=array_map(function($item){return$item['post'];},$data);//写入文件$handle=fopen('2.php','w');$str="['span.topic-title','text'],'link'=>['a.topic-title-wrap','href']];$url="https://learnku.com/laravel";$client=new\App\Handle\ClientHandle();$data=$client->queryBody($url,$rules);$data=array_map(function($item){return$item['post'];},$data);//写sql语句$sql="INSERTINTO`posts`(`title`,`review`,`comment`,`content`,`created_at`,`updated_at`)VALUES";//过滤后没有符合条件的匹配特殊数据,从而避免存储麻烦$data=array_filter($data,function($item){returncount($item)==6;});//重置数组下标sort($data);//合并sql语句foreach($dataas$key=>$item){//内容带有html标签,所以需要进行base64处理才能存储$item['content']=base64_encode($item['content']);$value="'".implode("','",array_values($item))."'";$sql.="($value)";if(count($data)-1!=$key){$sql.=",";}}//Collection$db=new\App\Handle\PdoHandle();try{$db->source->query($sql);echo'收集入库成功!';}catch(PDOException$exception){echo$exception->getMessage();}等待几秒后,在网页上可以看到“成功采集并存储”字样,代表成功~我们也可以只是为了收集前几件物品,你只需要重写$rules规则。例如:只取前5项,我们可以这样写$rules=['title'=>['span.topic-title:lt(5)','text'],'link'=>['a.topic-title-wrap:lt(5)','href']];6。读取数据使用PDO读取数据source->query($sql);$data=$pdoStatement->fetchAll(PDO::FETCH_ASSOC);foreach($dataas&$item){//解密内容$item['content']=base64_decode($item['content']);}var_dump($数据);文末,希望大家边看边有所收获,我也把它上传到了github,需要的小伙伴可以拉下来看看。案例个人博客原文地址