從零開始寫Python爬蟲 --- 爬蟲實踐:螺紋鋼數據&Cookies

學期末,女票寫論文需要 螺紋鋼HRB400 20MM兩年內的均價數據,這個數據在 我的鋼鐵網有,但是只免費提供一條一條的數據,如果你需要一定時間內的數據,要付費99元。我只能說太坑了吧!當然,這是難不倒我們的。寫個小爬蟲把每天的數據爬出來就成。

目標分析:

要爬的數據在我的鋼鐵網: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.ml

Github: Ehco1996/Python-crawler

推薦閱讀:

開啟知乎收藏夾看圖模式
Python模擬登陸萬能法-微博|知乎
從零開始寫Python爬蟲 --- 爬蟲應用:今天吃什麼?

TAG:Python | 爬虫 | Cookie |