Laravel中curl_multi并发爬取百度关键词排名


框架使用的Laravel

Linux中crontab定时任务添加

*/1 * * * *    /data/wwwroot/default/newgdh/artisanCommand

项目newgdh中添加artisanCommand

!/bin/sh
/usr/local/php/bin/php /data/wwwroot/default/newgdh/artisan schedule:run


App\Console\kernal.php中添加

 protected $commands = [\App\Console\Commands\GetKeyWordSortCommand::class,];
   protected function schedule(Schedule $schedule){$schedule->command('GetKeyWordSortCommand')->everyMinute();// 本地测试用时间,可以自己修改}

生成 App\Console\Commands\GetKeyWordSortCommand.php

php artisan make:command GetKeyWordSortCommand并且protected $signature = 'GetKeyWordSortCommand';protected $description = '百度关键词定时爬取';

laravel队列

class GetKeyWordSortCommand extends Command
{
use DispatchesJobs;
注意: use DispatchesJobs;因为在handle中无法直接使用dispatch()推送任务到队列


public function handle(){// 获取关键词词库$keywordsList = Keyword::get();foreach($keywordsList as $k=>$v ){$url_arr = [];$page = 1;for($i=0;$i<2;$i++){$url_arr[$i] = ["url"=>"https://www.baidu.com/s","params"=>array('wd'=>$v->key_value,'ie'=>"utf-8",'pn'=>($page-1)*10)];$page++;}$this->dispatch(new GetKeyWordSortJob($url_arr,$v->key_id));}}

生成 App\Console\Commands\GetKeyWordSortJob.php任务

php artisan make:job GetKeyWordSortJob

###构造函数中添加自己的url 和 需要入表关键词表ID

    public function __construct($url_arr,$key_id){$this->url_arr = $url_arr;$this->key_id = $key_id;}

使用QueryList进行DOM节点采集

public function handle(){$url_arr = $this->url_arr;$key_id = $this->key_id;$time_start =$this->microtime_float();$tmp = $this->curl_multi_fetch($url_arr,'GET');$time_end = $this->microtime_float();$time = $time_end - $time_start;//Log::info('耗时'.$time);$content = '';foreach($tmp as $k=>$v){$content.=$v['content'];}$tmp = $content;$html = <<<STR
$tmp
STR;$rules = array(//采集id为one这个元素里面的纯文本内容'text' => array('.c-container h3.t a', 'html'),//采集class为two下面的超链接的链接'href' => array('.c-container h3.t a', 'href'),);$data = QueryList::html($html)->rules($rules)->query()->getData();// 测试数据:第三方的合作域名  测试关键词 椭圆机价格 , 椭圆机健身$list = ['www.zhihu.com', 'www.lmjsport.cn','www.okgchina.com', 'www.1688.com'];$tmp = $data->all();$str = '第';foreach ($tmp as $k => $v) {if (isset($v['href'])) {$tmp[$k]['href'] = $this->getRegXpUrl($this->getRealUrl($v['href']));}if (in_array($tmp[$k]['href'], $list)) {$tmp[$k]['sort'] = $k + 1;$str .= '<span style="color: red;">'.($k + 1) . '</span>,';}}$str .= '位';// 写入关键词表try{Keyword::where('key_id',$key_id)->update(['key_sort'=>$str]);}catch (\Exception $exception){Log::info('入表报错:'.$exception->getMessage());}}

测试

php  artisan queue:listen //开启队列监听
php  artisan schedule:run


主要函数

  • 获取域名
    public function getRegXpUrl($url){$search = '~^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?~i';$url = trim($url);preg_match_all($search, $url, $rr);return $rr[4][0];}
  • 获取百度加密url
    public function getRealUrl($url){$info = parse_url($url);$fp = fsockopen($info['host'], 80, $errno, $errstr, 30);fputs($fp, "GET {$info['path']}?{$info['query']} HTTP/1.1\r\n");fputs($fp, "Host: {$info['host']}\r\n");fputs($fp, "Connection: close\r\n\r\n");$rewrite = '';while (!feof($fp)) {$line = fgets($fp);if ($line != "\r\n") {if (strpos($line, 'Location:') !== false) {$rewrite = str_replace(array("\r", "\n", "Location: "), '', $line);}} else {break;}}return $rewrite;}
  • 多线程并发抓取函数
//有一个坑:$handles[$ch] = $key;如果这里不进行数据类型转换的话,会出现问题。Resource ID#266 used as offset, casting to integer (266)public function curl_multi_fetch($params=array(), $method){$mh = curl_multi_init(); #初始化一个curl_multi句柄$handles = array();foreach ($params as $key => $param) {$ch = curl_init(); #初始化一个curl句柄$url = $param["url"];$data = $param["params"];#根据method参数判断是post还是get方式提交数据if (strtolower($method) === "get") {$url = "$url?" . http_build_query($data); #get方式} else {curl_setopt($ch, CURLOPT_POSTFIELDS, $data); #post方式}$header = ['User-Agent: Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.146 Safari/537.36'];curl_setopt($ch, CURLOPT_URL, $url);curl_setopt($ch, CURLOPT_HEADER, 1);curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 30);curl_setopt($ch, CURLOPT_TIMEOUT, 30);curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);curl_setopt($ch, CURLOPT_HTTPHEADER, $header);curl_multi_add_handle($mh, $ch);$handles[(string)$ch] = $key; //handles数组用来记录curl句柄对应的key,供后面使用,以保证返回的数据不乱序。}$running = null;$curls = array(); #curl数组用来记录各个curl句柄的返回值do {curl_multi_exec($mh, $running); #发起curl请求,并循环等等1/100秒,直到引用参数"$running"为0while (($ret = curl_multi_info_read($mh)) !== false) {$curls[$handles[(string)$ret["handle"]]] = $ret;  #循环读取curl返回,并根据其句柄对应的key一起记录到$curls数组中,保证返回的数据不乱序}} while ( $running != 0 );// 循环获取内容foreach($curls as $key=>&$val){$val["content"] = curl_multi_getcontent($val["handle"]);curl_multi_remove_handle($mh, $val["handle"]); #移除curl句柄}curl_multi_close($mh); #关闭curl_multi句柄ksort($curls);return $curls;}
  • 测试时间
    public  function microtime_float(){list($usec, $sec) = explode(" ", microtime());return ((float)$usec + (float)$sec);}

Laravel中curl_multi并发爬取百度关键词排名相关推荐

  1. 使用python中的Selenium爬取百度文库word文章

    参考文章:Python3网络爬虫(九):使用Selenium爬取百度文库word文章,链接为: https://blog.csdn.net/c406495762/article/details/723 ...

  2. php爬取百度关键词时出现,百度安全验证,解决方法

    爬取关键词出现结果: <!DOCTYPE html> <html lang="zh-CN"> <head><meta charset=&q ...

  3. requests整合selenium爬取网站关键词排名

    ** 神马搜索引擎之手机端搜索:白癜风类关键词对应网站排名! ** 涉及技术库:requests整合selenium,即selenium自动打开Google浏览器并访问链接,然后通过requests库 ...

  4. 2021最新爬取百度关键词时出现,百度安全验证,解决方法

    PHP代码 其他代码也可以,其实就是利用本机浏览器反向输出百度内容,现在百度直接采集是会出验证的因为在浏览器页面有cookie和JS验证 所以必须自架设反向浏览器输出数据 $timeout = 30; ...

  5. python爬取qq好友_Python3实现QQ机器人自动爬取百度文库的搜索结果并发送给好友(主要是爬虫)...

    一.效果如下: 二.运行环境: win10系统:python3:PyCharm 三.QQ机器人用的是qqbot模块 用pip安装命令是: pip install qqbot (前提需要有request ...

  6. python爬取贴吧所有帖子-Python爬虫实例(一)爬取百度贴吧帖子中的图片

    程序功能说明:爬取百度贴吧帖子中的图片,用户输入贴吧名称和要爬取的起始和终止页数即可进行爬取. 思路分析: 一.指定贴吧url的获取 例如我们进入秦时明月吧,提取并分析其有效url如下 ?后面为查询字 ...

  7. python爬取百度图片(用于深度学习中数据集的收集)

    6_python爬取百度图片(用于深度学习中数据集的收集)(6-20181225-) 参考: https://blog.csdn.net/guyuealian/article/details/7873 ...

  8. python3学习笔记之八——爬取百度音乐盒临时列表中的音乐

    没事儿打开百度音乐,随便点点喜欢的音乐,音乐就会加到百度音乐盒的临时列表之中了,但是想将列表中的音乐下载到本地就要登录百度账号. 那能不能不登录就将列表中的音乐下载下来? 通过fiddler抓包分析一 ...

  9. python爬虫下载电影百度文档_写一个python 爬虫爬取百度电影并存入mysql中

    目标是利用python爬取百度搜索的电影 在类型 地区 年代各个标签下 电影的名字 评分 和图片连接 以及 电影连接 首先我们先在mysql中建表 create table liubo4( id in ...

最新文章

  1. Matlab与线性代数 -- 全1矩阵
  2. Windows中文件夹与linux中目录的区别
  3. 【Java类加载机制】深入加载器
  4. 企业私有云部署im,视频服务
  5. 《人民邮电出版社9本计算机教材的教学课件(计算机老师的宝贝)》
  6. java生成折线图,饼状图,柱形图
  7. 华硕 WL-566gM之信号强度
  8. 做了全职妈妈后,你的生活将有5个方面的变化
  9. python numpy数组切片_python中numpy数组切片实验解释
  10. ReultSet有什么作用和使用
  11. 通过ssh登陆linux后使用vim时按了ctrl+s
  12. 摩西十诫 摩西简介 世界宗教图谱
  13. css 背景渐变详解
  14. 根据前序序列创建二叉树
  15. 云存储及分布式文件系统
  16. Branch Prediction Is Not A Solved Problem:Measurements, Opportunities, and Future Directions(IISWC)
  17. QT作为设备接入阿里云平台
  18. ✨ StarRocks 11 月社区动态
  19. 3.利用PageRank(重启随机游走)预测蛋白质相互作用
  20. 计算机的基本结构以真值函数,离散数学N元真值函数问题

热门文章

  1. 利用GeoHash实现逆地理编码(经纬度坐标转换行政区划)
  2. 工作组win7计算机无法访问,win7系统不能访问工作组计算机的解决方法
  3. 组合人民币问题(存在问题)
  4. ZZNUOJ_C语言1008:美元和人民币(完整代码)
  5. BIM技术为什么广泛应用于地铁工程项目上?
  6. Tag Archives: 海明距离
  7. 深银色心扉之Silverlight-MMORPG游戏引擎第一阶段移植
  8. 4、Horizon 连接服务器安装配置
  9. 二级计算机重点,计算机二级的复习重点
  10. 研读网络安全法律法规,提升技术管理者 “法” 商