自動化抓取天氣預報 熱搜 每日一句,並通過企業微信機器人推送至群聊之教程 附python源碼


**工具需求:Python3 + 企業微信機器人**
**第三方庫需求:requests + BeautifulSoup**
**演示環境:macOS 11.2.3 + Pycharm 2021**

**目標:** 爬取中國天氣網的天氣預報;爬取百度熱搜;爬取金山詞霸每日一句;通過企業微信機器人推送至群聊內。

## 教程&源碼

## 爬取中國天氣網的天氣預報

隨便點進一個城市的詳細天氣預報,這里以北京為例。
按照慣例開下F12。這種實時更新的界面一般是通過ajax傳入json文件實現的,打開network選項卡刷新驗證一下。


果然,在這個文件中我們能找到我們需要的信息,我們右鍵打開這個鏈接。打開居然是亂碼?那這估計就是編碼問題了,我們先來寫程序。

```
url = "https://d1.weather.com.cn/sk_2d/101010100.html?_=1618886817920"
requests_url = requests.get(url)
```

這里的url是剛才那個文件的url,在Network選項卡中右鍵復制即可獲得。

可以給requests.get加一個請求頭,放一個假UA,防止被反爬。

```
message = json.loads(requests_url.text.encode("latin1").decode("utf8").replace("var dataSK = ", ""))
```

**獲取文件信息**
這里我先用latin1 編碼,再用utf-8解碼,發現可以提取出正常的文本信息,這時通過str文本的replace方法把里面的代碼部分`var dataSK =`去除,再用json庫的loads方法將其轉化成Python字典。

到這一步就很簡單了,通過字典的鍵獲取對應的值。

```
cityname = message['cityname']
aqi = int(message['aqi'])
sd = message['sd']
wd = message['WD']
ws = message['WS']
temp = message['temp']
weather = message['weather']
```

最后按照想要的格式輸出就可以了,為了方便整個程序的操作,我把這一段代碼封裝成了函數。

```
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 = "優"
elif aqi <= 100:
airQuality = "良"
elif aqi <= 150:
airQuality = "輕度污染"
elif aqi <= 200:
airQuality = "中度污染"
elif aqi <= 300:
airQuality = "重度污染"
else:
airQuality = "嚴重污染"
return cityname + " " + '今日天氣:' + weather + ' 溫度:' + temp + ' 攝氏度 ' + wd + ws + ' 相對濕度:' + sd + ' 空氣質量:' \
+ str(aqi) + "(" + airQuality + ")"
```

## 爬取百度熱搜

不多說,直接打開F12,Network選項卡中卻沒有我們想要的,看來這次只能直接爬取網頁了。這里要使用BeautifulSoup庫。

```
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一下看看我們需要的內容在哪個標簽下。定位一下主頁里的標題,啊,我一看,原來是個`a`標簽,這好辦。

```
soup_text = soup.find_all("a", class_='list-title')
```

然后我們把它輸出出來。

```
for text in soup_text:
print(text.string)
```

然后發現,還他喵的是亂碼,我們再試試`.encode("latin1").decode("GBK")`

```
for text in soup_text:
print(text.string.encode("latin1").decode("GBK"))
```

還真成了,我吐了,敢情你倆是一家的。。。

這里改動一下,我們把他們封裝進列表里面,方便整理。

```
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
```

## 爬取金山詞霸每日一句

我直接找到他的每日一句文件。
直接開始寫代碼,輕車熟路。這里很簡單,不解釋。

```
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
```

## 整理信息

簡單的調用一下我們寫的函數,將返回信息整理到一個字符串內即可,方便我們下一步的發送。具體代碼跟隨后面整體代碼展示一遍展示。

## 通過企業微信機器人發送

首先將機器人添加到群聊,具體步驟不演示,不會自行百度或查閱官方文檔。

然后獲取你的機器人的webhook鏈接。**(不要把這個鏈接散播出去,要不然誰都可以調用你的機器人發送信息,造成垃圾信息污染)**

我們直接向這個鏈接發送Post請求就可以完成機器人發送信息了,十分的簡單。

```
url = #這里填寫你的機器人的webhook鏈接
headers = {"Content-Type": "text/plain"}
data = {
"msgtype": "text",
"text": {
"content": #這里填寫要發送的內容,這里選擇了純文本模式
}
}
requests_url = requests.post(url, headers=headers, data=json.dumps(data))
```

完成。


本篇文章所有python源碼都在下方鏈接中,歡迎下載並交流溝通

[https://www.dslt.tech/article-563-1.html](https://www.dslt.tech/article-563-1.html)

版權聲明:本文由 **ARtcgb** 原創,歡迎分享本文,轉載請保留出處


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM