### 前言
上次我們使用`nightmare`這款自動化測試工具進行了百度圖片關鍵詞查詢結果的爬蟲,效率略低.
現在我們嘗試其他的方式,更高效的進行爬蟲操作.這里使用的`npm`包主要有:
* axios
* cheerio //本次沒有用到
* mysql //我們需要把數據記錄下來
* log4js //提供一個清晰的日志跟蹤
### 環境準備
* 安裝MySQL,搭建本地數據庫
* 安裝上述模塊
* 配置log4js,這里不詳述具體的配置方法
* 準備數據庫操作的模塊,這里也不詳述
### 開始
這次我們爬取的目的,依然是百度圖庫,關鍵字查找.
#### 調研
首先,確認了目前百度圖片關鍵字查找后,圖片采用滾動懶加載的方式,所以切換到`network`,

簡單分析下:
* 懶加載使用`get`方式
* 請求頭連接是`https://image.baidu.com/search/acjson`
* request參數我們去除空無效非關鍵的字段,應當如下:
```js
{
tn: 'resultjson_com',//這個參數不能少
ipn: 'rj',//這個參數也不能少
queryWord: '',//查詢關鍵詞
word:'',//查詢關鍵詞
pn: 30,//這個是當前頁的數量
rn: 30//這個是每頁的大小
}
```
* 然后response的結構大概是這樣的:

* data里是個數組,我們關心的是data內,子項的數據結構:

里面有很多數據,我們目前只關心圖片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}張圖片`);
}
```
#### 結果

<p class="over">Over!</p>
- 前端
- C1-Javascript
- H5圖片分塊和斷點續傳
- JavascriptPatterns[Stoyanstefanov]
- macotask和microtask
- 前端代碼生成器
- 跨域
- 頁面回到頂部滾動按鈕實現
- C2-CSS
- 瀏覽器的一些單位
- 盒模型
- 移動端判斷橫豎屏
- C3-框架
- ReactNative
- 開發環境搭建(安卓篇)
- Vue
- vue+pdfjs使用
- vue+typescript使用實踐
- vue+webpack3.x集成typescript
- Vue源碼3
- vue源碼分析1
- vue源碼分析2
- vue筆記
- C4-工具
- git
- Gitlab-CICD
- mock規則
- vscode-settings
- webpack自定義命令,切換代理地址
- 正則表達式
- 深入淺出webpack
- C5-Node
- express
- express源碼閱讀
- nightmare使用指南
- 爬蟲1.0
- C6-微信
- 微信
- C7-Canvas
- 基礎API
- 前端隨筆筆記
- 后端
- C1-Java
- shiro
- C2-Linux
- ffmpeg
- ITerm
- Linux
- MongoDB安裝
- MySql安裝
- Ngnix反向代理
- 常見錯誤
- 備忘
- mac
- 備忘-Work
- 備忘Link
- 服務器資源
- 教程
- Hexo個人博客搭建筆錄
- 文檔
- CSS編碼規范
- 前端編碼規范
- 隨筆
- 整理
- 正則
- 鏈接收藏
- 面試
- CodeWars題庫
- CodeWars題庫(二)
- Java社招面試題
- Java面試
- Web面試
- 前端筆試題
- 筆試題