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

當然,因為安裝的是 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)

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

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