只需一行正則即可爬取某高校就業處通知公告,速進(超簡單-。-)

2020-10-13 12:00:02

  大家好,我是不溫卜火,是一名計算機學院巨量資料專業大三的學生,暱稱來源於成語—不溫不火,本意是希望自己性情溫和。作為一名網際網路行業的小白,博主寫部落格一方面是為了記錄自己的學習過程,另一方面是總結自己所犯的錯誤希望能夠幫助到很多和自己一樣處於起步階段的萌新。但由於水平有限,部落格中難免會有一些錯誤出現,有紕漏之處懇請各位大佬不吝賜教!暫時只在csdn這一個平臺進行更新,部落格主頁:https://buwenbuhuo.blog.csdn.net/

PS:由於現在越來越多的人未經本人同意直接爬取博主本人文章,博主在此特別宣告:未經本人允許,禁止轉載!!!


2


博主前幾天帶來了一個通過查詢百度介面實現翻譯單詞的小demo,本次將繼續帶來另一個使用正則的小demo。只需一行正則程式碼,即可爬取某高校官網通知公告。

一. 前期準備

說要爬取高校,那肯定要爬高校的,要不然就顯的本博主言而無信!但是問題來了,要爬取哪個高校呢?不僅能夠成功爬取到資訊並且只需要一行正規表示式即可提取到相關資訊。這可有點難為住博主了,正在這是 博主想到了自己學校,並且找到了自己學校就業處的網站,通過檢視網站規則,發現正好符合規則。當然了博主本人的學校為雙非院校,只是一所普通本二院校…Hahahaha… 話不多說,正片正式開始:

  • 1. 分析網頁

首先給出我們要爬取的網址:https://zs.hait.edu.cn/list.jsp?urltype=tree.TreeTempUrl&wbtreeid=1261
3

我們開啟網址以後,頁面如上圖所示,我們可以看到整個介面上,最多的就是一個又一個的通知公告,那麼我們就知道我們需要爬取的內容。下面我們開啟開發者選項
4
通過上圖,我們可以看到每一個tr標籤對應一個通知公告,這個時候我們開啟其中一個tr標籤進行檢視
5
開啟之後,我們可以看到我們所需要的所有資訊都在a標籤內,找到了位置,下面我們就可以進行解析實現了。當然了,博主本人還是更喜歡使用xpath進行解析的。

  • 2. 解析獲取標題

下面先讓大家看下xpath解析我們所需要的標題的方法:
6
怎麼樣,是不是很簡單。但是由於本篇博文是要用正規表示式,所以,博主還是使用正規表示式進行獲取標題

7
上述的正規表示式(.*?)代表獲取選中部分的所有內容。

如果有小夥伴對正規表示式有不懂的,可以自行檢視下博主給的連結https://www.runoob.com/regexp/regexp-syntax.html
當然了,寫好了正規表示式當然需要先測試下能否成功獲取到我們所需要的內容,下面給出測試結果:
8
🆗,我們可以看到獲取到的結果是正確的,如果正則寫的不對的話,需要多次檢視偵錯,這不是什麼難活,主要是需要有足夠的耐心就夠了。

  • 3. 儲存到本地

此處,個人感覺 沒啥需要講解的地方,所以直接貼出程式碼

    with open("./河工院通告.txt","w",encoding="utf-8") as file:
        #迴圈
        for title in title_list:
            #寫
            file.write(title)
            file.write("\n")
    print("儲存完畢!")

二. 從思想轉換成程式

既然大體思路已經完成了,那麼下面就還差完成程式碼了

  • 1. 思路及原始碼

那麼下面就是程式碼的實現過程了:
1.設定所需爬取的URL
2. 新增請求頭,偽裝成瀏覽器。這位最基本的手段
3. 傳送請求,獲取資料
4. 通過正則提取所有內容
5. 儲存內容到本地

#!/usr/bin/env python
# encoding: utf-8
'''
  @author 李華鑫
  @create 2020-10-06 10:04
  Mycsdn:https://buwenbuhuo.blog.csdn.net/
  @contact: 459804692@qq.com
  @software: Pycharm
  @file: 爬河工院通告.py
  @Version:1.0
  
'''
# 匯入包
import requests
import re

url = "https://zs.hait.edu.cn/list.jsp?urltype=tree.TreeTempUrl&wbtreeid=1261"
headers = {
    "user-agent": "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36",
}
def hegong_Spider():
    # 傳送請求,獲取響應
    response = requests.get(url=url, headers=headers)
    # 獲取響應資料
    content = response.content.decode("utf-8")
    # 提取資料,使用正規表示式
    title_list = re.findall(r'<a class="c57797".*?title="(.*?)">.*?</a>',content,flags=re.DOTALL)

    #開啟檔案寫
    with open("./河工院通告.txt","w",encoding="utf-8") as file:
        #迴圈
        for title in title_list:
            #寫
            file.write(title)
            file.write("\n")
    print("儲存完畢!")
if __name__ == '__main__':
    hegong_Spider()

  • 2. 執行結果

9

三. 程式碼升級

上述程式碼,我們只能爬取第一個的內容,這和我們所想的是有差別的,我們想的是要爬取所有通告,這個時候不用想我們就需要通過模擬翻頁動作,進行全部獲取。

  • 1. 分析

我們先來通過檢視網址的變化以及檢視能否看到網站的總頁數,好以此來實現爬取全部標題的目的。

首先我們先來看下網址差異:

https://zs.hait.edu.cn/list.jsp?a5t=13&a5p=1&a5c=15&urltype=tree.TreeTempUrl&wbtreeid=1261
https://zs.hait.edu.cn/list.jsp?a5t=13&a5p=2&a5c=15&urltype=tree.TreeTempUrl&wbtreeid=1261
https://zs.hait.edu.cn/list.jsp?a5t=13&a5p=4&a5c=15&urltype=tree.TreeTempUrl&wbtreeid=1261

根據上述三個網址,我們不難發現網址唯一變化的地方就是
10
那麼,我們就可以通過拼接網址的方式實現網頁跳轉。

下面我們再來檢視網站總共有多少頁碼。
11
我們可以看到總共有13頁,下面就很簡單了,我們先來看下拼接的url是否是我們所需要的
12

  • 2. 原始碼

🆗通過上圖,看到url是我們所需要的,下面就可以完善一開始的程式碼了:

#!/usr/bin/env python
# encoding: utf-8
'''
  @author 李華鑫
  @create 2020-10-06 10:04
  Mycsdn:https://buwenbuhuo.blog.csdn.net/
  @contact: 459804692@qq.com
  @software: Pycharm
  @file: 爬河工院通告分頁.py
  @Version:1.0
  
'''
# 匯入包
import random
import time
import requests
import re


headers = {
    "user-agent": "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36",
}
base_url = "https://zs.hait.edu.cn/list.jsp?a5t=13&a5p={}&a5c=15&urltype=tree.TreeTempUrl&wbtreeid=1261"

def hegong_Spider():
    # 翻頁
    for i in range(1, 14):
        print("第{}頁爬取中...".format(i))
        time.sleep(random.random())
        url = base_url.format(i)
        # 傳送請求,獲取響應
        response = requests.get(url=url, headers=headers)
        # 獲取響應資料
        content = response.content.decode("utf-8")
        # 提取資料,使用正規表示式
        title_list = re.findall(r'<a class="c57797".*?title="(.*?)">.*?</a>', content, flags=re.DOTALL)
        # title_list = content.xpath('//a[@class="c57797"]/@title').extract()
        # 開啟檔案寫
        with open("./河工院通告.txt", "a", encoding="utf-8") as file:
            # 迴圈
            for title in title_list:
                # 寫
                file.write(title)
                file.write("\n")
            print("儲存完畢!")

if __name__ == '__main__':
    hegong_Spider()
  • 3. 執行結果

13
美好的日子總是短暫的,雖然還想繼續與大家暢談,但是本篇博文到此已經結束了,如果還嫌不夠過癮,不用擔心,我們下篇見!


12

  好書不厭讀百回,熟讀課思子自知。而我想要成為全場最靚的仔,就必須堅持通過學習來獲取更多知識,用知識改變命運,用部落格見證成長,用行動證明我在努力。
  如果我的部落格對你有幫助、如果你喜歡我的部落格內容,請「點贊」 「評論」「收藏」一鍵三連哦!聽說點讚的人運氣不會太差,每一天都會元氣滿滿呦!如果實在要白嫖的話,那祝你開心每一天,歡迎常來我部落格看看。
  碼字不易,大家的支援就是我堅持下去的動力。點贊後不要忘了關注我哦!

21
22