一、系统环境
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 ) |
六、运行效果
七、总结
- 爬取中国天气网数据
- 爬取微博热搜
- 自动发送微信消息
- 打包为exe并写个简单的GUI
- 写的比较简单,不过也够用了,也懒得继续写下去了,希望可以供大家参考.
github地址 https://github.com/gudu12306/auto_for_wechat
到此这篇关于python趣味挑战之爬取天气与微博热搜并自动发给微信好友的文章就介绍到这了,更多相关python爬取天气与微博热搜内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!
原文链接:https://blog.csdn.net/weixin_42882419/article/details/117359685