很早就想學習爬蟲了,但是一直沒有開始。18年給自己定了很多學習計劃,大體還是循序漸進的,整理下思路,
Docker
容器化和Python
爬蟲應該是擺在前置位的,算是基礎。Web
方面,dotNet Core
感覺有點陷入僵局了,只好暫且放一放,轉而學習下Python
的爬蟲和Web框架-Django
等,算是換換思路。Talk is cheap,show me the code!
爬蟲原理
知其然,知其所以然。使用爬蟲,必須要先理解爬蟲的原理,先說下爬蟲的基本流程和基本策略。
爬蟲的基本流程
網路爬蟲的基本工作流程如下:
- 提供種子URL
- 任務佇列開始處理種子URL
- 根據URL,解析DNS,下載URL相對應的網頁,儲存已下載網頁,將URL歸入已抓取URL佇列。
- 分析已抓取URL佇列,將URL中的內鏈放入待抓取URL佇列,進行迴圈
- 解析下載網頁,獲取所需資料
- 存入資料庫,資料持久化處理
爬蟲的基本策略
在爬蟲系統中,待處理URL佇列是很重要的一部分。待處理URL佇列的處理順序也很重要,因為這涉及到抓取頁面的順序,而決定這些URL佇列排序的方法,叫做抓取策略。
這裡例舉兩種常用的策略方法:
- DFS(深度優先策略) 深度優先策略是指爬蟲從某個URL開始,一個連結一個連結的爬取下去,直到處理完了某個連結所在的所有線路,才切換到其它的線路。 此時抓取順序為:A -> B -> C -> D -> E -> F -> G -> H -> I -> J
- BFS(廣度優先策略) 寬度優先遍歷策略的基本思路是,將新下載網頁中發現的連結直接插入待抓取URL佇列的末尾。也就是指網路爬蟲會先抓取起始網頁中連結的所有網頁,然後再選擇其中的一個連結網頁,繼續抓取在此網頁中連結的所有網頁。 此時抓取順序為:A -> B -> E -> G -> H -> I -> C -> F -> J -> D
爬蟲工具
工欲善其事,必先利其器。
實現Python爬蟲,一些得力助手是必不可少的,下面一一介紹一下。
anaconda
anaconda官網 - 是Python的一個科學計算的發行版。
這裡以官方最新版本(18/1/10)3-5.0.1
為例,通過安裝指令碼安裝(Ubuntu環境)。
事實上,win下的安裝更為簡單,也可以配合PyCharm食用更佳。
因為資源在國外,所以下載速度很慢,可以使用清華大學映象源
$ wget
https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/Anaconda3-5.0.1-Linux-x86_64.sh
$ bash Anaconda3-5.0.1-Linux-x86_64.sh
複製程式碼
下載並執行指令碼後,按照提示逐步安裝。
Requests
Requests官方文件 - 是一個urllib的升級版本打包了全部功能並簡化了使用方法。
python 安裝模組十分方便,直接使用pip
指令安裝
$ pip install requests
複製程式碼
當然,因為安裝的是 python
的 anaconda
發行版,所以也可以使用 conda
指令進行安裝。
$ conda install requests
複製程式碼
LXML
一個HTML解析包 用於輔助beautifulsoup解析網頁。
$ pip install lxml
複製程式碼
BeautifulSoup
BeautifulSoup官方文件 - 是一個可以從HTML或XML檔案中提取資料的Python庫.它能夠通過你喜歡的轉換器實現慣用的文件導航,查詢,修改文件的方式。對於初學者而言,體驗大大由於使用正規表示式自行匹配。
$ pip install beautifulsoup4
複製程式碼
簡單爬蟲測試
先來建立第一個指令碼,這裡預設已有Python
基礎。
#!/usr/bin/env python
# coding=utf-8
import requests ## 匯入requests
from bs4 import BeautifulSoup ## 匯入bs4中的BeautifulSoup
import os
## 瀏覽器請求頭資訊,模擬瀏覽器
headers = {'User-Agent':"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1(KHTML, like Gecko) Chrome/22.0.1207.1 Safari/537.1"}
## 開始的URL地址
all_url = 'http://www.mzitu.com/all'
## 使用requests中的get方法來獲取all_url
start_html = requests.get(all_url,headers=headers)
## 列印出start_html
print(start_html.text)
複製程式碼
執行後獲取並列出妹子圖所有的標題和連結。
這就是一個最簡單的爬蟲示例。