1. 程式人生 > >urllib庫的簡單使用 && 一個簡單的Python爬蟲示例

urllib庫的簡單使用 && 一個簡單的Python爬蟲示例

urllib庫的簡單使用 && 一個簡單的Python爬蟲示例

本篇文章,介紹urllib.request庫的簡單使用以及注意的問題。最後實現一個Python爬蟲的示例。

本文是基於Python3.6.2實現的。urllib.request相當於Python2.7中的urllib2的庫的一部分。

urllib.request庫的簡單使用

  • urlopen():
# 請求一個百度地址,返回一個伺服器響應的類檔案物件response。
response = urllib.request.urlopen('http://www.baidu.com/')

# 讀取檔案的內容
result = response.read() # 列印result,輸出的就是百度的網頁原始碼 print(result) # 列印result的型別,結果是<class 'bytes'> print(type(result)) # 讀取到檔案,檔名baidu.html with open('baidu.html','wb') as f: f.write(result)

通過瀏覽器開啟baidu.html檔案,實際和瀏覽器輸出http://www.baidu.com/結果是一樣的。

  • 防止爬蟲程式的ip被禁

其實上面的程式還不夠好,因為我們直接通過urlopen(url)

傳送請求,實際上在http的請求頭中有一個User-Agnet欄位會標記為Python-urllib/3.6。如下面的httpheaders是通過fiddler抓包獲取的。

GET http://www.baidu.com/ HTTP/1.1
Accept-Encoding: identity
Host: www.baidu.com
User-Agent: Python-urllib/3.6
Connection: close

瀏覽器訪問的header資訊如下:

GET https://www.baidu.com/ HTTP/1.1
Host: www.baidu.com
Connection: keep-alive
User-Agent: Mozilla/5.0
(Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.62 Safari/537.36 ...

我們通過爬蟲程式訪問的第三方伺服器,伺服器就能知道你是通過爬蟲程式訪問的。因為你的http的請求頭資訊User-Agent欄位出賣了你。所以我們需要修改請求頭的User-Agent欄位資訊,防止ip被禁。

# 定義一個url
url = 'http://www.baidu.com/'

# 定義一個請求頭的User-Agent欄位,User-Agent的內容可以通過fiddle抓取瀏覽器訪問的url的header中的資訊,模擬瀏覽器訪問,也可以網上隨便找一個
headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.62 Safari/537.36'}

# 自定義請求頭資訊,返回一個請求的物件request,Request()引數,還可以接收data引數,表示請求體
request = urllib.request.Request(url,headers = headers)

# 通過urlopen訪問url,伺服器返回response物件
response = urllib.request.urlopen(request)

# 讀取返回結果
result = response.read()

# 寫入檔案
with open('baidu.html','wb') as f:
    f.write(result)
  • 獲取返回響應的資料

當獲取響應的response物件時,我們可以獲取響應碼,響應體等資訊,如:

# 獲取響應碼
response.getcode()

# 獲取請求的url
response.geturl()

# 獲取響應頭資訊
response.info()
  • quote()unquote()

在url的get請求,url會有中文的問題,這時的中文需要轉碼成urlencode編碼。我們需要通過quote()處理中文字元的問題。

# 將中文轉成urlencode編碼
result = urllib.request.quote('薛之謙')

# 輸出,結果:%E8%96%9B%E4%B9%8B%E8%B0%A6
print(result)

# 將urlencode編碼的資料,進行解碼
result = urllib.request.unquote('%E8%96%9B%E4%B9%8B%E8%B0%A6')

# 輸出,結果:薛之謙
print(result)

一個簡單的Python爬蟲示例

該爬蟲爬取的網站是百度貼吧。具體入下:

建立一個tieba.py的檔案,程式碼如下:

#!/usr/bin/env python
# encoding: utf-8

import urllib.request


def load_page(request):
    """
    載入網路的頁面資訊
    :param request: 請求引數
    :return:返回服務端的響應資訊
    """
    return urllib.request.urlopen(request)


def write_page(response, filename):
    """
    將響應返回的資訊,寫入檔案儲存
    :param response:伺服器返回的響應資訊
    :param filename:儲存的檔名
    :return:
    """
    content = response.read()
    with open(filename, 'wb') as f:
        f.write(content)


def spider(url, headers, startPage, endPage):
    """
    爬取網頁的方法
    :param url: 請求的url
    :param headers:自定義的請求頭資訊
    :param startPage:請求的開始頁面
    :param endPage:請求的結束頁面
    :return:
    """
    for page in range(startPage, endPage + 1):
        page = (page - 1) * 50
        # 通過研究頁面的規律,拼接需要請求的完整url
        fullUrl = url + '&pn=' + str(page)
        print(fullUrl)
        # 獲取請求物件
        request = urllib.request.Request(fullUrl, headers=headers)
        # 載入頁面,返回服務端的響應
        response = load_page(request)
        # 拼接檔名
        filename = '第' + str(int(page / 50 + 1)) + "頁.html"
        # 寫入檔案
        write_page(response, filename)


if __name__ == '__main__':
    # 百度貼吧的url
    url = 'https://tieba.baidu.com/f?'
    # 防止ip被禁,重新指定User-Agent欄位資訊
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.62 Safari/537.36'}
    # 通過輸入關鍵字查詢
    keyword = input('請輸入關鍵字:')
    # 輸入的文字(如:中文)進行urlencode編碼
    keyword = urllib.request.quote(keyword)
    # 拼接url
    fullUrl = url + "kw=" + keyword
    # 輸入起始頁
    startPage = int(input("輸入起始頁:"))
    # 輸入結束頁
    endPage = int(input('輸入結束頁:'))
    # 開始抓取頁面
    spider(fullUrl, headers, startPage, endPage)

執行tieba.py檔案,在控制檯會讓你輸入:請輸入關鍵字:等。如圖:

image