Python 3 爬蟲的自我探索(二)

1. Python網絡爬蟲——V 1.0

Step 1 : 實現抓取Startup News,並運行

import re
import urllib.request
import urllib

from collections import deque

# 定義隊列和集合
queue = deque()
visited = set()

url = 'http://news.dbanotes.net'  # 入口頁面, 可以換成別的

queue.append(url)
cnt = 0

while queue:
    url = queue.popleft()  # 隊首元素出隊
    visited |= {url}  # 標記爲已訪問

    print('已經抓取: ' + str(cnt) + '   正在抓取 <---  ' + url)
    cnt += 1
    urlop = urllib.request.urlopen(url)

    # 由於正則表達式中設置,所有連接都會爬,但是假如是jpg、ico等文件,在轉化爲UTF-8過程中會出錯
    # 所以此處先判斷其是文件類型,需要是HTML才繼續進行分析

    if 'html' not in urlop.getheader('Content-Type'):
        continue

    # 避免程序異常中止, 用try..catch處理異常
    try:
        data = urlop.read().decode('utf-8')
    except:
        continue

    # 正則表達式提取頁面中所有隊列, 並判斷是否已經訪問過, 然後加入待爬隊列
    linkre = re.compile('href=\"(.+?)\"')
    for x in linkre.findall(data):
        if 'http' in x and x not in visited:
            queue.append(x)
            print('加入隊列 --->  ' + x)

在調試期間,出現瞭如下異常:(明顯是因爲網站限制爬取頁面導致的,暫時先不理這個異常)

urllib.error.HTTPError: HTTP Error 403: Forbidden

2. Python網絡爬蟲:V 2.0(僞裝瀏覽器君)

Step 1 : 添加超時跳過功能

urlop = urllib.request.urlopen(url, timeout = 2)

Step 2 : 支持自動跳轉

  1. 在某些URL被訪問時,網站返回一個應該跳轉的URL(比如 http://baidu.com 返回 應該跳轉到 http://www.baidu.com
  2. 首先,我們要知道爬 http://baidu.com 的時候返回的頁面是怎麼樣的,其中頁面內容如下:
<html>
<meta http-equiv=”refresh” content=”0;url=http://www.baidu.com/”>
</html>
  1. 看代碼可知,這是一個利用 html 的 meta 來刷新與重定向的代碼, 其中的0是等待0秒後跳轉, 也就是立即跳轉. 這樣我們再像上一次說的那樣用一個正則表達式把這個url提取出來就可以爬到正確的地方去了.

Step 3 : 僞裝瀏覽器正規軍

根據理論知識(HTTP報文)可知,在 GET 時,將 User-Agent 添加到header裏

方法1:簡便直接,但不好拓展功能

import urllib.request

url = 'http://www.baidu.com/'
req = urllib.request.Request(url, headers = {
    'Connection': 'Keep-Alive',
    'Accept': 'text/html, application/xhtml+xml, */*',
    'Accept-Language': 'en-US,en;q=0.8,zh-Hans-CN;q=0.5,zh-Hans;q=0.3',
    'User-Agent': 'Mozilla/5.0 (Windows NT 6.3; WOW64; Trident/7.0; rv:11.0) like Gecko'
})
oper = urllib.request.urlopen(req)
data = oper.read()
print(data.decode())

方法2:使用build_opener這個方法, 用來自定義opener,這種方法的好處是可以方便的拓展功能

import urllib.request
import http.cookiejar

# head: dict of header
def makeMyOpener(head = {
    'Connection': 'Keep-Alive',
    'Accept': 'text/html, application/xhtml+xml, */*',
    'Accept-Language': 'en-US,en;q=0.8,zh-Hans-CN;q=0.5,zh-Hans;q=0.3',
    'User-Agent': 'Mozilla/5.0 (Windows NT 6.3; WOW64; Trident/7.0; rv:11.0) like Gecko'
}):
    cj = http.cookiejar.CookieJar()
    opener = urllib.request.build_opener(urllib.request.HTTPCookieProcessor(cj))
    header = []
    for key, value in head.items():
        elem = (key, value)
        header.append(elem)
    opener.addheaders = header
    return opener

oper = makeMyOpener()
uop = oper.open('http://www.baidu.com/', timeout = 1000)
data = uop.read()
print(data.decode())

Step 4 : 保存抓回來的報文

使用Python進行文件操作

def saveFile(data):
    save_path = 'D:\\temp.out'
    f_obj = open(save_path, 'wb') # wb 表示打開方式
    f_obj.write(data)
    f_obj.close()

# 這裏省略爬蟲代碼
# ...

# 爬到的數據放到 dat 變量裏
# 將 dat 變量保存到 D 盤下
saveFile(dat)

3. 開發網絡爬蟲: V 3.0 (登錄)

Step 1 : 實現解壓縮

import gzip
def ungzip(data):
    try:        # 嘗試解壓
        print('正在解壓.....')
        data = gzip.decompress(data)
        print('解壓完畢!')
    except:
        print('未經壓縮, 無需解壓')
    return data
發佈了34 篇原創文章 · 獲贊 5 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章