2、實踐1:收集公告消息

我現(xiàn)在爬蟲堪堪入門,卻人菜癮大,想實踐一下用于生活。
下面以某網(wǎng)站為例,開始自己的摸爬滾打的記錄。

一、目標效果

打開界面后,可以看到界面左邊的導航欄:


image.png

目標:

  1. 把左邊的欄目遍歷一遍,進入每一個欄目
  2. 來爬取每個欄目當日發(fā)布的消息,把鏈接和標題以md文件格式存于桌面
  3. 然后設置為自動爬取。早晚各一次。

存于桌面,可以很容易注意到,而且看完就可以刪掉。

保存的是鏈接和標題,因為不是所有的消息都需要看。

md格式是便于跳轉(zhuǎn)。(我用的是typora)

二、大致思路。

1.遍歷網(wǎng)站

先利用瀏覽器的檢查功能,直接查找到我們的欄目是在html的哪一個容器里面:


image.png

可以看到,它在這個div的框框里面是以無序列表實現(xiàn)的。li里面裝著a和span。(我對html5涉及很淺,可能表述不太對,但就是容器裝著東西的意思)

然后我們只需要通過BeautifulSoupfind_all 函數(shù)先抓到這個無序列表來縮小范圍,再直接把這些鏈接抓到容器里面去,就ok啦。

2.爬取當日的信息。

首先弄清今天是什么時間。import datetime 就ok啦

然后根據(jù)下圖:同理,抓取寫的時間與鏈接與標題。


image.png

進行篩選就可。

三、具體代碼實現(xiàn)。

前言:我python學的很沒有系統(tǒng),所以代碼命名沒有規(guī)范(尤其是在getHTMLText 函數(shù)里面),以及整體風格可能不太好,見諒

import requests
from bs4 import BeautifulSoup
import datetime

# 綜合服務網(wǎng)
# 這個函數(shù)是獲取網(wǎng)頁html內(nèi)容的常用方法。
# 想詳細了解就去看看requests庫。
def getHTMLText(url):
    try:
        kv = {'user-agent':'Mozilla/5.0'}
        t = requests.get(url,headers= kv,timeout=30)
        t.raise_for_status()
        t.encoding = t.apparent_encoding
        return t.text
    except:
        return "errrrror"

def getNews(urlIndex,url,dateToday,myfile):
    soup = BeautifulSoup(getHTMLText(url),'html.parser')
    area = soup.find_all('ul',{'id':'arth'})
    newsList = area[0].find_all('li')
    for list in newsList:
# 獲取時間的方法,感覺特別粗暴哈哈哈,直接split下來。
        urlDate = list.get_text().split(' ')[-1]
        if urlDate == dateToday:
# 寫入標題,和網(wǎng)址。為了感官,建議靈活使用`\n`
            myfile.write(urlIndex+list.a.attrs['href']+'\n'+list.get_text()+'\n'*2)



def main():
# 獲得今天的年月日,并且轉(zhuǎn)化為string,方便比較。
    a = datetime.date.today()
    dateToday = str(a)
# 這個是我的桌面路徑。我以只寫的方式打開。
# 如果本來存在這個文件,就可以覆蓋,而不會重復。這個根據(jù)自己的需要來。
    myfile = open("C:\\Users\\11423\\Desktop\\zhfw.md",'w',encoding='UTF-8')
# 這個是主站,因為后續(xù)html里面a的href屬性,給的都是相對路徑。我們需要拼湊一下。
    urlIndex = 'http://zhfw.zju.edu.cn'
# 這是那個導航欄的第一個分類。
    urlKeyTips = 'http://zhfw.zju.edu.cn/zhfw_zdts/list.htm'

    soup = BeautifulSoup(getHTMLText(urlKeyTips),'html.parser')

# 找到目標ul區(qū)域。有id屬性的特別好找,因為id是唯一的。
    toTravel = soup.find_all('ul',{'id':'catalog','class':'cg-catalog'})
# 注意返回的toTravel是一個list,雖然里面只有一個元素。
    aList = toTravel[0].find_all('a')
# 這個13是自己數(shù)的,最后面幾個鏈接并不發(fā)布消息。
    for index in range(13):
# 先把這個欄目的名字寫上。
        myfile.write(aList[index].string+'\n')
# 得到絕對鏈接。
        url = urlIndex+aList[index].attrs['href']
        getNews(urlIndex,url,dateToday,myfile)


if __name__ == "__main__":
    main()

三、定期自動抓取。

參考的是這篇文章.寫的很詳細。

可以注意一下這里:比如我的早上八點半會爬取,但我當時沒開電腦,它是無法爬取的。勾上這個選項后,你之后再打開電腦,一開機它就會直接自動啟動你設定的程序(我的程序就是剛剛的爬蟲)


image.png

四、看看我的效果!

可以看到,即時更新 這個欄目里面的消息與其他的欄目有重合,所以會產(chǎn)生重復的情況。

解決方案是把爬取到的目標網(wǎng)址,存入set數(shù)據(jù)類型里面,來進行操作,就不會有重合了。但是吧,我個人挺懶的,就沒有去實現(xiàn)了。


image.png

我靠,今天的消息這么多。不過重復的居多,好吧等我有時間再去弄個set把它優(yōu)化一下。

立個flag:等我有空,學一下瀏覽器驅(qū)動之類的,來完成自動健康打卡。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

  • 用兩張圖告訴你,為什么你的 App 會卡頓? - Android - 掘金 Cover 有什么料? 從這篇文章中你...
    hw1212閱讀 14,029評論 2 59
  • 1. 怎么讓一個不定寬高的 DIV,垂直水平居中? 2.position 幾個屬性的作用? 3. px,em,re...
    瑞破破閱讀 223評論 0 0
  • 環(huán)境管理管理Python版本和環(huán)境的工具。p–非常簡單的交互式python版本管理工具。pyenv–簡單的Pyth...
    MrHamster閱讀 3,957評論 1 61
  • --- 學習目標: - 了解常用瀏覽器 - 掌握WEB標準 - 理解標簽語義化 - 掌握常用的排版標簽 ...
    紅豆丁244閱讀 1,435評論 0 2
  • 今天青石的票圈出鏡率最高的,莫過于張藝謀的新片終于定檔了。 一張滿溢著水墨風的海報一次次的出現(xiàn)在票圈里,也就是老謀...
    青石電影閱讀 10,899評論 1 2

友情鏈接更多精彩內(nèi)容