Python自动化爬取天气预报、疫情、糗事、通过企业微信发送给男女朋友

概述

Python自动化爬取指定城市天气、疫情和糗事搞笑段子数据信息保存到txt文件,并通过企业微信机器人每天定时发送指定信息到指定群聊

详细

概述

开发这个程序、本来一个py文件就可以开发好、个人是不嫌麻烦的人,所有把步骤弄成多个py文件进行、适合新手参考、

我们先看看效果

准备工作

开发过程中使用的工具
Visual Studio Code - Insiders
pycharm

在开发过程中使用了Python第三方模块、可通过Windows下载方法、cmd命令pip install

    import requests
    import os
    import re
    import json
    import time
    import codecs
    from datetime import date, datetime
    from urllib import request, error
    from  bs4 import BeautifulSoup
    from apscheduler.schedulers.background import BackgroundScheduler

建立一个企业微信群,然后添加一个机器人

在配置企业微信群里面的机器人拿出它的Webhook网址

实现整个程序的部分代码过程展示

一、首先处理第一个需求、抓取天气预报数据信息并通过企业微信机器人发送、创建一个天气预报发送.py的文件包

1、 先锁定一个天气预报的网址南昌县天气预报,南昌县7天天气预报,南昌县15天天气预报,南昌县天气查询
打开浏览器自带的抓包工具、刷新一下、找到一个叫city.js的文件夹、里面保存着我们想要的数据,这种实时更新的界面一般是通过ajax传入json文件实现的。

2、 找到我们想要的数据包,我们就可以开始写一个程序,先导入requests BeautifulSoup模块

    import requests
    from bs4 import BeautifulSoup

3、 通过requests来获取天气网页信息、先定义一个函数为 get_content

    # 获取城市的天气网页信息
    def get_content(url, data=None):    
        try:
            r = requests.get(url, timeout=30)
            r.raise_for_status()
            r.encoding = r.apparent_encoding
            return r.text
        except:
            return '产生异常'

4、拿到网页信息后,先找到我们想要的数据标签,通过BeautifulSoup处理和提取我们想要的数据,思路搞清楚了,那代码,它不就来了嘛,在定义一个函数get_data

  1. 先处理一下网页数据
  •     # 处理网页信息
        def get_data(html,city):
         final_list = []
         soup = BeautifulSoup(html, 'html.parser')
         body = soup.body
         data = body.find('div', {'id': '7d'})
         ul = data.find('ul')
         lis = ul.find_all('li')

    2.找到我们想要数据的标签用BeautifulSoup提取出来

  •     for day in lis:
             temp_list = [city]
             date = day.find('h1').string
             temp_list.append(date)
             info = day.find_all('p')
             temp_list.append(info[0].string)
             if info[1].find('span') is None:
                 temperature_highest = ' '
             else:
                 temperature_highest = info[1].find('span').string
                 temperature_highest = temperature_highest.replace('℃', ' ')
             if info[1].find('i') is None:  #
                 temperature_lowest = ' '
             else:
                 temperature_lowest = info[1].find('i').string
                 temperature_lowest = temperature_lowest.replace('℃', ' ')
             temp_list.append(temperature_highest)
             temp_list.append(temperature_lowest)
             wind_scale = info[2].find('i').string
             temp_list.append(wind_scale)
             final_list.append(temp_list)

    5、把提取出来的数据保存到txt文件中

  •     #将近七天的天气信息存放在文件中
        def save_data(data,filename):    
            f=open(filename,"wt")
            for line in data:
                f.write(str(line)+'\n')
            f.close()

    写了这么多,终于把这个信息给爬下来了,现在差最后一步、把这个信息通过企业微信机器人发送到指定群聊、整上,定义一个postrsg函数

  •     def postrsg(filename):    
            with open(filename,'r') as f:
                lines = f.readlines()
            first = lines[0]
            sec = lines[1].rstrip("\n")
            headers = {"Content-Type": "text/plain"}
            data = {
              "msgtype": "text",
              "text": {
                 "content": first+sec,
              }
            }
            r = requests.post(
                  url='填写自己企业微信机器人的webhook',headers=headers, json=data)
            print(r.text)

    写到这里、我们第一个需求,天气预报.py文件终于写完了!

    二、写了这么多,手感应该是有了吧,那现在写第二个程序吧!那新建一个爬取全国最新疫情信息.py文件吧

    1、有了上个程序的基础,那些第二个文件就容易了,我们先看看这个疫情文件包里面的数据是什么
    https://view.inews.qq.com/g2/getOnsInfo?name=disease_h5
    打开一看!不管是新手还是老司机,一看这个数据就是json数据

    好了,拿到数据,就开始准备动手!
    首先我们导入requests、json库

     

        import requests
        import json

    2、我们先定义一个Down_data函数,用requests库来获取它的网页信息,然后用json库来编译它的json文件,思路搞清了,来吧!动手

  •     def Down_data():
            url = 'https://view.inews.qq.com/g2/getOnsInfo?name=disease_h5'
            headers = {
               '填写自己的UA请求头'
            }
            r = requests.get(url, headers)
            res = json.loads(r.text)
            data_res = json.loads(res['data'])
            return data_res

    3、数据拿到了,我们来处理一下我们想要的数据,定义一个Parse_data1函数,然后在Parse_data1定义一个list列表,开整

  •                                                             list = ['截至时间:' + str(data['lastUpdateTime']) + '\n'
                                                            '全国确诊人数:' + str(data['chinaTotal']['confirm']) + '\n'
                                                                                                             '今日新增确诊:' + str(
                data['chinaAdd']['confirm']) + '\n'
                                               '全国疑似:' + str(data['chinaTotal']['suspect']) + '\n'
                                                                                              '今日新增疑似:' + str(
                data['chinaAdd']['suspect']) + '\n'
                                               '全国治愈:' + str(data['chinaTotal']['heal']) + '\n'
                                                                                           '今日新增治愈:' + str(
                data['chinaAdd']['heal']) + '\n'
                                            '全国死亡:' + str(data['chinaTotal']['dead']) + '\n'
                                                                                        '今日新增死亡:' + str(
                data['chinaAdd']['dead']) + '\n']
            result = ''.join(list)

    4、有上个程序基础,敲这个是不是简单很多,数据我们拿到了,我们来保存一下,保存txt文件时候,编码要设置成utf-8,不然会乱码,来吧!

  •         with open('疫情查询.txt', 'a+', encoding="utf-8") as f:
                f.write(result + '\n')

    5、最后一步,我想了想,要不还是实现一下搜索城市查询吧,不然有点乱,也很简单,来吧直接干,定义一个Parse_data2函数

  •     def Parse_data2():
            data = Down_data()['areaTree'][0]['children']
            path = str(input('请输入你要查询的省份:'))
            for i in data:
                if path in i['name']:
                    for item in i['children']:
                        list_city = [
                            '地区: ' + str(item['name']) + ' '
                            ' 确诊人数:' + str(item['total']['confirm']),
                            ' 新增确诊:' + str(item['today']['confirm']),
                            ' 治愈:' + str(item['total']['heal']),
                         #   ' 新增治愈:' + str(item['today']['heal']),
                            ' 死亡:' + str(item['total']['dead']) + '\n',
                         #   ' 新增死亡:' + str(item['today']['dead']) + '\n'
                        ]
                        res_city = ''.join(list_city)
                        with open('疫情查询.txt', 'a+', encoding="utf-8") as f:
                            f.write(res_city)

    好了,我们第二个需求写好了,说真的,写完这两个,都有点麻了,但是手感越来越好了!来吧继续写第三个需求

    三、第三个需求我们是爬取糗事搞笑段子,这里要运用到

    1、codecs模块进行编码转换
    2、re模块正则提取字符串中括号内的内容
    3、requests模块获取网页信息
    4、urllib模块通过代码模拟浏览器发送请求
    5、BeautifulSoup模块提取我们想要的数据

    既然思路有了,话不多说,直接开搞
    1、先导入模块

  •     import re
        import codecs
        from urllib import request, error
        from  bs4 import BeautifulSoup

    2、先定义一个askurl函数,来获取信息

  •     def askurl(url):
            try:
                headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36'}
                req = request.Request(url=url, headers=headers)
                respond = request.urlopen(req)
                html = respond.read().decode('utf-8')
                return html
            except error.URLError as e:
                if hasattr(e, 'code'):
                    print(e.code)
                if hasattr(e, 'reason'):
                    print(e.reason)

    3、利用re模块来提取字符串中括号内的内容

  •     FindName = re.compile(r'<h2>(.*?)</h2>', re.S)
        FindContent = re.compile(r'<span>(.*?)</span>', re.S)

    4、网页信息我们拿到后,找到我们想要的数据标签通过BeautifulSoup来进行提取,定义一个getdata函数。

  •     def getdata():
            datalist = []
            baseurl = 'https://www.qiushibaike.com/text/page/'
            for i in range(10):
                url = baseurl + str(i+1)
                html = askurl(url)
                soup = BeautifulSoup(html, 'html.parser')
                for item in soup.find_all('div', {'class':'article block untagged mb15 typs_hot'}):
                    item = str(item)
                    name = FindName.findall(item)[0]
                    name = name.replace('\n', '')
                    content = FindContent.findall(item)[0]
                    content = content.replace('\n\n\n', '')
                    content = content.replace('<br/>', '\n')
                    datalist.append([name, content])
            return datalist

    5、写到这里是不是都要麻了,现在我们想要的数据我们提取到了,我们来保存一下,定义一个savedata函数

  •     def savedata(savepath):
            datalist = getdata()
            with codecs.open(savepath, 'w', 'utf-8') as file:
                for i in range(len(datalist)):
                    file.write('用户'+str(i+1)+'是   -->   ')
                    file.write(datalist[i][0])
                    file.write('\n')
                    file.write('段子   -->   ')
                    file.write(datalist[i][1])
                    file.write('\n')

    写到这里,我们的第三个需求写完了

    现在我们来整理一下,我们利用爬虫爬取了,天气情况,疫情情况,和糗事搞笑段子,现在是不是差发送了,但是我想了想,光发送这些是不是太单调了,学计算机程序员也是会懂得浪漫和爱情的,哈哈哈,所有我们来调整一下吧!来吧开整

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

西安未央

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值