Python爬蟲學習之旅-從基礎開始
- 2019 年 12 月 4 日
- 筆記
很早就想學習爬蟲了,但是一直沒有開始。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)
執行後獲取並列出妹子圖所有的標題和鏈接。
這就是一個最簡單的爬蟲示例。