服务器之家

服务器之家 > 正文

python趣味挑战之爬取天气与微博热搜并自动发给微信好友

时间:2021-11-18 09:53     来源/作者:gudu12306

一、系统环境

1.python 3.8.2

2.webdriver(用于驱动edge)

3.微信电脑版

4.windows10

二、爬取中国天气网

因为中国天气网的网页是动态生成的,所以不能直接爬取到数据,需要先使用webdriver打开网页并渲染完成,然后保存网页源代码,使用beautifulsoup分析数据。爬取的数据包括实时温度、最高温度与最低温度、污染状况、风向和湿度、紫外线状况、穿衣指南八项数据。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
def getZZWeatherAndSendMsg():
    HTML1='http://www.weather.com.cn/weather1dn/101190201.shtml'
    driver=webdriver.Edge()
    driver.get(HTML1)
    soup=BeautifulSoup(driver.page_source,'html5lib')
    
    #获取实时温度
    tem=soup.find('span',class_='temp').string
    #获取最高温度与最低温度
    maxtem=soup.find('span',id='maxTemp').string
    mintem=soup.find('span',id='minTemp').string
    #获取污染状况
    poll=soup.find('a',href='http://www.weather.com.cn/air/?city=101190201').string
    #获取风向和湿度
    win=soup.find('span',id='wind').string
    humidity=soup.find('span',id='humidity').string
    #获取紫外线状况
    sun=soup.find('div',class_='lv').find('em').string
    #获取穿衣指南
    cloth=soup.find('dl',id='cy').find('dd').string
 
    HTML2='http://www.weather.com.cn/weathern/101190201.shtml'
    driver.get(HTML2)
    soup=BeautifulSoup(driver.page_source,'html5lib')
    #获取天气情况
    wea=soup.find_all('p',class_='weather-info')[1].string
    weatherContent='实时温度:'+tem+'℃'+'\n'+'今日温度变化:'+mintem+'~'+maxtem+'\n'+'今日天气:'+wea+'\n'+'当前风向:'+win+'\n'+'相对湿度:'+humidity+'\n'+'紫外线:'+sun+'\n'+'污染指数:'+poll+'\n'+'穿衣指南:'+cloth+'\n'+'注意天气变化!!'
    driver.quit()
    return weatherContent

三、爬取微博热搜

相比于中国天气网,微博热搜要简单很多,直接request得到数据包,然后使用beautiful解析。解析数据后用for循环便利50次保存文本。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
def getWeibo():
    url='https://s.weibo.com/top/summary'
    headers={'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.72 Safari/537.36 Edg/90.0.818.41'}
    r=requests.get(url,headers=headers)
    r.raise_for_status()
    r.encoding = r.apparent_encoding
    soup = BeautifulSoup(r.text, "html.parser")
    tr=soup.find_all('tr')
    weiboContent='今日微博热榜:'+'\n'
    for i in range(2,52):
        text=tr[i].find('td',class_='td-02').find('a').string
        weiboContent=weiboContent+str(i-1)+'"'+text+'"'+'\n'
    return weiboContent

四、微信自动发送消息

使用win32gui自动化操作发送微信消息,首先使用微信的窗口名找到微信句柄,然后模拟键鼠搜索联系人,打开联系人窗口,发送消息并关闭窗口。同时发送多个联系人时可以直接重复这几步操作

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
if __name__=="__main__":
    target_a=['06:55','11:55','19:53']
    target_b=['07:00','12:00','19:54']
    name_list=['Squirrel B','Squirrel B']
    while True:
        now=time.strftime("%m月%d日%H:%M",time.localtime())
        print(now)
        if now[-5:] in target_a:
            base_weatherContent=getZZWeatherAndSendMsg()
            weiboContent=getWeibo()
        if now[-5:] in target_b:
            hwnd=win32gui.FindWindow("WeChatMainWndForPC", '微信')
            win32gui.ShowWindow(hwnd,win32con.SW_SHOW)
            win32gui.MoveWindow(hwnd,0,0,1000,700,True)
            time.sleep(1)
            for name in name_list:
                movePos(28,147)
                click()
                #2.移动鼠标到搜索框,单击,输入要搜索的名字
                movePos(148,35)
                click()
                time.sleep(1)
                setText(name)
                ctrlV()
                time.sleep(1# 等待联系人搜索成功
                enter()
                time.sleep(1)
                now=time.strftime("%m月%d日%H:%M",time.localtime())
                weatherContent='现在是'+now+'\n'+base_weatherContent
                setText(weatherContent)
                ctrlV()
                time.sleep(1)
                altS()
                time.sleep(1)
                setText(weiboContent)
                ctrlV()
                time.sleep(1)
                altS()
                time.sleep(1)
            win32gui.PostMessage(hwnd, win32con.WM_CLOSE, 0, 0)
        time.sleep(60)

五、源代码

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
import win32clipboard as w
import win32con
import win32api
import win32gui
import ctypes
import time
import requests
from urllib.request import urlopen
from bs4 import BeautifulSoup
from selenium import webdriver
 
#把文字放入剪贴板
def setText(aString):
    w.OpenClipboard()
    w.EmptyClipboard()
    w.SetClipboardData(win32con.CF_UNICODETEXT,aString)
    w.CloseClipboard()
    
#模拟ctrl+V
def ctrlV():
    win32api.keybd_event(17,0,0,0) #ctrl
    win32api.keybd_event(86,0,0,0) #V
    win32api.keybd_event(86,0,win32con.KEYEVENTF_KEYUP,0)#释放按键
    win32api.keybd_event(17,0,win32con.KEYEVENTF_KEYUP,0)
    
#模拟alt+s
def altS():
    win32api.keybd_event(18,0,0,0)
    win32api.keybd_event(83,0,0,0)
    win32api.keybd_event(83,0,win32con.KEYEVENTF_KEYUP,0)
    win32api.keybd_event(18,0,win32con.KEYEVENTF_KEYUP,0)
# 模拟enter
def enter():
    win32api.keybd_event(13,0,0,0)
    win32api.keybd_event(13,0,win32con.KEYEVENTF_KEYUP,0)
#模拟单击
def click():
    win32api.mouse_event(win32con.MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0)
    win32api.mouse_event(win32con.MOUSEEVENTF_LEFTUP, 0, 0, 0, 0)
#移动鼠标的位置
def movePos(x,y):
    win32api.SetCursorPos((x,y))
 
def getZZWeatherAndSendMsg():
    HTML1='http://www.weather.com.cn/weather1dn/101190201.shtml'
    driver=webdriver.Edge()
    driver.get(HTML1)
    soup=BeautifulSoup(driver.page_source,'html5lib')
    
    #获取实时温度
    tem=soup.find('span',class_='temp').string
    #获取最高温度与最低温度
    maxtem=soup.find('span',id='maxTemp').string
    mintem=soup.find('span',id='minTemp').string
    #获取污染状况
    poll=soup.find('a',href='http://www.weather.com.cn/air/?city=101190201').string
    #获取风向和湿度
    win=soup.find('span',id='wind').string
    humidity=soup.find('span',id='humidity').string
    #获取紫外线状况
    sun=soup.find('div',class_='lv').find('em').string
    #获取穿衣指南
    cloth=soup.find('dl',id='cy').find('dd').string
 
    HTML2='http://www.weather.com.cn/weathern/101190201.shtml'
    driver.get(HTML2)
    soup=BeautifulSoup(driver.page_source,'html5lib')
    #获取天气情况
    wea=soup.find_all('p',class_='weather-info')[1].string
    weatherContent='实时温度:'+tem+'℃'+'\n'+'今日温度变化:'+mintem+'~'+maxtem+'\n'+'今日天气:'+wea+'\n'+'当前风向:'+win+'\n'+'相对湿度:'+humidity+'\n'+'紫外线:'+sun+'\n'+'污染指数:'+poll+'\n'+'穿衣指南:'+cloth+'\n'+'注意天气变化!!'
    driver.quit()
    return weatherContent
 
def getWeibo():
    url='https://s.weibo.com/top/summary'
    headers={'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.72 Safari/537.36 Edg/90.0.818.41'}
    r=requests.get(url,headers=headers)
    r.raise_for_status()
    r.encoding = r.apparent_encoding
    soup = BeautifulSoup(r.text, "html.parser")
    tr=soup.find_all('tr')
    weiboContent='今日微博热榜:'+'\n'
    for i in range(2,52):
        text=tr[i].find('td',class_='td-02').find('a').string
        weiboContent=weiboContent+str(i-1)+'"'+text+'"'+'\n'
    return weiboContent
 
if __name__=="__main__":
    target_a=['06:55','11:55','19:53']
    target_b=['07:00','12:00','19:54']
    name_list=['Squirrel B','Squirrel B']
    while True:
        now=time.strftime("%m月%d日%H:%M",time.localtime())
        print(now)
        if now[-5:] in target_a:
            base_weatherContent=getZZWeatherAndSendMsg()
            weiboContent=getWeibo()
        if now[-5:] in target_b:
            hwnd=win32gui.FindWindow("WeChatMainWndForPC", '微信')
            win32gui.ShowWindow(hwnd,win32con.SW_SHOW)
            win32gui.MoveWindow(hwnd,0,0,1000,700,True)
            time.sleep(1)
            for name in name_list:
                movePos(28,147)
                click()
                #2.移动鼠标到搜索框,单击,输入要搜索的名字
                movePos(148,35)
                click()
                time.sleep(1)
                setText(name)
                ctrlV()
                time.sleep(1# 等待联系人搜索成功
                enter()
                time.sleep(1)
                now=time.strftime("%m月%d日%H:%M",time.localtime())
                weatherContent='现在是'+now+'\n'+base_weatherContent
                setText(weatherContent)
                ctrlV()
                time.sleep(1)
                altS()
                time.sleep(1)
                setText(weiboContent)
                ctrlV()
                time.sleep(1)
                altS()
                time.sleep(1)
            win32gui.PostMessage(hwnd, win32con.WM_CLOSE, 0, 0)
        time.sleep(60)

六、运行效果

python趣味挑战之爬取天气与微博热搜并自动发给微信好友

七、总结

  •  爬取中国天气网数据
  • 爬取微博热搜
  • 自动发送微信消息
  • 打包为exe并写个简单的GUI
  • 写的比较简单,不过也够用了,也懒得继续写下去了,希望可以供大家参考.

github地址 https://github.com/gudu12306/auto_for_wechat

到此这篇关于python趣味挑战之爬取天气与微博热搜并自动发给微信好友的文章就介绍到这了,更多相关python爬取天气与微博热搜内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://blog.csdn.net/weixin_42882419/article/details/117359685

相关文章

热门资讯

yue是什么意思 网络流行语yue了是什么梗
yue是什么意思 网络流行语yue了是什么梗 2020-10-11
背刺什么意思 网络词语背刺是什么梗
背刺什么意思 网络词语背刺是什么梗 2020-05-22
2020微信伤感网名听哭了 让对方看到心疼的伤感网名大全
2020微信伤感网名听哭了 让对方看到心疼的伤感网名大全 2019-12-26
2021年耽改剧名单 2021要播出的59部耽改剧列表
2021年耽改剧名单 2021要播出的59部耽改剧列表 2021-03-05
苹果12mini价格表官网报价 iPhone12mini全版本价格汇总
苹果12mini价格表官网报价 iPhone12mini全版本价格汇总 2020-11-13
返回顶部