国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

php 爬蟲程序 爬取有用的免費API

Charles / 1014人閱讀

摘要:做了一個爬取的類可以獲取全國行政區域效果圖差不多有多行只要秒就可以爬完首先這個在阿里云市場是免費的每個人都可以用地址在這里要先注冊阿里云然后購買他這個一次只能買你可以買三四次應該就可以全部下載完畢了爬蟲思路初始化并將句柄添加進去執行所有的句

做了一個爬取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上也有.希望對大家有幫助.

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/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元查看
<