從零開始寫Python爬蟲 --- 爬蟲實踐:螺紋鋼數據&Cookies
學期末,女票寫論文需要 螺紋鋼HRB400 20MM兩年內的均價數據,這個數據在 我的鋼鐵網有,但是只免費提供一條一條的數據,如果你需要一定時間內的數據,要付費99元。我只能說太坑了吧!當然,這是難不倒我們的。寫個小爬蟲把每天的數據爬出來就成。
目標分析:
要爬的數據在我的鋼鐵網:http://www.mysteel.com/
看了一下,居然要登錄才能查看數據,這就很尷尬了,
到目前為止我們還沒有遇到過這種需要登錄才能獲取數據的網站。
解決思路:
解決的方式很簡答,需要登錄我們就登錄就好了,有一下三個方式:
- PhantomJS模擬瀏覽器登錄
- 通過HTTP的POST請求登錄
- 直接載入cookies登錄
三種方法各有各的好處:
第一種方式用起來簡單,但是效率慢
第二種登錄時需要準備挺久,但是一勞永逸第三種簡單又方便,但是對某些網站不適用我綜合考慮了一下,既然只是為了抓幾百條數據,也沒必要弄得那麼複雜,直接用傳輸cookies的方式就成。
關於Cookies:
有些同學可能沒有聽說過cookies,先來看一下wiki百科的定義:
Cookie(複數形態Cookies),中文名稱為「小型文本文件」或「小甜餅」[1],指某些網站為了辨別用戶身份而儲存在用戶本地終端(Client Side)上的數據(通常經過加密)。定義於RFC2109。是網景公司的前僱員盧·蒙特利在1993年3月的發明
簡單的來說,cookies就是伺服器給你發的一長段隨機的數據,這個數據包含著你個人的信息。每次你向伺服器發送請求的時候,(如果該請求包含著驗證信息)伺服器就會通過對比cookies的值來驗證你的身份。具體請看 csrf攻擊
當然,由於這種驗證方式及其不安全,只要懂一點點的網路知識的人,就能輕易盜取你的cookie,從而不需要密碼來登錄你瀏覽的網站。
前一段時間,不是還有一個通過公用wifi掃描來獲取cookie從而盜取信息的軟體嗎。總之在新的替代方式推廣之前,大家不要在公用的網路環境下用http的web應用啦。
獲取登錄用的Cookies:
既然是cookies是拿來驗證身份信息的,
我們如何獲取網站的登錄cookies並用到我們的爬蟲里去呢?
這裡又要用到我們的老朋友chrome開發者工具了:
首先我們需要先註冊賬號,並登錄, 登錄完成之後打開:
chrome 開發者工具 --- Network --- 網頁
在右邊的requests headers里就能找到我們需要的信息了:
我圈出來的那一長串數據,就是我們所需要的cookies了。將它複製下來,一會要用。
代碼的書寫:
這個爬蟲並不難寫,只要找到想辦法登錄上去
就能用bs4 Xpath之類的方式輕鬆找到我們要的數據,
看代碼吧:
import requestsfrom bs4 import BeautifulSoupfrom bs4.element import NavigableString# 我們剛才獲取的cookies,我瞎打的 raw_cookies = sadasdasdasadasdasdsadasdsadasdasdas# 我們在用requests傳輸cookies的時候,需要以字典的形式來傳輸,# 下面的代碼是將我們複製的一長串數據,通過 分號 分割並組成鍵值對,放入字典cookies = {}for line in raw_cookies.split(;): key, value = line.split(=, 1) cookies[key] = value def get_one_data(url, cookies): 處理每個頁面數據的函數、、 利用bs4庫篩選數據,並寫入本地 # 重點就在這裡,我們在發送請求的時候,將登陸用的cookies傳了進去,這樣就能夠獲取驗證數據了 r = get_html(url, cookies) soup = BeautifulSoup(r, lxml) # 這裡由於網頁時間跨度大,所以位置不一樣,這就需要判斷一下是否抓到了我們需要的數據 date = soup.find(div, class_=info).contents[1] # 判斷是否抓到了數據 if type(date) != NavigableString: date = soup.find(div, class_=info).contents[0] datalist = soup.find(tr, attrs={bgcolor: #FEFBEC}).contents data = datalist[-2].text with open(hrb400_20MM.txt, a+) as f: f.write(date + + data +
) print(當前處理日期{}.format(date))
由於只是想展示一下如何通過設置cookies來登錄網站
所以只給出了部分核心的代碼,其他邊邊角角的地方,
想看的同學可以去我的Github上找一找。
當然,看到這裡,大家也可用自己的方式去試試爬取一些需要登錄的網站數據了
結果的展示:
可以看到,我們一起成功抓到了數據啦。一共抓了500+條數據,傳給女票我的任務就完成了,哈哈
這是她在Eviews里做出來的啥趨勢圖,我也不是很懂:
出問題了?
不是我說,這個網站防護功能做的真是好,
當天晚上爬的,第二天早上賬號就被發現異常了,
誰教人家是靠賣數據吃飯的呢。
這裡使用cookies的登錄方式,
怎麼說呢,比較雞賊
過兩天有空我在寫一篇通過post請求來登錄網站的文章吧~
每天的學習記錄都會 同步更新到:
微信公眾號: findyourownway知乎專欄:從零開始寫Python爬蟲 - 知乎專欄blog : www.ehcoblog.mlGithub: Ehco1996/Python-crawler
推薦閱讀:
※開啟知乎收藏夾看圖模式
※Python模擬登陸萬能法-微博|知乎
※從零開始寫Python爬蟲 --- 爬蟲應用:今天吃什麼?