【AI白身境】學深度學習你不得不知的爬蟲基礎


轉自 | 有三AI

作者 | 湯興旺 言有三


所謂白身,就是什麼都不會,還沒有進入角色。

對於深度學習,一個好的數據集可以說非常重要的,但是通常情況下我們並沒有大量的數據,因此我們有必要掌握一定的爬蟲知識,從而更好的準備訓練數據集。


01
前端網頁基礎


在介紹爬蟲之前我們先說下網頁基礎,理解前端網頁的一些基礎知識對於學習爬蟲是很有必要的,它是爬蟲的基礎之一。


1.1
網頁構成


通常情況下我們看到的網頁由三部分組成,分別是HTML、CSS和JavaScript,接下來我分別介紹它們。


1.1.1 HTML


HTML,全稱Hyper Text Markup Language,也就是“超文本鏈接標示語言”。但它不是一種編程語言,而是一種標記語言。我們通常看到的網頁就是HTML使用標記標籤來描述的。在HTML中,通常不同類型的文字通過不同類型的標籤來表示。如圖片用img標籤表示,視頻用video標籤表示,段落用p標籤表示。


現在我們看下網易雲音樂的源代碼,如下圖所示:



獲取這個網頁的源代碼很簡單,打開網頁後,按下F12鍵就會出現這個源代碼了。通過觀察這個HTML我們會發現整個網頁就是由各種標籤嵌套組合而成的,從而形成了整個網頁的架構。


1.1.2 CSS


從上面的介紹我們知道HTML定義了網頁的架構,可以認爲是一個框架,但若只有HTML,那麼這樣的網頁就太簡陋了,爲了讓我們的網頁更加好看點,我們就需要用CSS。


CSS,全稱Cascading Style Sheets,即層疊樣式表。“層疊”是指當在HTML中引用了數個樣式文件,並且樣式發生衝突時,瀏覽器能依據層疊順序處理。“樣式”指網頁中文字大小、顏色、元素間距、排列等格式。我們來看看網易雲音樂的CSS,如下所示。



1.1.3 JavaScript


上面介紹的HTML和CSS只能展現一種靜態信息,缺乏交互性。但我們在網頁裏通常會看到一些交互和動畫效果,如提示框、輪播圖等,這些動態信息通常就是通過JavaScript完成的。它的出現使得用戶與信息之間不只是一種瀏覽與顯示的關係,而是實現了一種實時、動態、交互的頁面功能。


這就是網頁構成的一些基本知識,你掌握了嗎?


1.2
URL


爬蟲最主要的處理對象是什麼?那毫無疑問肯定是URL,爬蟲的實質就是根據URL地址取得所需要的文件內容,然後對它進行進一步的處理。所以說準確理解URL也是理解網絡爬蟲的基礎之一。



URL,全稱是Uniform Resource Locator,通俗地說,URL是Internet上描述信息資源的字符串,主要用在各種WWW客戶程序和服務器程序上。URL也有它特定的格式,其格式由三部分組成,如下:


1.第一部分是協議(或稱爲服務方式)。

2.第二部分是存有該資源的主機IP地址(有時也包括端口號)。

3.第三部分是主機資源的具體地址,如目錄和文件名等。


通常第一部分和第二部分用“://”符號隔開,第二部分和第三部分用“/”符號隔開。另外第一部分和第二部分是不可缺少的,第三部分有時可以省略。 

我們通過一個URL的一個小例子來解釋下上面的三部分,下面是NBA中國官方網站湖人隊網頁的URL:


http://china.nba.com/lakers/


http這個是協議,也就是HTTP超文本傳輸協議,它是URL的第一部分;china.nba.com這個是網站名,由服務器名和域名構成,它是URL的第二部分;lakers就是存放網頁的根目錄,是URL的第三部分。

這就是URL的一些基礎知識,希望大家深刻理解。


通過上面的介紹,相信你對網頁的基礎知識也有了大致的瞭解,下面我們開始學習爬蟲相關庫的一些基礎知識。


02
python爬蟲庫


瞭解了網頁的一些基礎知識後,我們繼續來學習下python爬蟲的一些庫,我們都知道python有許多庫,如NumPy,matplotlib等,針對爬蟲它有個自帶的庫urllib。


2.1
urllib介紹


urllib是python自帶的一個主要用來爬蟲的標準庫,無需安裝可以直接用,它能完成如下任務:網頁請求、響應獲取、代理和cookie設置、異常處理和URL解析,可以說要想學會爬蟲,必須要學會它。


2.2
urllib基礎用法


我們已經知道urllib能完成網頁請求、響應獲取等許多任務,現在我來介紹下它的基本用法。


2.2.1 發起GET/POST請求


在用urllib實現GET和POST之前,我們先解釋下什麼是GET?什麼是POST?它們的區別又是啥?


GET和POST實際上就是HTTP請求的兩種基本方法,通常GET是從指定的資源請求數據,而POST是向指定的資源提交要被處理的數據。我們再看看它的區別是啥,請看下面表格:



哈哈,你現在看到這些肯定很悶逼。



我們從頭(HTTP)來分析下,我們已經知道HTTP是基於TCP/IP的關於數據如何在萬維網中如何通信的協議。HTTP的底層是TCP/IP,所以GET和POST的底層也是TCP/IP,也就是說,GET/POST都是TCP連接,GET和POST能做的事情是一樣的。


那它們的區別體現在哪呢?對於GET方式的請求,瀏覽器會把http header和data一併發送出去;而對於POST,瀏覽器先發送header,服務器響應後,瀏覽器再發送data。


也就是說,在大萬維網世界中,TCP就像汽車,我們用TCP來運輸數據,HTTP給汽車運輸設定了好幾個運輸方式,有GET, POST等。GET只需要汽車跑一趟就把貨送到了,而POST得跑兩趟,第一趟,先去和服務器打個招呼“嗨,我等下要送一批貨來,你們打開門迎接我”,然後再回頭把貨送過去。


你現在明白它們的區別了嗎?我們再看看urllib是如何使用這兩個方法的。


在urllib中有個request這個模塊,它主要是來負責構造和發起網絡請求。它有個urlopen()訪問方法,默認的訪問方法是GET,我們在urlopen()方法中傳入字符串格式的url地址後,此方法會訪問目標網址,然後返回訪問的結果。請看下面的實例:


from urllib import request

url = "https://zhuanlan.zhihu.com/p/20751612"

html = request.urlopen(url).read().decode("utf-8")

print(html)



urlopen()方法請求返回的對象類型爲HTTPResponse對象。


from urllib import request

url = "https://zhuanlan.zhihu.com/p/20751612"

html = request.urlopen(url)

print(type(html))



返回的狀態爲200,即返回數據。


print(html.status)



返回的數據會是bytes的二進制格式,所以需要decode()一下,轉換成字符串格式。


print(html.read().decode("utf-8")



這就是GET方式的一個最基本的運用,對於POST方法的實現其實和GET差不多,只不過多了一個data參數。即若添加data參數,就是以POST請求方式進行,如果沒有data參數就是GET請求方式,請看下面一個POST案例。



這裏通過使用http://httpbin.org/post網站演示(該網站可以作爲練習如何使用urllib的一個站點使用,能夠模擬各種請求操作)完成了一次POST請求。


通過上面的介紹我相信你對urllib的基礎知識有了一個比較深刻的瞭解,但這遠遠不夠,需要我們在實踐中不斷豐富我們的知識庫,另外,urllib只是爬蟲一個最基礎的庫,務必掌握,其他一些高端的庫根據需要可以自行學會。


到目前爲止我們還沒有進行爬一些張圖片或者視頻的實驗。下面我們看看如何來爬一些圖片。


03
爬蟲小實驗


在本節我將介紹如何對知乎上某個專欄的一些圖片進行爬蟲。

話不多說,直接上這個小實驗的代碼(寫在pachong.py文件中)如下:


from urllib import request

from bs4 import BeautifulSoup

import re

import time

url = "https://zhuanlan.zhihu.com/p/20751612"

html = request.urlopen(url).read().decode("utf-8")

soup = BeautifulSoup(html,"html.parser")

links = soup.find_all("img","origin_image zh-lightbox-thumb",src = re.compile(r'.jpg$'))

path = r"/home/tangxingwang/paichong_picture"

for link in links:

    print(link.attrs['src'])

    request.urlretrieve(link.attrs["src"],path+'\%s.jpg' % time.time())  



在本實例中,我們用Beautiful Soup結合正則表達式的方式來提取符合要求的鏈接,鏈接要求是在img標籤中,class=origin_image zh-lightbox-thumb,而且鏈接是.jpg結尾。



soup = BeautifulSoup(html,"html.parser")

links = soup.find_all("img","origin_image zh-lightbox-thumb",src = re.compile(r'.jpg$'))


提取出所有鏈接後,使用request.urlretrieve來將所有鏈接保存到本地

在終端執行上面程序代碼即可爬取圖片


python3  pachong.py



04
github爬蟲工程


接下來我們看看github上一些優秀的爬蟲工程。


4.1
github圖片爬蟲工程


在github上有許多優秀的圖片爬蟲項目,我們選擇一個對百度圖片爬蟲的工程詳細解釋下。下面是這個工程項目的github鏈接:


https://github.com/kong36088/BaiduImageSpider


我們將其clone下來後,有下圖所示的一些文件:



接下來我們打開index.py這個文件,按照自己的需求修改自己的下面這一行代碼



我把索引改成了科比,總數爲1頁,然後運行下面代碼


python3 index.py


執行python3 index.py後你會發現有大量的圖片在下載,如下圖所示:



我們再看下文件的變化,你會現在的文件比我們之前clone下來的多了個科比文件夾,如下圖所示:



打開科比這個文件夾,你會發現有許多科比的照片。



關於對百度圖片爬蟲就講解到這,github上還有大量這樣的項目,如下:


1.該github工程是關於對知乎裏面某個問題下所有的圖片進行爬蟲。下面是鏈接:


https://github.com/ladingwu/python_zhihu


2.該github工程是關於對微博某個用戶相冊裏面所有的圖片進行爬蟲。下面是鏈接:


https://github.com/lincanbin/Sina-Weibo-Album-Downloader


3.該github工程是關於對花瓣裏面旅遊模塊圖片進行爬蟲,下面是鏈接


https://github.com/darrenfantasy/image_crawler/tree/master/Huaban


4.該github工程是關於對google image進行爬蟲。下面是鏈接:


https://github.com/Ehco1996/Python-crawler/tree/master/Google-Image


這就是github上一些關於圖片爬蟲的工程,當然github上關於圖片爬蟲的工程還有很多,有需要可以自己search再學習學習。


4.2
github視頻爬蟲工程


說完圖片的一些工程,我們再看看github上一些比較好的視頻工程。下面這個鏈接是關於對抖音視頻進行爬蟲的一個項目。鏈接如下:


https://github.com/loadchange/amemv-crawler


clone下來有如下文件



現在打開文件`share-url.txt`,把你想要下載的抖音號分享鏈接編輯進去,以逗號/空格/tab/表格鍵/回車符分隔都行,可以多行。


樣式如下:



然後在終端執行 下面代碼即可下載


python3 amemv-video-ripper.py



下載後的視頻保存在download文件件裏面,裏面有各個抖音號的小視頻



在github中關於視頻爬蟲的工程實際上還有很多,大家可以去上面看看!


最後附上一個github上關於學習爬蟲比較好的乾貨。鏈接如下。


https://github.com/Ehco1996/Python-crawler



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