卓越飞翔博客卓越飞翔博客

卓越飞翔 - 您值得收藏的技术分享站
技术文章64334本站已运行4115

Python爬虫抓取中国天气并发送到微信

PythonCYK中国天气

随便点入一个城市的详尽天气预报,这里以北京为例。

按照惯例开下F12。这种实时更新的界面一般是通过AJAX传入json文件同时实现的,打开network选项卡创下验证一下。

Python爬虫捕捉中国天气mammalian送至微信
Python天气爬虫截图
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 + ")"

CYK百度热搜

不多说,轻易打开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标签class='list-title',这无所谓。

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

CYK金山词霸每日一句

我直接找出他的每日一句文件。

直接已经开始写代码,轻车熟路。这里很简单,不解释。

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命令就可以顺利完成机器人发送信息了,十分的简单。

Python爬虫捕捉中国天气mammalian送到微信
Python天气爬虫截图
url = #这里核对你的机器人的webhook链接
headers = {"Content-Type": "text/plain"}
data = {
"msgtype": "text",
"text": {
"content": #这里填写必须发送的内容,这里挑选了纯文本模式
}
}
requests_url = requests.post(url, headers=headers, data=json.dumps(data))

顺利完成。

完备代码

import simplejson as json
import requests
import datetime
import fake_useragent # 这个库可以不用
from bs4 import BeautifulSoup
import time
def get_fake_ua(): #这个函数就是用以以获取随机UA的,可以不必
location = '/fake_useragent_0.1.11.json' #这里是我导入的fakeuseragent库文件,可以不必
ua = fake_useragent.UserAgent(path=location)
headers = {
'user-agent': ua.random
}
return headers
def get_week_day(date):
week_day_dict = {
0: '星期一',
1: '星期二',
2: '星期三',
3: '星期四',
4: '星期五',
5: '星期六',
6: '星期天',
}
day = date.weekday()
return "今天日期为:" + str(datetime.date.today()) + ' ' + week_day_dict[day]
def get_weather():
url = "https://d1.weather.com.cn/sk_2d/101010100.html?_=1618886817920"
r_url = requests.get(url, headers=get_fake_ua())
message = json.loads(r_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 + ")"
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')
i = 0
top_list = []
for text in soup_text:
i += 1
top_list.append(text.string.encode("latin1").decode("GBK"))
if i == 10:
break
return top_list
def get_daily_sentence():
url = "http://open.iciba.com/dsapi/"
r = requests.get(url, headers=get_fake_ua())
r = json.loads(r.text)
content = r["content"]
note = r["note"]
daily_sentence = content + "n" + note
return daily_sentence
def get_sendContent():
sendContent =  get_week_day(datetime.date.today()) + "nn" + get_weather() + "nn" + str(get_top_list()).replace(
"', '", 'n').replace("['", "").replace("']", "") + "nn" + get_daily_sentence()
return sendContent
def send(content):
url = # 核对你的webhook链接
headers = {"Content-Type": "text/plain"}
data = {
"msgtype": "text",
"text": {
"content": content,
}
}
requests_url = requests.post(url, headers=headers, data=json.dumps(data))
if requests_url.text == '{"errcode":0,"errmsg":"ok"}':
return "发送成功"
else:
return "发送失利" + requests_url.text
print(send(get_sendContent()))
卓越飞翔博客
上一篇: js随机点名效果
下一篇: 苹果CMSV10火车头采集入库视频教程

相关推荐

留言与评论(共有 0 条评论)
   
验证码:
隐藏边栏