<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                企業??AI智能體構建引擎,智能編排和調試,一鍵部署,支持知識庫和私有化部署方案 廣告
                ### 前言 上次我們使用`nightmare`這款自動化測試工具進行了百度圖片關鍵詞查詢結果的爬蟲,效率略低. 現在我們嘗試其他的方式,更高效的進行爬蟲操作.這里使用的`npm`包主要有: * axios * cheerio //本次沒有用到 * mysql //我們需要把數據記錄下來 * log4js //提供一個清晰的日志跟蹤 ### 環境準備 * 安裝MySQL,搭建本地數據庫 * 安裝上述模塊 * 配置log4js,這里不詳述具體的配置方法 * 準備數據庫操作的模塊,這里也不詳述 ### 開始 這次我們爬取的目的,依然是百度圖庫,關鍵字查找. #### 調研 首先,確認了目前百度圖片關鍵字查找后,圖片采用滾動懶加載的方式,所以切換到`network`, ![](images/screenshot_1510299953339.png) 簡單分析下: * 懶加載使用`get`方式 * 請求頭連接是`https://image.baidu.com/search/acjson` * request參數我們去除空無效非關鍵的字段,應當如下: ```js { tn: 'resultjson_com',//這個參數不能少 ipn: 'rj',//這個參數也不能少 queryWord: '',//查詢關鍵詞 word:'',//查詢關鍵詞 pn: 30,//這個是當前頁的數量 rn: 30//這個是每頁的大小 } ``` * 然后response的結構大概是這樣的: ![](images/screenshot_1510300490490.png) * data里是個數組,我們關心的是data內,子項的數據結構: ![](images/screenshot_1510300679440.png) 里面有很多數據,我們目前只關心圖片url和圖片來源的網站,分別是`thumbURL`,`fromURLHost` #### axios發送請求 ```js let pageNum = config.page.num, pageSize = config.page.size; let imageList = new Set(), hostList = new Set(); ``` ```js const getImageByPage = async(page) => { return axios.get('https://image.baidu.com/search/acjson', { params: { tn: 'resultjson_com', ipn: 'rj', queryWord: config.keywords, word: config.keywords, pn: page, rn: pageSize } }).then(response => { logger.info(`請求成功,開始解析數據,當前是第${page}頁......`); let resData = response.data, lazyData = resData.data; logger.debug(`請求成功,數據長度為${undefined == lazyData ? 0 : lazyData.length}`); if (undefined == lazyData) true; let result = []; lazyData.forEach(item => { if (undefined != item.thumbURL) { imageList.add(item.thumbURL); hostList.add(item.fromURLHost); result.push(item.thumbURL); //執行數據庫插入操作 db.insert(`insert into baidu_image(host,url) values("${item.fromURLHost}","${item.thumbURL}")`); } }); return true; }).catch(e => { logger.error(e.message); return false; }); } ``` ### 控制請求數量 ```js const run = async() => { //發送一個請求 for (let i = 0; i < config.page.times; i++) { logger.debug(`開始第${i+1}次請求`) if (await getImageByPage(pageNum)) { pageNum += pageSize; } else { logger.debug('沒有了,終止循環'); break; } } logger.debug(`一共獲取到${imageList.size}張圖片`); } ``` #### 結果 ![](images/screenshot_1510300977323.png) <p class="over">Over!</p>
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看