**工具需求: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** 原創,歡迎分享本文,轉載請保留出處