爬蟲-01:概述

流程

當我們使用瀏覽器瀏覽網頁之時,本質上是從服務器上拿到一堆“字符”,這些字符由 html/css/js 三者組成。然後經過瀏覽器解析成漂亮的界面顯示出來,這就是我們看到的網頁。

而爬蟲就是跳過瀏覽器,不斷的訪問服務器,將服務器發送過來的“字符”截住,自己解析,提取出有用的信息。然後將這些信息以不同的格式存入磁盤中。

總結一下,以上的流程可以分爲三步,即獲取數據,提取數據,存儲數據。

涉及到的庫

  • 獲取數據:requests,urllib 和 selenium 等這些庫用於處理 http 請求。

  • 提取數據:re 中的正則表達式,Beautifusoup 和 lxml ,解決中文亂碼。

  • 存儲數據:python 的文件操作可以講提取到的數據存入 txt/csv 文件中,或者存入數據庫中。

安裝庫

經過我的不斷嘗試,我發現這個方法是最便捷的,例如安裝 urllib 這個包如下,安裝其他包的話可以直接將 urllib 名字修改成包名即可。

pip install urllib http://pypi.douban.com/simple --trusted-host pypi.douban.com

獲取數據

下面提供兩個模塊 requests/urllib 的簡單使用方法。橫向比較,個人推薦 requests 模塊。

requests

首先是導入模塊 prequests ,然後通過 get 請求拿到一個瀏覽器對象。

如果沒有下載 requests 模塊需要先下載。win10 系統上 win + r 然後輸入 cmd ,使用如下命令下載。

pip install urllib http://pypi.douban.com/simple --trusted-host pypi.douban.com

首先將需要獲取頁面的 url 存入變量中。

然後使用 get 方法獲取網頁對象。

最後網頁文本。

import requests

url = "http://www.baidu.com"
r = requests.get(url)
print(r.text)

結果出現了亂碼問題,中文編碼出現了問題。

點開百度的網頁,按 F12 通過查看頁面的 head 部分發現,編碼方式爲 utf-8 。

而 reauests 通過 text 顯示數據的時的編碼方式爲 unicode 編碼,所以改成 utf-8 即可。

import requests

url = "https://www.baidu.com/"
r = requests.get(url)
html = str(r.content,'utf-8')
print(html)

這樣爬出來的結果沒有問題,可以創建一個 html 文件,將輸出的字符粘貼進去然後查看頁面。

注意 :r.text返回的是Unicode型的數據。r.content返回的是bytes型也就是二進制的數據。

所以可以通過 r.content 方法獲取二進制數據,然後修改成 utf-8 的編碼方式顯示出來。

urllib

使用 urllib 模塊,這個模塊是 python 3 自帶的,可以直接使用。

import urllib
url = "https://www.baidu.com/"
r = urllib.request.urlopen(url)
print(r.read())

同樣結果的中文編碼有問題,

import urllib
url = "https://www.baidu.com/"
r = urllib.request.urlopen(url)
print(r.read().decode('utf-8'))

設置編碼格式後,發現得到的內容和網頁中按 F12 得到的內容不一致。

原因是 https,urllib 對 https 的解析出了問題。經過嘗試改成 htpp 後該問題得以解決。

注:https 可以簡單的理解爲是在 http 協議的基礎上添加了 ssl 加密協議。實現了由明文傳輸到密文傳輸。

import urllib
url = "http://www.baidu.com/"
r = urllib.request.urlopen(url)
print(r.read().decode('utf-8'))

這樣得到的內容和瀏覽器訪問到的源碼完全一致。

僞裝

訪問完 百度後,訪問豆瓣試試。

import urllib
url = "http://www.douban.com/"
r = urllib.request.urlopen(url)
print(r.read().decode('utf-8'))

修改 url ,運行後發現報錯!

查看一下狀態碼,看一下哪裏差錯了。

import urllib
url = "http://www.douban.com/"
r = urllib.request.urlopen(url)
print(r.status_code())

urllib.error.HTTPError: HTTP Error 418: 服務器返回了一個 418 的數字。

這些數字都有一定的含義,被稱爲錯誤狀態碼,也就是發送錯誤時返回過來的代碼,不同的數字代表不同的錯誤類型。

例如常見的 404 代表找不到所訪問的網頁。這裏 418 在這裏可以理解爲瀏覽器知道你是爬蟲,不允許你訪問我的頁面。

所以需要僞裝成瀏覽器訪問,當去服務器中“拿東西”時都會表明身份。使用爬蟲訪問時加上一部分內容(User-Agent)表示自己是瀏覽器就行了。

至於 User-Agent 獲取的具體方式請搜索。

import urllib

header = {'User-Agent': "Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36"}
url = "http://www.douban.com/"
req = urllib.request.Request(url=url,headers=header)
res = urllib.request.urlopen(req)
print(res.read().decode('utf-8'))

然後就沒問題了,得到豆瓣的頁面源碼。下一步是就是從中如何提取有效的信息了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章