爬蟲
1.爬蟲介紹
通過模擬瀏覽器的請求,服務器就會根據我們的請求返回我們想要的數據,將數據解析出來,并且進行保存。
2.爬蟲流程
1-目標:確定你想要獲取的數據
- 確定想要的數據在什么頁面上(一般詳細的數據會在詳情頁)
- 確定在哪些頁面可以鏈接到這些頁面(一般分類列表頁面會有詳情頁的鏈接數據)
- 尋找頁面之間和數據之間的規律
2-分析頁面
- 獲取數據的方式(正則,cherrio)
- 分析數據是通過ajax請求的數據,還是html里自帶的數據
- 如果是通過AJAX請求的數據,那么需要獲取ajax請求的鏈接,一般請求到的數據都為JSON格式數據,那么就會比較容易解析。
- 如何數據在HTML里面,那么就用cherrio通過選擇器將內容選中
3-編寫單個數據獲取的案例
- 解析出分類頁的鏈接地址
- 解析出列表頁的鏈接地址
- 解析出詳情頁的鏈接地址
- 解析詳情頁里面想要獲取的數據
- 將數據進行保存到本地或者是數據庫
4-如果遇到阻礙進行反爬蟲對抗
- User-Agent是否是正常瀏覽器的信息
- 將請求頭設置成跟瀏覽器一樣的內容
- 因為爬蟲的爬取速度過快,會導致封號。1那么可以降低速度進行解決,2可以使用代理進行解決
- 如果設置需要憑證,那么可以采用無界瀏覽器真實模擬。
2.請求數據的庫
request,axios:通過庫,幫助我們快速實現HTTP請求包的打包
request.get('請求地址', {
'請求頭字段': '請求頭的value值'
},(res)=>{處理返回的內容});
axios優勢會更明顯,前后端通殺,前后端調用的方式一致。
axios.get('請求地址',參數對象).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})