我現(xiàn)在爬蟲堪堪入門,卻人菜癮大,想實踐一下用于生活。
下面以某網(wǎng)站為例,開始自己的摸爬滾打的記錄。
一、目標效果
打開界面后,可以看到界面左邊的導航欄:

目標:
- 把左邊的欄目遍歷一遍,進入每一個欄目
- 來爬取每個欄目當日發(fā)布的消息,把鏈接和標題以md文件格式存于桌面
- 然后設置為自動爬取。早晚各一次。
存于桌面,可以很容易注意到,而且看完就可以刪掉。
保存的是鏈接和標題,因為不是所有的消息都需要看。
md格式是便于跳轉(zhuǎn)。(我用的是typora)
二、大致思路。
1.遍歷網(wǎng)站
先利用瀏覽器的檢查功能,直接查找到我們的欄目是在html的哪一個容器里面:

可以看到,它在這個div的框框里面是以無序列表實現(xiàn)的。li里面裝著a和span。(我對html5涉及很淺,可能表述不太對,但就是容器裝著東西的意思)
然后我們只需要通過BeautifulSoup 的find_all 函數(shù)先抓到這個無序列表來縮小范圍,再直接把這些鏈接抓到容器里面去,就ok啦。
2.爬取當日的信息。
首先弄清今天是什么時間。import datetime 就ok啦
然后根據(jù)下圖:同理,抓取寫的時間與鏈接與標題。

進行篩選就可。
三、具體代碼實現(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()
三、定期自動抓取。
參考的是這篇文章.寫的很詳細。
可以注意一下這里:比如我的早上八點半會爬取,但我當時沒開電腦,它是無法爬取的。勾上這個選項后,你之后再打開電腦,一開機它就會直接自動啟動你設定的程序(我的程序就是剛剛的爬蟲)

四、看看我的效果!
可以看到,即時更新 這個欄目里面的消息與其他的欄目有重合,所以會產(chǎn)生重復的情況。
解決方案是把爬取到的目標網(wǎng)址,存入set數(shù)據(jù)類型里面,來進行操作,就不會有重合了。但是吧,我個人挺懶的,就沒有去實現(xiàn)了。

我靠,今天的消息這么多。不過重復的居多,好吧等我有時間再去弄個set把它優(yōu)化一下。
立個flag:等我有空,學一下瀏覽器驅(qū)動之類的,來完成自動健康打卡。