资讯专栏INFORMATION COLUMN

php 爬虫程序 爬取有用的免费API

Charles / 763人阅读

摘要:做了一个爬取的类可以获取全国行政区域效果图差不多有多行只要秒就可以爬完首先这个在阿里云市场是免费的每个人都可以用地址在这里要先注册阿里云然后购买他这个一次只能买你可以买三四次应该就可以全部下载完毕了爬虫思路初始化并将句柄添加进去执行所有的句

做了一个爬取api的类.可以获取2017全国行政区域.

git: https://github.com/buffge/loa...

效果图:

差不多有40000多行 只要90秒就可以爬完

首先这个api在阿里云市场 是免费的.每个人都可以用.
地址在这里

要先注册阿里云,然后购买他这个,一次只能买1000.你可以买三四次,应该就可以全部下载完毕了.

爬虫思路:
1.初始化curl_multi 并将curl 句柄添加进去.
2.执行所有的curl句柄
3.处理所有的curl返回的结果  

那个api是有2种接口,第一是通过名称获取城市的信息,第二是通过父城市id获取所有子城市
因为父城市id我们不知道,所以第一步必须是通过名称获取城市的信息
定义数组 全国所有省级行政区(共34个)

爬虫运行顺序
第一步是获取这34个省(level=1)的信息.
第二步就是循环34次 每次循环查询当前城市的所有子城市(level=2)
第三步就是循环(level=2)城市的个数次,然后查询level=3城市的信息
第四步就是循环(level=3)城市的个数,查询level=4城市的信.最大就到level4 也就是乡镇一级
有的城市连level3都没有,没有的情况下就会continue
代码块分析
    public
            function start() {
//启动一个mcurl
        $mh = curl_multi_init();
        $orinigal_chs = [];
//初始化mcurl 并添加一定数量(最高为全部或者最大并发)curl进去
        $this->curlMultiInit($mh, $orinigal_chs);
//执行所有的curl句柄并返回所有curl句柄数组
        $chs = $this->curlMultiExec($mh, $orinigal_chs);
//获取所有的curl返回的结果
        $res = $this->getCurlResult($chs);
//如果为正常结果
        if (is_array($res)) {
//对每一个curl结果进行处理
            $this->dataHandle($res);
        }
        else {
//输出错误信息
            echo "当前列表中所有城市都没有子城市.
";
        }
    }

这是启动方法所有的操作都在里面.这里使用的是多线程爬虫.如果不会的可以百度.
核心的代码就是最后一个对curl结果进行处理的方法;
主要做的内容是插入上一次获取到的城市信息到数据库
接着对每一个获取到的城市进行子城市 查询 也就是上面所说的循环
由于我是个菜鸟,我有好久没用过mysql了,不知道为什么这里的affected_rows为什么总是等于-1.
知道的 能告诉我一下就好了.
如下:

 protected
            function dataHandle(array $res) {
        $mysqli = new mysqli($this->host, $this->name, $this->pwd, $this->dbname);
        foreach ($res as $k => $v) {
            $mixedInfo = json_decode($v[0]);
            $cityInfo = $mixedInfo->showapi_res_body->data;
            $citysLength = count($cityInfo);
            $sql = "INSERT INTO `allcitys` ( `provinceId`, `simpleName`, `lon`, `areaCode`, `cityId`, `remark`, `prePinYin`, `cid`, `pinYin`, `parentId`, `level`, `areaName`, `simplePy`, `zipCode`, `countyId`, `lat`, `wholeName`) VALUES ";
            $sql_values = "";
            for ($i = 0; $i < $citysLength; $i++) {
                $sql_values .= "("{$cityInfo[$i]->provinceId}", "{$cityInfo[$i]->simpleName}", "{$cityInfo[$i]->lon}", "{$cityInfo[$i]->areaCode}", "{$cityInfo[$i]->cityId}", "{$cityInfo[$i]->remark}", "{$cityInfo[$i]->prePinYin}", "{$cityInfo[$i]->id}","{$cityInfo[$i]->pinYin}", "{$cityInfo[$i]->parentId}", "{$cityInfo[$i]->level}", "{$cityInfo[$i]->areaName}", "{$cityInfo[$i]->simplePy}", "{$cityInfo[$i]->zipCode}", "{$cityInfo[$i]->countyId}", "{$cityInfo[$i]->lat}", "{$cityInfo[$i]->wholeName}"),";
            }
            $sql_values = substr_replace($sql_values, "", -1);
            $sql .= $sql_values;
            $mysqli->query($sql);
//不知道为什么这里的affect_rows 总是-1
//if ($mysqli->affected_rows == $citysLength) {
            if (1) {
                echo "{$citysLength}条数据添加成功
";
                if ($this->level < 4) {
                    $temp_level = $this->level + 1;
                    for ($j = 0; $j < $citysLength; $j++) {
                        $tempearchCitysList[] = $cityInfo[$j]->id;
                    }
                    $config = [
                        "appcode"         => $this->appcode,
                        "level"           => $temp_level,
                        "amount"          => $citysLength,
                        "getInfo"         => self::SUB_LIST,
                        "searchCitysList" => $tempearchCitysList,
                        "host"            => $this->host,
                        "name"            => $this->name,
                        "pwd"             => $this->pwd,
                        "dbname"          => $this->dbname
                    ];
                    $subLoad = new self($config);
                    $tempearchCitysList = [];
                    $subLoad->start();
                }
            }
            else {
                echo $this->searchCitysList[$k] . "数据插入失败!
";
            }
        }
        $mysqli->close();

    }
比较难理解的代码块就是curl_multi那个方法

我半年前做爬虫的时候 为了搞清楚这个百度谷歌都查 就是没有找到满意的答案.
后来干脆就这样随便写了.效果还可以.
其中 这一句

$mrc = curl_multi_exec($mh, $active);

表示执行$mh中所有的curl句柄.$active 表示当前还剩多少个没有执行完毕.

 $info = curl_multi_info_read($mh, $msgq);
 

这里这句就是读取$mh 已经执行完毕的内容如果$info为真,表示这个curl句柄已经完成了,
然后我们从这个info中读取handle 也就是当前curl句柄.
如果$info 为假那么就延时1000微秒,因为执行太快 对cpu压力很大.

因为我英语不好官方文档看不懂,也没有学过底层,这里的很多东西都是我根据效果猜的.里面如果有讲错来的地方请大家告诉我一下.

不仅仅是这个api ,其他的api 也可以通过这种思路去爬取.图片站 小说站都可以这样爬取.
我半年前做过一个爬取图片站的类.git上也有.希望对大家有帮助.

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/25798.html

相关文章

  • node.js 爬取招聘信息分析各职业钱途(爬虫+动态IP代理+数据可视化分析)

    摘要:成功爬取了拉钩网上多个招聘岗位的具体信息后,数据可视化并得出分析结果如下从整体看,北上广深杭这五个城市前端工程师招聘岗位,北京是遥遥领先,是深圳的两倍,是广州的三倍,其次到上海,深圳,杭州,广州居末。 前前言 本文首发于 github blog 不想看爬虫过程只想看职位钱途数据分析请看这里:前端招聘岗位分析C++招聘岗位分析JAVA招聘岗位分析PHP招聘岗位分析Python招聘岗位分析...

    546669204 评论0 收藏0
  • 小白看过来 让Python爬虫成为你好帮手

    摘要:小白看过来让爬虫成为你的好帮手随着信息化社会的到来,人们对网络爬虫这个词已经不再陌生。互动活动关于华为云微认证的任何问题,均可在下方评论区留言。华为云微认证每期将送出个免费机会,奖项公布时间月日。 小白看过来 让Python爬虫成为你的好帮手 随着信息化社会的到来,人们对网络爬虫这个词已经不再陌生。但什么是爬虫,如何利用爬虫为自己服务,这听起来有些高大上。下面一文带你走近爬虫世界,让即...

    darcrand 评论0 收藏0
  • scrapy-redis分布式爬虫框架详解

    摘要:分布式爬虫框架详解随着互联网技术的发展与应用的普及,网络作为信息的载体,已经成为社会大众参与社会生活的一种重要信息渠道。下载器中间件位于引擎和下载器之间的框架,主要是处理引擎与下载器之间的请求及响应。 scrapy-redis分布式爬虫框架详解 随着互联网技术的发展与应用的普及,网络作为信息的载体,已经成为社会大众参与社会生活的一种重要信息渠道。由于互联网是开放的,每个人都可以在网络上...

    myeveryheart 评论0 收藏0
  • 面向对象分布式爬虫框架XXL-CRAWLER

    摘要:面向对象的分布式爬虫框架一简介概述是一个面向对象的分布式爬虫框架。分布式集群集群方式维护爬虫爬虫运行数据,可通过或定制实现。 《面向对象的分布式爬虫框架XXL-CRAWLER》 showImg(https://segmentfault.com/img/remote/1460000011842697);showImg(https://segmentfault.com/img/remote...

    anquan 评论0 收藏0

发表评论

0条评论

Charles

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<