脚本之家,脚本语言编程技术及教程分享平台!
分类导航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

服务器之家 - 脚本之家 - Python - python趣味挑战之爬取天气与微博热搜并自动发给微信好友

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

2021-11-18 09:53gudu12306 Python

忙着毕设与打游戏之余,突然想着写个爬虫练练手,想了想,就写了一个爬虫爬取“中国天气网”与“微博热搜”并定时发送给微信好友,放到服务器上运行了几天算是正常,需要的朋友可以参考下

一、系统环境

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

延伸 · 阅读

精彩推荐