工具需求:Python3 + 企業(yè)微信機(jī)器人
第三方庫(kù)需求:requests + BeautifulSoup
演示環(huán)境:macOS 11.2.3 + Pycharm 2021
目標(biāo): 爬取中國(guó)天氣網(wǎng)的天氣預(yù)報(bào)队腐;爬取百度熱搜;爬取金山詞霸每日一句奏篙;通過(guò)企業(yè)微信機(jī)器人推送至群聊內(nèi)柴淘。
教程&源碼
爬取中國(guó)天氣網(wǎng)的天氣預(yù)報(bào)
隨便點(diǎn)進(jìn)一個(gè)城市的詳細(xì)天氣預(yù)報(bào),這里以北京為例秘通。
按照慣例開下F12悠就。這種實(shí)時(shí)更新的界面一般是通過(guò)ajax傳入json文件實(shí)現(xiàn)的,打開network選項(xiàng)卡刷新驗(yàn)證一下充易。
果然梗脾,在這個(gè)文件中我們能找到我們需要的信息,我們右鍵打開這個(gè)鏈接盹靴。打開居然是亂碼炸茧?那這估計(jì)就是編碼問(wèn)題了,我們先來(lái)寫程序稿静。
url = "https://d1.weather.com.cn/sk_2d/101010100.html?_=1618886817920"
requests_url = requests.get(url)
這里的url是剛才那個(gè)文件的url梭冠,在Network選項(xiàng)卡中右鍵復(fù)制即可獲得。
可以給requests.get加一個(gè)請(qǐng)求頭改备,放一個(gè)假UA控漠,防止被反爬。
message = json.loads(requests_url.text.encode("latin1").decode("utf8").replace("var dataSK = ", ""))
獲取文件信息
這里我先用latin1 編碼悬钳,再用utf-8解碼盐捷,發(fā)現(xiàn)可以提取出正常的文本信息,這時(shí)通過(guò)str文本的replace方法把里面的代碼部分var dataSK =
去除默勾,再用json庫(kù)的loads方法將其轉(zhuǎn)化成Python字典碉渡。
到這一步就很簡(jiǎn)單了,通過(guò)字典的鍵獲取對(duì)應(yīng)的值母剥。
cityname = message['cityname']
aqi = int(message['aqi'])
sd = message['sd']
wd = message['WD']
ws = message['WS']
temp = message['temp']
weather = message['weather']
最后按照想要的格式輸出就可以了滞诺,為了方便整個(gè)程序的操作,我把這一段代碼封裝成了函數(shù)环疼。
def get_weather():
url = "https://d1.weather.com.cn/sk_2d/101010100.html?_=1618886817920"
requests_url = requests.get(url)
message = json.loads(requests_url.text.encode("latin1").decode("utf8").replace("var dataSK = ", ""))
cityname = message['cityname']
aqi = int(message['aqi'])
sd = message['sd']
wd = message['WD']
ws = message['WS']
temp = message['temp']
weather = message['weather']
if aqi <= 50:
airQuality = "優(yōu)"
elif aqi <= 100:
airQuality = "良"
elif aqi <= 150:
airQuality = "輕度污染"
elif aqi <= 200:
airQuality = "中度污染"
elif aqi <= 300:
airQuality = "重度污染"
else:
airQuality = "嚴(yán)重污染"
return cityname + " " + '今日天氣:' + weather + ' 溫度:' + temp + ' 攝氏度 ' + wd + ws + ' 相對(duì)濕度:' + sd + ' 空氣質(zhì)量:' \
+ str(aqi) + "(" + airQuality + ")"
爬取百度熱搜
不多說(shuō)习霹,直接打開F12,Network選項(xiàng)卡中卻沒有我們想要的炫隶,看來(lái)這次只能直接爬取網(wǎng)頁(yè)了淋叶。這里要使用BeautifulSoup庫(kù)。
requests_page = requests.get('http://top.baidu.com/buzz?b=1&c=513&fr=topbuzz_b42_c513')
soup = BeautifulSoup(requests_page.text, "lxml")
這里解析出所有的html代碼等限,再F12一下看看我們需要的內(nèi)容在哪個(gè)標(biāo)簽下爸吮。定位一下主頁(yè)里的標(biāo)題芬膝,啊,我一看形娇,原來(lái)是個(gè)a
標(biāo)簽锰霜,這好辦。
soup_text = soup.find_all("a", class_='list-title')
然后我們把它輸出出來(lái)桐早。
for text in soup_text:
print(text.string)
然后發(fā)現(xiàn)癣缅,還他喵的是亂碼,我們?cè)僭囋?code>.encode("latin1").decode("GBK")
for text in soup_text:
print(text.string.encode("latin1").decode("GBK"))
還真成了哄酝,我吐了友存,敢情你倆是一家的。陶衅。屡立。
這里改動(dòng)一下,我們把他們封裝進(jìn)列表里面搀军,方便整理膨俐。
def get_top_list():
requests_page = requests.get('http://top.baidu.com/buzz?b=1&c=513&fr=topbuzz_b42_c513')
soup = BeautifulSoup(requests_page.text, "lxml")
soup_text = soup.find_all("a", class_='list-title')
top_list = []
for text in soup_text:
top_list.append(text.string.encode("latin1").decode("GBK"))
return top_list
爬取金山詞霸每日一句
我直接找到他的每日一句文件。
直接開始寫代碼罩句,輕車熟路焚刺。這里很簡(jiǎn)單,不解釋门烂。
def get_daily_sentence():
url = "http://open.iciba.com/dsapi/"
r = requests.get(url)
r = json.loads(r.text)
content = r["content"]
note = r["note"]
daily_sentence = content + "\n" + note
return daily_sentence
整理信息
簡(jiǎn)單的調(diào)用一下我們寫的函數(shù)乳愉,將返回信息整理到一個(gè)字符串內(nèi)即可,方便我們下一步的發(fā)送屯远。具體代碼跟隨后面整體代碼展示一遍展示蔓姚。
通過(guò)企業(yè)微信機(jī)器人發(fā)送
首先將機(jī)器人添加到群聊,具體步驟不演示氓润,不會(huì)自行百度或查閱官方文檔赂乐。
然后獲取你的機(jī)器人的webhook鏈接薯鳍。(不要把這個(gè)鏈接散播出去咖气,要不然誰(shuí)都可以調(diào)用你的機(jī)器人發(fā)送信息,造成垃圾信息污染)
我們直接向這個(gè)鏈接發(fā)送Post請(qǐng)求就可以完成機(jī)器人發(fā)送信息了挖滤,十分的簡(jiǎn)單崩溪。
url = #這里填寫你的機(jī)器人的webhook鏈接
headers = {"Content-Type": "text/plain"}
data = {
"msgtype": "text",
"text": {
"content": #這里填寫要發(fā)送的內(nèi)容,這里選擇了純文本模式
}
}
requests_url = requests.post(url, headers=headers, data=json.dumps(data))
完成斩松。
本篇文章所有python源碼都在下方鏈接中伶唯,歡迎下載并交流溝通
https://www.dslt.tech/article-563-1.html
版權(quán)聲明:本文由 ARtcgb 原創(chuàng),歡迎分享本文惧盹,轉(zhuǎn)載請(qǐng)保留出處