py爬蟲爬取學校通知公告

寫在前面

這個不困難,用到兩個庫。

  1. requests庫,用來發起get請求獲得目標HTML。
  2. bs4,用來解析HTML獲取想要的信息。

兩個庫都是第三方的,所以需要對應下載。可以直接命令行使用pip

pip install requests
pip install bs4

如果用的pycharm,也可以直接點擊左上角"File",“Settings”,然後找到左側紅框點擊,點擊右側“+”。然後在彈出的窗口中輸入要下載的庫。
在這裏插入圖片描述

分析HTML

注:這一部分是一些“廢話”!!看代碼直接到最下面去
首先,在瀏覽器內打開控制檯查看頁面元素,找到你想要提取的內容。如下圖,在無數次展開標籤後,終於找到通知公告這個表單了。
在這裏插入圖片描述

下圖是第二條消息的table:
在這裏插入圖片描述
分析一下:我的目的是得到消息標題以及對應鏈接,然後把標題和鏈接推送出去。做法有很多種:

  1. 直接找到上圖中第三行的id"line_u3_1"就可以定位到這個tr標籤,然後".td.a.get(“href”)“拿到鏈接,”.td.a.text"拿到標題
  2. 通過string=“2019-11-06"定位到截圖中間部位的span標籤,然後”.parent.parent.td.a.get(“href”)“拿到鏈接,”.parent.parent.td.a.text"拿到標題
  3. 等等

然而,這裏面其實涉及到一個很簡單的算法問題,可以想象一下:“通過腳本不斷的定時訪問,我要如何拿到一個網站的最新消息?”如果是一直拿取最上面一條,與前一次拿取的最上面一條比對,不等則是最新消息。但是如果網站置頂一條或多條消息,那麼這一方法就失效了。所以,從根本上,這種方法是不可靠的,它不能保證爬取的消息是最新的。
而方法二可以實時獲取當天的年月日,與網站內通告的日期比對,相等則一定是最新消息,爬到一條後就把它添加到一個“已抓取”列表中,再次抓取的時候先判斷通知的鏈接是否在列表內,在則是當日已抓取信息;不在內則是當日新信息。

代碼

給出一個較爲簡單的爬蟲示例,最開始在網上查資料時,各種大堆代碼看起來很煩。
直接能用的:功能是打印出學院2019-11-06的所用通知的標題和鏈接(鏈接還沒做處理)

import requests
from bs4 import BeautifulSoup

url = 'http://www.auto.shu.edu.cn/synr/tzgg.htm'
# 模擬瀏覽器發送HTTP請求
header = {'User-Agent': 'Mozilla/5.0'}
try:
    response = requests.get(url, headers=header)
    response.raise_for_status()
    # 設置編碼
    response.encoding = response.apparent_encoding
    html = response.text
    soup = BeautifulSoup(html, "html.parser")
    target = soup.find_all("span", string="2019-11-06")
    # target爲列表
    for eachOne in target:
        each_text = eachOne.parent.parent.td.a.text
        each_href = eachOne.parent.parent.td.a.get("href")
        print(each_text)
        print(each_href)
except:
    print("爬取失敗")
#######################輸出結果如下
第五屆中國智能儀器儀表設計大賽/參賽邀請函
../info/1123/7805.htm

更多的bs4的HTML解析方法當然還是得看官方文檔,中文的,自己做些小腳本可以參照。
Beautiful Soup 4.4.0 文檔

後續的消息推送

其實最初的目的就是每次去刷公告很煩,所以想爬取各種通知公告,然後推送到QQ上。結果webQQ停止維護了,所以就打算搞個微信機器人給自己推送通知公告。
博客地址:wepy微信機器人:向好友推送爬取的公告

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章