爬蟲
1.爬蟲介紹
通過模擬瀏覽器的請求广匙,服務器就會根據我們的請求返回我們想要的數(shù)據袱院,將數(shù)據解析出來平斩,并且進行保存亚享。
2.爬蟲流程
1-目標:確定你想要獲取的數(shù)據
- 確定想要的數(shù)據在什么頁面上(一般詳細的數(shù)據會在詳情頁)
- 確定在哪些頁面可以鏈接到這些頁面(一般分類列表頁面會有詳情頁的鏈接數(shù)據)
- 尋找頁面之間和數(shù)據之間的規(guī)律
2-分析頁面
- 獲取數(shù)據的方式(正則,cherrio)
- 分析數(shù)據是通過ajax請求的數(shù)據绘面,還是html里自帶的數(shù)據
- 如果是通過AJAX請求的數(shù)據欺税,那么需要獲取ajax請求的鏈接,一般請求到的數(shù)據都為JSON格式數(shù)據飒货,那么就會比較容易解析魄衅。
- 如何數(shù)據在HTML里面,那么就用cherrio通過選擇器將內容選中
3-編寫單個數(shù)據獲取的案例
- 解析出分類頁的鏈接地址
- 解析出列表頁的鏈接地址
- 解析出詳情頁的鏈接地址
- 解析詳情頁里面想要獲取的數(shù)據
- 將數(shù)據進行保存到本地或者是數(shù)據庫
4-如果遇到阻礙進行反爬蟲對抗
- User-Agent是否是正常瀏覽器的信息
- 將請求頭設置成跟瀏覽器一樣的內容
- 因為爬蟲的爬取速度過快塘辅,會導致封號晃虫。1那么可以降低速度進行解決,2可以使用代理進行解決
- 如果設置需要憑證扣墩,那么可以采用無界瀏覽器真實模擬哲银。
2.請求數(shù)據的庫
request,axios:通過庫呻惕,幫助我們快速實現(xiàn)HTTP請求包的打包
request.get('請求地址', {
'請求頭字段': '請求頭的value值'
},(res)=>{處理返回的內容});
axios優(yōu)勢會更明顯荆责,前后端通殺,前后端調用的方式一致亚脆。
axios.get('請求地址',參數(shù)對象).then(function (response) {
console.log(response);
})
axios獲取圖片
axios({
method:'get',
url:'http://bit.ly/2mTM3nY',
responseType:'stream'
})
.then(function(response) {
response.data.pipe(fs.createWriteStream('ada_lovelace.jpg'))
});
puppeteer:完全模擬瀏覽器
打開瀏覽器
let options = {
headless:true,//是否是無界面瀏覽器
slowMo:250,//調試時可以減慢操作速度
defaultViewport:{
width:1200,//設置視窗的寬高
height:800
},
timeout:3000做院,//默認超時3秒
}
let browser =await puppeteer.launch(options);
打開新標簽頁
let page = await browser.newPage()
獲取所有瀏覽器中的頁面
let pages = await browser.pages()
關閉瀏覽器
browser.close()
將頁面跳轉至
await page.goto(url)
獲取頁面的對象,并進行操作
let btn = await page.$(selector)
let input = await page.$(selector)
//點擊按鈕
btn.click()
//聚焦到輸入框
input.forcus()
在頁面上寫入內容或者鍵盤按鍵
await page.keyboard.type('Hello World!');
await page.keyboard.press('ArrowLeft');
await page.keyboard.down('Shift');
設置鼠標的移動
await page.mouse.move(0, 0);
await page.mouse.down();
await page.mouse.move(0, 100);
await page.mouse.move(100, 100);
await page.mouse.move(100, 0);
await page.mouse.move(0, 0);
await page.mouse.up();
截獲頁面請求
await page.setRequestInterception(true);
page.on('request', request => {
request.url()//可以獲取請求的網址,request濒持,包含了所有的請求信息
if(你想要的條件){
request.continue()
}else{
request.abort([errorCode])
}
});
獲取瀏覽器的信息和內容
page.$eval(selector,(item)=>{return item})
page.$$eval(selectors,(items)=>{return items})