Python爬蟲基礎教學(寫給入門的新手)

  • 2019 年 10 月 11 日
  • 筆記

前言

剛學完python基礎,想學習爬蟲的新手,這裡有你想要的東西。

本文着重點在於教新手如何學習爬蟲,並且會以外行人的思維進行形象地講解。最近我一兄弟想學,我就想寫個教學給他,然後想不如分享到網絡上,給熱愛學習的人們一起學習探討。

環境安裝

python3.7.1

pip install requests

pip install beautifulsoup4

pip install lxml

技術講解

requests庫

requests一般用於發起http請求,並且拿到請求的結果。http常用的請求有兩種,GET和POST,爬蟲主要用的是GET請求。

在不懂http,https和dns,TCP/IP等協議的情況下,我直接打個比方來解釋一下什麼是GET請求,以360瀏覽器為例,人在360瀏覽器輸入www.baidu.com,然後敲擊enter鍵,直到頁面出現,整個過程,我們可以抽象為我們向百度服務器發起的一次GET請求。

更專業,更詳細的解釋,自己去百度學習吧。

如何使用requests庫來模擬瀏覽器的行為來獲取頁面內容呢?

示例代碼如下

import requests  web = requests.get('https://www.baidu.com')  #向百度發起一次get請求,返回請求結果的實體類  print(web.status_code)    #請求返回的狀態碼,200是OK,404是頁面不存在,500是錯誤,更多自己百度搜索  print(type(web.content))    #頁面內容的數據類型是bytes,因此需要解碼  print(type(web.content.decode()))  print(web.content.decode())    #解碼之後,得到的頁面內容是結構化的字符串  

這樣看起來,我們獲取到的頁面內容不是我們在瀏覽器看到的圖形化界面,而是字符串,更像是一些代碼。如果你學過html和css那就不用多說了。沒學過也不要緊,現在可以簡單學一下,也就花幾分鐘了解一下就夠用了。

html是一種標記語言,可以被瀏覽器執行,然後呈現出可視化的圖形界面。如果你把web.content.decode()這一串字符串保存在test.html里,然後雙擊打開,你會看到圖形化界面的,只不過有些圖片可能顯示不了,這裡就不細說了。

html其實很好理解,不要想得太複雜,就是一段有規律的格式化的文本。

其基本格式就是

<html>    <head>...</head>    <body>...<body>    <script>...</script>    <style>...</style>    </html>  

html文本的標籤一般都是成雙成對,有始有終的,比如<body>和</body>是一隊,千萬不能拆散,拆散就亂套了。少數除外比如<br>是換行用的,可以不用配對。

這裡我們主要講body標籤,網頁的主要內容都是在這個標籤里顯示的,比如標題,段落,圖片等

在test.html里我們寫入一下代碼並且保存。

<html>    <body>    <h1>我的網站</h1>    <p>這是我的網站</p>    </body>    </html>

html更多標籤所代表的意義可以去這裡學習 http://www.runoob.com/html/ht…

beautifulsoup4庫

bs4(簡稱)庫是用於解析格式化文本,提取數據用的庫。

我們利用requests庫的get函數拿到網頁的內容是一段格式化的字符串,接下來就可以用bs4來解析它。

解析的示例代碼如下

from bs4 import BeautifulSoup    html = '''<html>    <body>    <h1>我的網站</h1>    <p>這是我的網站</p>    <body>    </html>'''    #從網頁拿到html的格式化的字符串,保存到html里    soup = BeautifulSoup(html, 'lxml')    #使用lxml解析器來解析文本,html和xml格式是類似的    print(soup.find_all('h1'))    #使用find_all函數來找所有的h1標籤,返回的結果是數組    print(soup.find_all('p'))    #找所有的p標籤,返回的結果是數組        更複雜一點的,比如        from bs4 import BeautifulSoup    html = '''<html>    <body>    <h1>我的網站</h1>    <p>這是我的網站</p>    <div class='test-item'>    測試1    </div>    <div class='test-item'>    測試2    </div>    <body>    </html>'''    soup = BeautifulSoup(html, 'lxml')    div_tags = soup.find_all(name='div', attrs={'class': 'test-item'})    for tag in div_tags:        print(type(tag))        print(tag)        print(tag.string)        print(tag.attrs, 'n')  

注意,tag保存的不是字符串,而是bs4模塊中的一個標籤實體類,我們主要需要知道它的attrs屬性和string屬性,方便我們拿到一些我們想要的文本和信息,比如a標籤的href屬性就保存在attrs里。

總結

本文主要講了如何使用requests獲取網頁文本內容,以及如何解析html文本,更多更好用的爬蟲庫