Python爬蟲學習之旅-從基礎開始

楠槡發表於2018-01-15

很早就想學習爬蟲了,但是一直沒有開始。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佇列,進行迴圈
  • 解析下載網頁,獲取所需資料
  • 存入資料庫,資料持久化處理

Spider原理

爬蟲的基本策略

在爬蟲系統中,待處理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
複製程式碼

當然,因為安裝的是 pythonanaconda 發行版,所以也可以使用 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) 
複製程式碼

執行後獲取並列出妹子圖所有的標題和連結。

這就是一個最簡單的爬蟲示例。

相關文章