python 依据某几列累加求和_Python爬虫笔记:爬取单个页面
前言
學習Python爬蟲技術也是一件需要大量實踐的事情,因為并不是所有的網站都對爬蟲友好,更多的一種情況是網站為了限制爬蟲不得不在最小化影響用戶體驗的前提下對網站訪問做出一定的限制,最常見的就是一些網站的注冊和登錄頁面出現的驗證碼。
12306網站的驗證碼在很長一段時間內飽受詬病,最初其復雜程度已經影響到了用戶交互體驗,但是為什么12306沒有選擇為了用戶體驗而放棄驗證碼?因為驗證碼就像是一個門檻,它主要針對的并不是人,而是可能含有惡意的計算機程序。12306網站堪稱掌握地表最強開發和維護技術,它每天運行的服務器壓力幾乎都等同于雙十一,高峰時段的操作壓力甚至遠超雙十一十幾倍。這是個提供剛需服務的網站,穩定的重要性在一定程度上是大于用戶體驗的,如果沒有驗證碼,那么程序就可以輕而易舉的執行登錄、注冊等操作。像我上一篇文章中提到的自動搶票軟件,刷新訪問的頻率越高,對12306服務器的壓力就越大。12306也不能分辨屏幕前坐著的到底是不是人,所以只能采取最簡單粗暴的人機識別方法:驗證碼。
扯遠了,不過這也是我們后續會遇到的反爬蟲手段之一。
既然是爬蟲,當然還是要先確認目標網站,這里推薦一個我認為非常不錯的爬蟲練習網站:鍍金的天空
這個網站中從易到難列出了8中反爬蟲的挑戰,今天要講的就是其中的基礎1:爬取單頁數據并計算數據和
分析頁面元素
按下f12調出開發者工具選擇我們需要操作的數據,注意這里需要我們記錄下數據在html文件中的特征
它是在一個名為col-md-1的div下的數,這個特征為我們之后的數據提取提供了依據。可能有的小伙伴不太懂html代碼,這里簡單提一下html語法的一些特性:
- 標簽通常成對出現且分別用于閉合彼此(和我們之前講的Python中的代碼塊相似,需要明確出元素開始和結束的位置)
- 標簽通常可命名(本例中的class就是一種定義名稱的方式,類似的還有id,作用相當于一個考場有50份題目一樣的試卷,但是只有寫了你名字的那個才算是你的試卷,同時也是為了定位到具體的數據)
- html代碼中不同的標簽有不同的定義關鍵字
- html中可內嵌css和javaScript代碼,也可以從外部引入它們
內嵌就是直接寫在當前html文件中 - html,css,javascript默認代碼可直接查看,因此敏感操作不要寫在外部js文件中(把敏感信息寫在html中也不行)
- html分head、body
- 不同標簽可能有不同的屬性
這些內容還是需要去仔細的了解一下,本系列的文章基本不會再對html基礎方向的問題進行敘述。
程序實現
與基礎系列不同,為了尊重站長意愿,同時也為了大家能夠更好的上手實踐,涉及到glidedsky的文章將不會給出全部代碼,但是會盡量講清楚所涉及到的技術和部分代碼。
Python獲取網頁文本
網頁訪問分GET/POST/DELETE/PUT/OPTION幾種不同的類型,最常用的是GET和POST請求。get請求的特點是所有參數及數據都顯示在URL鏈接中,主要用于獲取數據,對數據本身并不執行操作,所以我們寫爬蟲的過程中遇到比較多的還是get請求。POST請求主要用于向服務器傳入數據,POST請求的內容在瀏覽器頁面上是不顯示的,需要借助網頁抓包工具。chrome瀏覽器的f12開發者工具可以查看到post請求及其內容
使用burpsuite抓包也可以獲取到POST數據包的內容
一個請求包通常由請求頭和請求主體構成,在這個請求包中,除了POST表單數據之外的數據都是請求頭。這里面的數據主要用于和服務器交互,驗證數據來源及登錄憑證。
首先就是藍框標注的數據包類型為POST,后一個參數為處理該請求的文件名。然后黃框下有幾個屬性在寫爬蟲時需要用到,首先是User-Agent代表訪問設備信息和瀏覽器基本信息。
Cookie,這個屬性下保存的信息可以相當于一個憑證,任何人拿到你在這個網站的cookie都可以在不知道你的賬號密碼的情況下進入登錄狀態。
在Python中要實現網頁訪問功能有很多種方法,我比較喜歡使用requrests這個庫。
使用requests中的get方法完成get請求
注:如果報了這種錯誤:
則說明你的電腦中沒有安裝requests庫,在命令行中使用pip install requests命令可進行安裝。
可以看到程序成功返回了網頁源碼,但是仔細看會發現使用Python獲取到的源碼中并沒有包含我們想要的數據。
這是因為該網站做了限制,只有登錄后才可以看到數據,所以在請求時我們必須帶上cookie才可以。
按下f12,點擊network網絡選項,找到主要請求的網頁,將cookie后的內容全部復制下來。
requests的get()方法允許我們傳入一個header參數
成功獲取到目標數據
處理獲取到的文本數據
接下來先理下思路:目的:提取所有數字并求和現已完成:獲取到全部文本接下來要做的:
確實就是這么樸實無華,想要從這么長的文本中準確獲取到數值,我們需要用到兩個庫:BeautifulSoup和re
BeautifulSoup屬于外部庫,需要在命令行中使用pip install BeautifulSoup4進行安裝。
引入方法:
from bs4 import BeautifulSoupre為正則表達式支持庫,Python自帶,但是同樣需要使用import引入
Beautiful Soup 是一個可以從HTML或XML文件中提取數據的Python庫.它能夠通過你喜歡的轉換器實現慣用的文檔導航,查找,修改文檔的方式。
這是官方的解釋,通俗點說就是它可以幫助你更方便的提取數據。
正則表達式是用來匹配具有某種特征數據的模式,它定義了一些字符代表不同的數據。
雖然普通人真正見到正則表達式本體的機會不多,但是肯定都用過。
例如在注冊一個網站時,會要求你填寫郵箱和手機號,程序就是通過正則表達式首先判斷你輸入的郵箱和手機號格式是否正確。
正則表達式語法同樣比較復雜,但是非常有效,非常建議學習。
推薦看這篇文章了解正則表達式: 三十分鐘入門正則表達式
理解這兩個庫的作用之后我們就可以開始使用它們了。
首先使用BeautifulSoup對獲取到的網頁內容進行處理
soup = BeautifulSoup(html,'html.parser')在處理后的數據中提取出所有class=col-md-1的div的內容
nums = soup.find_all('div',class_='col-md-1')此是我們的數據變為:
注意這里我圈出的細節,這說明經過處理后的數據存儲到了一個列表中。
接下來就是需要把除了數字之外的字符全部剔除
x = re.findall(r'ddd',str(nums),re.DOTALL)因為正則表達式是針對字符串的,所以我們需要用str方法將剛獲取到的數據轉化為字符串類型,findall方法的第一個參數即是匹配三位數字的正則表達式,re.DOTALL表示匹配所有字符,包括換行符等特殊符號。
re模塊中的Findall方法,和BeautifulSoup模塊的find_all方法完全不一樣。
Python re模塊的官方文檔中詳細羅列了各個方法的使用方法和一些簡單的正則表達式知識。
至此,我們就已經將所有的數值匹配出來了
接下來就可以使用for循環通過下標對這個列表進行遍歷,然后將數據累加求和,這部分的代碼不再給出。
多嘗試,三行代碼就能解決。
另外,其實BeautifulSoup和re任意一個模塊都可以完成數據篩選工作,我沒用的原因是因為我懶。
最后給出最終運行結果
總結
以上是生活随笔為你收集整理的python 依据某几列累加求和_Python爬虫笔记:爬取单个页面的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mag6000变送器怎么使用_变送器的迁
- 下一篇: java map按照value排序_基础