[Python]網路爬蟲(十):一個爬蟲的誕生全過程(以山東大學績點運算為例)
先來談談我們學校的網站:
http://jwxt.sdu.edu.cn:7777/zhxt_bks/zhxt_bks.html
查詢成績需要登錄,然後顯示各學科成績,但是只顯示成績而沒有績點,也就是加權平均分數。
顯然這樣手動計算績點是一件非常麻煩的事情。所以我們可以用Python做一個爬蟲來解決這個問題。
1.決戰前夜
先來準備一下工具:HttpFox插件。
這是一款http協定分析插件,分析頁面請求與回應的時間、內容、以及瀏覽器用到的COOKIE等。
以我為例,安裝在火狐上即可,效果如圖:
可以非常直觀的查看相應的資訊。
點選start是開始偵測,點選stop暫停偵測,點選clear清除內容。
一般在使用之前,點擊stop暫停,然後點擊clear清屏,確保看到的是存取目前頁面所獲得的資料。
2.深入敵後
下面就去山東大學的成績查詢網站,看一看在登入的時候,到底發送了那些訊息。
先來到登入頁面,把httpfox打開,clear之後,點選start開啟偵測:
輸入完了個人訊息,確保httpfox處於開啟狀態,然後點擊確定提交訊息,實現登入。
這個時候可以看到,httpfox檢測到了三條訊息:
這時點擊stop鍵,確保捕獲到的是訪問該頁面之後反饋的數據,以便我們做爬蟲的時候模擬登陸使用。
3.庖丁解牛
乍一看我們拿到了三個數據,兩個是GET的一個是POST的,但是它們到底是什麼,應該怎麼用,我們還一無所知。
所以,我們需要挨個查看一下捕獲到的內容。
先看POST的訊息:
既然是POST的訊息,我們就直接看PostData即可。
可以看到一共POST兩個數據,stuid和pwd。
並且從Type的Redirect to可以看出,POST完畢之後跳到了bks_login2.loginmessage頁面。
由此看出,這個資料是點選確定之後提交的表單資料。
點擊cookie標籤,看看cookie訊息:
沒錯,收到了一個ACCOUNT的cookie,並且在session結束之後自動銷毀。
那麼提交之後收到了哪些資訊呢?
我們來看看後面的兩個GET數據。
先看第一個,我們點選content標籤可以查看收到的內容,是不是有一種生吞活剝的快感-。 -HTML來源碼暴露無疑了:
看來這個只是顯示頁面的html源碼而已,點擊cookie,查看cookie的相關資訊:
啊哈,原來html頁面的內容是發送了
之後才接受到的。
既然已經知道了我們向伺服器發送了什麼數據,也知道了我們接收到了什麼數據,基本的流程如下:
首先,我們POST學號和密碼--->然後傳回cookie的值
OK,看上去好像很簡單的樣紙。那下面我們就來試試看吧。
但是在實驗之前,還有一個問題沒有解決,就是POST的資料到底送到哪裡了?
嗯沒錯,那個name="w_right"的就是我們要的登入頁面。
網站的原來的地址是:
http://jwxt.sdu.edu.cn:7777/zhxt_bks/zhxt_bks.html
所以,真正的表單提交的地址應該是:
.sdu.edu.cn:7777/zhxt_bks/xk_login.html輸入一看,果不其然:
的接收,然後寫出源碼如下:
# -*- coding: utf-8 -*- #--------------------------------------- # 程序:山东大学爬虫 # 版本:0.1 # 作者:why # 日期:2013-07-12 # 语言:Python 2.7 # 操作:输入学号和密码 # 功能:输出成绩的加权平均值也就是绩点 #--------------------------------------- import urllib import urllib2 import cookielib cookie = cookielib.CookieJar() opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cookie)) #需要POST的数据# postdata=urllib.urlencode({ 'stuid':'201100300428', 'pwd':'921030' }) #自定义一个请求# req = urllib2.Request( url = 'http://jwxt.sdu.edu.cn:7777/pls/wwwbks/bks_login2.login', data = postdata ) #访问该链接# result = opener.open(req) #打印返回的内容# print result.read()
如此這般之後,再看看運行的效果:
ok,如此這般,我們就算模擬登陸成功了。
6.偷天換日
接下來的任務就是用爬蟲獲取到學生的成績。
再來看看來源網站。
開啟HTTPFOX之後,點擊查看成績,發現捕獲到瞭如下的數據:
GET的數據,點擊查看可以發現的內容。
因此可以得到查看成績的連結如下:
7.萬事俱備
現在萬事俱備啦,所以只需要把連結應用到爬蟲裡面,看看能否查看到成績的頁面。
# -*- coding: utf-8 -*- #--------------------------------------- # 程序:山东大学爬虫 # 版本:0.1 # 作者:why # 日期:2013-07-12 # 语言:Python 2.7 # 操作:输入学号和密码 # 功能:输出成绩的加权平均值也就是绩点 #--------------------------------------- import urllib import urllib2 import cookielib #初始化一个CookieJar来处理Cookie的信息# cookie = cookielib.CookieJar() #创建一个新的opener来使用我们的CookieJar# opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cookie)) #需要POST的数据# postdata=urllib.urlencode({ 'stuid':'201100300428', 'pwd':'921030' }) #自定义一个请求# req = urllib2.Request( url = 'http://jwxt.sdu.edu.cn:7777/pls/wwwbks/bks_login2.login', data = postdata ) #访问该链接# result = opener.open(req) #打印返回的内容# print result.read() #打印cookie的值 for item in cookie: print 'Cookie:Name = '+item.name print 'Cookie:Value = '+item.value #访问该链接# result = opener.open('http://jwxt.sdu.edu.cn:7777/pls/wwwbks/bkscjcx.curscopre') #打印返回的内容# print result.read()
按下F5運行即可,看按下F5運行即可,看按下F5運行即可,看看捕獲的資料吧:
既然這樣就沒有什麼問題了吧,用正則表達式將數據稍稍處理一下,取出學分和相應的分數就可以了。
8.手到擒來
這麼一大堆html源碼顯然是不利於我們處理的,下面要用正規表示式來摳出必須的資料。
關於正規表示式的教學可以看看這篇部落格文章:
既然如此,用正则表达式就易如反掌了。
我们将代码稍稍整理一下,然后用正则来取出数据:
# -*- coding: utf-8 -*- #--------------------------------------- # 程序:山东大学爬虫 # 版本:0.1 # 作者:why # 日期:2013-07-12 # 语言:Python 2.7 # 操作:输入学号和密码 # 功能:输出成绩的加权平均值也就是绩点 #--------------------------------------- import urllib import urllib2 import cookielib import re class SDU_Spider: # 申明相关的属性 def __init__(self): self.loginUrl = 'http://jwxt.sdu.edu.cn:7777/pls/wwwbks/bks_login2.login' # 登录的url self.resultUrl = 'http://jwxt.sdu.edu.cn:7777/pls/wwwbks/bkscjcx.curscopre' # 显示成绩的url self.cookieJar = cookielib.CookieJar() # 初始化一个CookieJar来处理Cookie的信息 self.postdata=urllib.urlencode({'stuid':'201100300428','pwd':'921030'}) # POST的数据 self.weights = [] #存储权重,也就是学分 self.points = [] #存储分数,也就是成绩 self.opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(self.cookieJar)) def sdu_init(self): # 初始化链接并且获取cookie myRequest = urllib2.Request(url = self.loginUrl,data = self.postdata) # 自定义一个请求 result = self.opener.open(myRequest) # 访问登录页面,获取到必须的cookie的值 result = self.opener.open(self.resultUrl) # 访问成绩页面,获得成绩的数据 # 打印返回的内容 # print result.read() self.deal_data(result.read().decode('gbk')) self.print_data(self.weights); self.print_data(self.points); # 将内容从页面代码中抠出来 def deal_data(self,myPage): myItems = re.findall('<TR>.*?<p.*?<p.*?<p.*?<p.*?<p.*?>(.*?)</p>.*?<p.*?<p.*?>(.*?)</p>.*?</TR>',myPage,re.S) #获取到学分 for item in myItems: self.weights.append(item[0].encode('gbk')) self.points.append(item[1].encode('gbk')) # 将内容从页面代码中抠出来 def print_data(self,items): for item in items: print item #调用 mySpider = SDU_Spider() mySpider.sdu_init()
水平有限,,正则是有点丑,。运行的效果如图:
ok,接下来的只是数据的处理问题了。。
9.凯旋而归
完整的代码如下,至此一个完整的爬虫项目便完工了。
# -*- coding: utf-8 -*- #--------------------------------------- # 程序:山东大学爬虫 # 版本:0.1 # 作者:why # 日期:2013-07-12 # 语言:Python 2.7 # 操作:输入学号和密码 # 功能:输出成绩的加权平均值也就是绩点 #--------------------------------------- import urllib import urllib2 import cookielib import re import string class SDU_Spider: # 申明相关的属性 def __init__(self): self.loginUrl = 'http://jwxt.sdu.edu.cn:7777/pls/wwwbks/bks_login2.login' # 登录的url self.resultUrl = 'http://jwxt.sdu.edu.cn:7777/pls/wwwbks/bkscjcx.curscopre' # 显示成绩的url self.cookieJar = cookielib.CookieJar() # 初始化一个CookieJar来处理Cookie的信息 self.postdata=urllib.urlencode({'stuid':'201100300428','pwd':'921030'}) # POST的数据 self.weights = [] #存储权重,也就是学分 self.points = [] #存储分数,也就是成绩 self.opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(self.cookieJar)) def sdu_init(self): # 初始化链接并且获取cookie myRequest = urllib2.Request(url = self.loginUrl,data = self.postdata) # 自定义一个请求 result = self.opener.open(myRequest) # 访问登录页面,获取到必须的cookie的值 result = self.opener.open(self.resultUrl) # 访问成绩页面,获得成绩的数据 # 打印返回的内容 # print result.read() self.deal_data(result.read().decode('gbk')) self.calculate_date(); # 将内容从页面代码中抠出来 def deal_data(self,myPage): myItems = re.findall('<TR>.*?<p.*?<p.*?<p.*?<p.*?<p.*?>(.*?)</p>.*?<p.*?<p.*?>(.*?)</p>.*?</TR>',myPage,re.S) #获取到学分 for item in myItems: self.weights.append(item[0].encode('gbk')) self.points.append(item[1].encode('gbk')) #计算绩点,如果成绩还没出来,或者成绩是优秀良好,就不运算该成绩 def calculate_date(self): point = 0.0 weight = 0.0 for i in range(len(self.points)): if(self.points[i].isdigit()): point += string.atof(self.points[i])*string.atof(self.weights[i]) weight += string.atof(self.weights[i]) print point/weight #调用 mySpider = SDU_Spider() mySpider.sdu_init()
以上就是 [Python]网络爬虫(十):一个爬虫的诞生全过程(以山东大学绩点运算为例)的内容,更多相关内容请关注PHP中文网(www.php.cn)!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

熱門話題

PHP和Python各有優劣,選擇取決於項目需求和個人偏好。 1.PHP適合快速開發和維護大型Web應用。 2.Python在數據科學和機器學習領域佔據主導地位。

在CentOS系統上高效訓練PyTorch模型,需要分步驟進行,本文將提供詳細指南。一、環境準備:Python及依賴項安裝:CentOS系統通常預裝Python,但版本可能較舊。建議使用yum或dnf安裝Python3併升級pip:sudoyumupdatepython3(或sudodnfupdatepython3),pip3install--upgradepip。 CUDA與cuDNN(GPU加速):如果使用NVIDIAGPU,需安裝CUDATool

在CentOS系統上啟用PyTorchGPU加速,需要安裝CUDA、cuDNN以及PyTorch的GPU版本。以下步驟將引導您完成這一過程:CUDA和cuDNN安裝確定CUDA版本兼容性:使用nvidia-smi命令查看您的NVIDIA顯卡支持的CUDA版本。例如,您的MX450顯卡可能支持CUDA11.1或更高版本。下載並安裝CUDAToolkit:訪問NVIDIACUDAToolkit官網,根據您顯卡支持的最高CUDA版本下載並安裝相應的版本。安裝cuDNN庫:前

Docker利用Linux內核特性,提供高效、隔離的應用運行環境。其工作原理如下:1. 鏡像作為只讀模板,包含運行應用所需的一切;2. 聯合文件系統(UnionFS)層疊多個文件系統,只存儲差異部分,節省空間並加快速度;3. 守護進程管理鏡像和容器,客戶端用於交互;4. Namespaces和cgroups實現容器隔離和資源限制;5. 多種網絡模式支持容器互聯。理解這些核心概念,才能更好地利用Docker。

Python和JavaScript在社區、庫和資源方面的對比各有優劣。 1)Python社區友好,適合初學者,但前端開發資源不如JavaScript豐富。 2)Python在數據科學和機器學習庫方面強大,JavaScript則在前端開發庫和框架上更勝一籌。 3)兩者的學習資源都豐富,但Python適合從官方文檔開始,JavaScript則以MDNWebDocs為佳。選擇應基於項目需求和個人興趣。

在CentOS下選擇PyTorch版本時,需要考慮以下幾個關鍵因素:1.CUDA版本兼容性GPU支持:如果你有NVIDIAGPU並且希望利用GPU加速,需要選擇支持相應CUDA版本的PyTorch。可以通過運行nvidia-smi命令查看你的顯卡支持的CUDA版本。 CPU版本:如果沒有GPU或不想使用GPU,可以選擇CPU版本的PyTorch。 2.Python版本PyTorch

MinIO對象存儲:CentOS系統下的高性能部署MinIO是一款基於Go語言開發的高性能、分佈式對象存儲系統,與AmazonS3兼容。它支持多種客戶端語言,包括Java、Python、JavaScript和Go。本文將簡要介紹MinIO在CentOS系統上的安裝和兼容性。 CentOS版本兼容性MinIO已在多個CentOS版本上得到驗證,包括但不限於:CentOS7.9:提供完整的安裝指南,涵蓋集群配置、環境準備、配置文件設置、磁盤分區以及MinI

CentOS 安裝 Nginx 需要遵循以下步驟:安裝依賴包,如開發工具、pcre-devel 和 openssl-devel。下載 Nginx 源碼包,解壓後編譯安裝,並指定安裝路徑為 /usr/local/nginx。創建 Nginx 用戶和用戶組,並設置權限。修改配置文件 nginx.conf,配置監聽端口和域名/IP 地址。啟動 Nginx 服務。需要注意常見的錯誤,如依賴問題、端口衝突和配置文件錯誤。性能優化需要根據具體情況調整,如開啟緩存和調整 worker 進程數量。
