一:抓取簡單的頁面:
用Python來做爬蟲抓取網站這個功能很強大,今天試着抓取了一下百度的首頁,很成功,來看一下步驟吧
首先需要准備工具:
1.python:自己比較喜歡用新的東西,所以用的是Python3.6,python下載地址:https://www.python.org/
2.開發工具:用Python的編譯器即可(小巧),不過自己由於之前一直做得前端,使用的webstrom,所以選擇JetBrains 公司的PyCharm,下載地址:https://www.jetbrains.com/zh/pycharm/specials/pycharm/pycharm.html?utm_source=baidu&utm_medium=cpc&utm_campaign=cn-bai-pro-pycharm-ex-pc&utm_content=pycharm-download&utm_term=pycharm%E4%B8%8B%E8%BD%BD
3.Fiddler -- 網頁請求監控工具,我們可以使用它來了解用戶觸發網頁請求后發生的詳細步驟;(自行百度下載)
了解Python中urllib庫
Python2系列使用的是urllib2,Python3后將其全部整合為urllib,
在2中:
urllib2.urlopen(url, data=None, [timeout, ]*, cafile=None, capath=None, cadefault=False, context=None) urllib2.Request(url, data=None, headers={}, origin_req_host=None, unverifiable=False, method=None)
3中是
urllib.request.urlopen(url, data=None, [timeout, ]*, cafile=None, capath=None, cadefault=False, context=None) urllib.request.Request(url, data=None, headers={}, origin_req_host=None, unverifiable=False, method=None) #這個函數看起來接受很多的參數啊,不過很多我們平時不會用到,用到的url居多。
很明顯,我用后者
簡單爬蟲代碼
#encoding:UTF-8
import urllib.request
url = "https://www.douban.com/ "
data = urllib.request.urlopen(url).read()
data = data.decode('UTF-8')
print(data)
效果如下:
二:抓取需要偽裝瀏覽器的網站
但是一個小小的百度首頁怎能滿足我,於是我又想到了一些需要需要偽裝瀏覽器才能抓取的網站,比如豆瓣,
1.偽裝瀏覽器:
對於一些需要登錄的網站,如果不是從瀏覽器發出的請求,則得不到響應。所以,我們需要將爬蟲程序發出的請求偽裝成瀏覽器正規軍。
具體實現:自定義網頁請求報頭。
2.、使用Fiddler查看請求和響應報頭
打開工具Fiddler,然后再瀏覽器訪問“https://www.douban.com/”,在Fiddler左側訪問記錄中,找到“200 HTTPS www.douban.com”這一條,點擊查看其對應的請求和響應報頭具體內容:
3.進行訪問:
import urllib.request
import ssl
ssl._create_default_https_context = ssl._create_stdlib_context
# 定義保存函數
def saveFile(data):
path = "F:\\pachong\\02_douban.out"
f = open(path, 'wb')
f.write(data)
f.close()
# 網址
url = "https://www.douban.com/"
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) '
'Chrome/51.0.2704.63 Safari/537.36'}
req = urllib.request.Request(url=url, headers=headers)
res = urllib.request.urlopen(req)
data = res.read()
# 也可以把爬取的內容保存到文件中
saveFile(data)
data = data.decode('utf-8')
# 打印抓取的內容
print(data)
# 打印爬取網頁的各類信息
print(type(res))
print(res.geturl())
print(res.info())
print(res.getcode())
我們來看這段代碼:
import ssl
ssl._create_default_https_context = ssl._create_stdlib_context
這句是為了能獲取到https而插入的代碼,沒他沒法獲取https
輸出結果: