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 : 支持自動跳轉
- 在某些URL被訪問時,網站返回一個應該跳轉的URL(比如 http://baidu.com 返回 應該跳轉到 http://www.baidu.com )
- 首先,我們要知道爬 http://baidu.com 的時候返回的頁面是怎麼樣的,其中頁面內容如下:
<html>
<meta http-equiv=”refresh” content=”0;url=http://www.baidu.com/”>
</html>
- 看代碼可知,這是一個利用 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