Python requests、bs4 查詢地區停電信息

夏天停電實在是太煩了,供電局只會在停電之後發來一條訊息:“很抱歉。。。”
有什麼用呢?爲什麼不提前通知我呢?這麼熱的天,你不熱的嗎?
算了,不抱怨了,自己動手吧,寫一個查詢的程序放服務器,這樣停電前幾天就可以得知信息了,然後停電的時候就提前去 蹭 蹭 蹭 蹭空調!!!動手吧!!!!
需要注意的是,代碼有些繁雜、冗餘。。。另外,只限於河南地區 我不是有偏見,因爲這個公衆號它只能查河南。恰好我也是河南。

查詢接口以及運行環境

接口:微信 河南停電信息查詢 公衆號
運行環境:python 3.5.4
所需庫:requests bs4

三大模塊

選擇查詢地區

#!/usr/bin/env python
# -*- coding:utf-8 -*-
# Author:smart_num_1
# Blog:https://blog.csdn.net/smart_num_1
def cout_message(text = ''):
	# 說明:該函數爲一個被調用的函數,單獨來看可能並沒有什麼意義
    os.system('cls')

	# 衆字典的說明,字典中保存的編號則爲調用接口時,需要提交的參數。
    if text == '安陽':
        datas = {"安陽":"41405","內黃縣":"4140522","湯陰縣":"4140522","滑縣":"4140523","安陽縣":"4140524","林州市":"4140525",}
    
    elif text == '鶴壁':
        datas = {"鶴壁":"41413","淇縣":"4141322","浚縣":"4141322",}
    
    elif text == '濟源':
        datas = {"濟源":"41418",}
    
    elif text == '焦作':
        datas = {"焦作":"41408","溫縣":"4140822","孟州市":"4140822","修武縣":"4140823","博愛縣":"4140824","沁陽市":"4140825","武陟縣":"4140826",}
    
    elif text == '開封':
        datas = {"開封":"41406","蘭考縣":"4140622","杞縣":"4140622","通許縣":"4140623","尉氏縣":"4140624","開封縣":"4140625",}
 
    elif text == '洛陽':
        datas = {"洛陽":"41404","欒川縣":"4140422","洛寧縣":"4140422","孟津縣":"4140423","新安縣":"4140424","偃師市":"4140425","宜陽縣":"4140426","嵩縣":"4140428","汝陽縣":"4140429",}
        
    elif text == '南陽':
        datas = {"南陽":"41403","鄧州市":"4140322","方城縣":"4140322","南召縣":"4140324","社旗縣":"4140325","唐河縣":"4140326","桐柏縣":"4140327","西峽縣":"4140328","淅川縣":"4140329","新野縣":"4140330","鎮平縣":"4140331",}
        
    elif text == '平頂山':
        datas = {"平頂山":"41402","葉縣":"4140222","汝州市":"4140222","寶豐縣":"4140223","郟縣":"4140224","魯山縣":"4140225","平頂山市華辰":"4140226","華辰石龍區":"4140227",}
        
    elif text == '濮陽':
        datas = {"濮陽":"41410","濮陽縣":"4141022","清豐縣":"4141022","範縣":"4141023","臺前縣":"4141024","南樂縣":"4141025",}
        
    elif text == '三門峽':
        datas = {"三門峽":"41409","陝縣":"4140922","澠池縣":"4140922","靈寶市":"4140923","盧氏縣":"4140924",}
        
    elif text == '商丘':
        datas = {"商丘":"41412","永城":"4141222","寧陵縣":"4141222","民權縣":"4141223","夏邑縣":"4141224","睢縣":"4141225","虞城縣":"4141226","柘城縣":"4141227",}
        
    elif text == '信陽':
        datas = {"信陽":"41416","固始縣":"4141622","新縣":"4141622","商城縣":"4141623","息縣":"4141624","淮濱縣":"4141625","羅山縣":"4141626","潢川縣":"4141627","光山縣":"4141628",}
        
    elif text == '新鄉':
        datas = {"新鄉":"41407","衛輝市":"4140722","獲嘉縣":"4140722","輝縣市":"4140723","長垣縣":"4140724","新鄉縣":"4140725","原陽縣":"4140726","封丘縣":"4140727","延津縣":"4140728",}
        
    elif text == '許昌':
        datas = {"許昌":"41414","長葛市":"4141422","鄢陵縣":"4141422","禹州市":"4141423","許昌縣":"4141424","襄城縣":"4141425",}
        
    elif text == '鄭州':
        datas = {"鄭州":"41401","登封市":"4140122","鞏義市":"4140122","滎陽市":"4140123","新鄭市":"4140124","新密":"4140125","航空港區":"4140127",}
        
    elif text == '周口':
        datas = {"周口":"41417","鄲城縣":"4141722","扶溝縣":"4141722","淮陽縣":"4141723","鹿邑縣":"4141724","沈丘縣":"4141725","項城市":"4141726","商水縣":"4141727","太康縣":"4141728","西華縣":"4141729","泛區局":"4141730",}
        
    elif text == '駐馬店':
        datas = {"駐馬店":"41415","泌陽縣":"4141522","平輿縣":"4141522","汝南縣":"4141523","上蔡縣":"4141524","遂平縣":"4141525","西平縣":"4141526","新蔡縣":"4141527","確山縣":"4141528","正陽縣":"4141529",}
        
    else:
        return 'False','None'
		
	# .keys()  字典中的操作函數,返回所有的鍵名稱
    for data in datas.keys():
        print(data)

	# 循環目的,檢查查詢地區是否包含在所選地區的可查詢範圍內
    while True:
        keyword = input('要查詢的地區:')
        if keyword in datas.keys():
            break
        else:
            print('輸入錯誤,檢查後重新輸入')
        
    # 最後返回查詢地區名字以及該地區的編號
    return keyword,datas[keyword]

調用接口,得到信息

#!/usr/bin/env python
# -*- coding:utf-8 -*-
# Author:smart_num_1
# Blog:https://blog.csdn.net/smart_num_1
def get_weather(organ = '',organText = '',location = ''):
    os.system('cls')
    
    # 調用的接口,得到的方式,從搜狗搜索引擎,找到 微信 這一項,搜索 河南停電信息查詢 公衆號,會得到該查詢入口,點擊進入即可得到此接口
    url = 'http://hndlwx.ha.sgcc.com.cn/powerwx/StopPowerServlet'

	# 請求頭應該就不用說了,大家都會的就不需要囉嗦了吧,如有疑問,微信 Be_a_lucky_dog 一起交流吧
    headers = {
        'Referer': 'http://hndlwx.ha.sgcc.com.cn/powerwx/stopPower.jsp',
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.113 Safari/537.36',
        'Cookie': 'JSESSIONID=bOyCipAFT-aoHdd3dEXgFc3Ik2q2x6x8axO5aqQE4HqeolOi1NdQ!-36260657',
        'Host': 'hndlwx.ha.sgcc.com.cn',
        'Origin': 'http://hndlwx.ha.sgcc.com.cn',
        'X-Requested-With': 'XMLHttpRequest'
    }

	# 需要提交的表單  organ:查詢地區的編號  organText:查詢地區的名字
    params = {
        'organ': organ,
        'organText': organText
    }

	# 如果自己去親手實驗一番,自己會得知該請求爲 post 請求
    response = requests.post(url = url,headers = headers,params = params).text
    data_1 = bp(response, 'lxml')
    data_2 = data_1.find_all(class_ = 'pw')
    if len(data_2) == 0:
        print('暫無停電信息')
        return None

	# 從此處開始篩選並且輸出得到的信息
    print('停電信息如下,若無輸出,則表明該地區不會停電\n')
    for data in data_2:
        data_tolocationANDtime = data.find_all(class_ = 'text')
	
		# 此處 if 判斷 是爲了區分是否填入了詳細的查詢地址,如果填寫,則只輸出該地區的信息
        if location == '':
        	# 這裏建議自己從 data_tolocationANDtime[1] 開始,一步步看看到底輸出的是什麼
        	# 然後按照自己的思路去選擇自己想要的信息,說白了,這裏就是一個字符串的處理
            s_location = data_tolocationANDtime[1].text[4:].strip()
            s_time = data_tolocationANDtime[0].text[4:].strip()

			# 有心人可能會發現,這裏調用了一個函數,此函數的作用,在下方會解釋
            data_reason = deal_number(text=data.find(class_='resson').text)
            print('停電地區:' + s_location + '\n停電時段:' + s_time + '\n停電原因:' + data_reason + '\n')
        else:
        	# 參考上方的註釋理解
            if location in str(data_tolocationANDtime):
                s_location = data_tolocationANDtime[1].text[4:].strip()
                s_time = data_tolocationANDtime[0].text[4:].strip()
                data_reason = deal_number(text = data.find(class_ = 'resson').text)
                print('停電地區:' + s_location + '\n停電時段:' + s_time + '\n停電原因:' + data_reason + '\n')

字符串的處理

#!/usr/bin/env python
# -*- coding:utf-8 -*-
# Author:smart_num_1
# Blog:https://blog.csdn.net/smart_num_1
def deal_number(text = ''):
	# 這個函數實現的內容就是將字符串中的數字以及部分符號去除
    number = ['1','2','3','4','5','6','7','8','9','0','#','!','@','#','$','%','^','&','(',')',';']
    text_new = ''

	# 用到了字符串的切片處理以及索引搜索函數 .find() 
	# 如果自己去網站動手看了,會發現在停電原因會有(),()中填寫的是一些推遲信息,其中包含日期
	# 所以不能將這些日期也去除數字,所以去除只進行到 () 之前
    for i in text[:text.find('(')]:
        if i in number:
            continue
        text_new += i
    text_new += text[text.find('('):]

    return text_new

完整源碼

#!/usr/bin/env python
# -*- coding:utf-8 -*-
# Author:smart_num_1
# Blog:https://blog.csdn.net/smart_num_1
import requests
from bs4 import BeautifulSoup as bp
import os

def cout_message(text = ''):
    os.system('cls')
    if text == '安陽':
        datas = {"安陽":"41405","內黃縣":"4140522","湯陰縣":"4140522","滑縣":"4140523","安陽縣":"4140524","林州市":"4140525",}
    
    elif text == '鶴壁':
        datas = {"鶴壁":"41413","淇縣":"4141322","浚縣":"4141322",}
    
    elif text == '濟源':
        datas = {"濟源":"41418",}
    
    elif text == '焦作':
        datas = {"焦作":"41408","溫縣":"4140822","孟州市":"4140822","修武縣":"4140823","博愛縣":"4140824","沁陽市":"4140825","武陟縣":"4140826",}
    
    elif text == '開封':
        datas = {"開封":"41406","蘭考縣":"4140622","杞縣":"4140622","通許縣":"4140623","尉氏縣":"4140624","開封縣":"4140625",}
 
    elif text == '洛陽':
        datas = {"洛陽":"41404","欒川縣":"4140422","洛寧縣":"4140422","孟津縣":"4140423","新安縣":"4140424","偃師市":"4140425","宜陽縣":"4140426","嵩縣":"4140428","汝陽縣":"4140429",}
        
    elif text == '南陽':
        datas = {"南陽":"41403","鄧州市":"4140322","方城縣":"4140322","南召縣":"4140324","社旗縣":"4140325","唐河縣":"4140326","桐柏縣":"4140327","西峽縣":"4140328","淅川縣":"4140329","新野縣":"4140330","鎮平縣":"4140331",}
        
    elif text == '平頂山':
        datas = {"平頂山":"41402","葉縣":"4140222","汝州市":"4140222","寶豐縣":"4140223","郟縣":"4140224","魯山縣":"4140225","平頂山市華辰":"4140226","華辰石龍區":"4140227",}
        
    elif text == '濮陽':
        datas = {"濮陽":"41410","濮陽縣":"4141022","清豐縣":"4141022","範縣":"4141023","臺前縣":"4141024","南樂縣":"4141025",}
        
    elif text == '三門峽':
        datas = {"三門峽":"41409","陝縣":"4140922","澠池縣":"4140922","靈寶市":"4140923","盧氏縣":"4140924",}
        
    elif text == '商丘':
        datas = {"商丘":"41412","永城":"4141222","寧陵縣":"4141222","民權縣":"4141223","夏邑縣":"4141224","睢縣":"4141225","虞城縣":"4141226","柘城縣":"4141227",}
        
    elif text == '信陽':
        datas = {"信陽":"41416","固始縣":"4141622","新縣":"4141622","商城縣":"4141623","息縣":"4141624","淮濱縣":"4141625","羅山縣":"4141626","潢川縣":"4141627","光山縣":"4141628",}
        
    elif text == '新鄉':
        datas = {"新鄉":"41407","衛輝市":"4140722","獲嘉縣":"4140722","輝縣市":"4140723","長垣縣":"4140724","新鄉縣":"4140725","原陽縣":"4140726","封丘縣":"4140727","延津縣":"4140728",}
        
    elif text == '許昌':
        datas = {"許昌":"41414","長葛市":"4141422","鄢陵縣":"4141422","禹州市":"4141423","許昌縣":"4141424","襄城縣":"4141425",}
        
    elif text == '鄭州':
        datas = {"鄭州":"41401","登封市":"4140122","鞏義市":"4140122","滎陽市":"4140123","新鄭市":"4140124","新密":"4140125","航空港區":"4140127",}
        
    elif text == '周口':
        datas = {"周口":"41417","鄲城縣":"4141722","扶溝縣":"4141722","淮陽縣":"4141723","鹿邑縣":"4141724","沈丘縣":"4141725","項城市":"4141726","商水縣":"4141727","太康縣":"4141728","西華縣":"4141729","泛區局":"4141730",}
        
    elif text == '駐馬店':
        datas = {"駐馬店":"41415","泌陽縣":"4141522","平輿縣":"4141522","汝南縣":"4141523","上蔡縣":"4141524","遂平縣":"4141525","西平縣":"4141526","新蔡縣":"4141527","確山縣":"4141528","正陽縣":"4141529",}
        
    else:
        return 'False','None'
		
    for data in datas.keys():
        print(data)
    while True:
        keyword = input('要查詢的地區:')
        if keyword in datas.keys():
            break
        else:
            print('輸入錯誤,檢查後重新輸入')
    return keyword,datas[keyword]


def deal_number(text = ''):
    number = ['1','2','3','4','5','6','7','8','9','0','#','!','@','#','$','%','^','&','(',')',';']
    text_new = ''
    for i in text[:text.find('(')]:
        if i in number:
            continue
        text_new += i
    text_new += text[text.find('('):]

    return text_new


def get_weather(organ = '',organText = '',location = ''):
    os.system('cls')
    url = 'http://hndlwx.ha.sgcc.com.cn/powerwx/StopPowerServlet'
    headers = {
        'Referer': 'http://hndlwx.ha.sgcc.com.cn/powerwx/stopPower.jsp',
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.113 Safari/537.36',
        'Cookie': 'JSESSIONID=bOyCipAFT-aoHdd3dEXgFc3Ik2q2x6x8axO5aqQE4HqeolOi1NdQ!-36260657',
        'Host': 'hndlwx.ha.sgcc.com.cn',
        'Origin': 'http://hndlwx.ha.sgcc.com.cn',
        'X-Requested-With': 'XMLHttpRequest'
    }
    params = {
        'organ': organ,
        'organText': organText
    }

    response = requests.post(url = url,headers = headers,params = params).text
    data_1 = bp(response, 'lxml')
    data_2 = data_1.find_all(class_ = 'pw')
    if len(data_2) == 0:
        print('暫無停電信息')
        return

    print('停電信息如下,若無輸出,則表明該地區不會停電\n')
    for data in data_2:
        data_tolocationANDtime = data.find_all(class_ = 'text')
        if location == '':
            s_location = data_tolocationANDtime[1].text[4:].strip()
            s_time = data_tolocationANDtime[0].text[4:].strip()
            data_reason = deal_number(text=data.find(class_='resson').text)
            print('停電地區:' + s_location + '\n停電時段:' + s_time + '\n停電原因:' + data_reason + '\n')
        else:
            if location in str(data_tolocationANDtime):
                s_location = data_tolocationANDtime[1].text[4:].strip()
                s_time = data_tolocationANDtime[0].text[4:].strip()
                data_reason = deal_number(text = data.find(class_ = 'resson').text)
                print('停電地區:' + s_location + '\n停電時段:' + s_time + '\n停電原因:' + data_reason + '\n')


if __name__ == '__main__':
	# os.system('cls') 的作用是將控制檯輸出清空
    while True:
        keyword,keynumber = cout_message(input('欲查詢市區(僅限河南,如:鄭州):'))
        os.system('cls')
        if keyword == 'False':
            print('沒有該城市信息或檢查是否有錯字')
        else:
            os.system('cls')
            print('可以不填次信息,直接回車即可。\n若不填寫此信息,則搜索整個地區停電信息')
            location = input('輸入查詢小區或村莊(如:警安花園小區、安樂村):')
            get_weather(organ = keynumber,organText = keyword,location = location)

獲取打包程序鏈接

點擊這個鏈接: 就能下載, 提取碼: csdn

如何掛在服務器

說明,我也是摸索階段,可能並不是最好的方法

Linux:
自己在Linux寫下程序 或 用 Winscp 上傳到 服務器,利用contrab,創建定時任務,詳細操作可以參考這篇文章

Windows server:
我不知道怎麼創建定時任務,只會從程序的角度出發
這個不建議用,原因我也說不上來,大概是因爲我菜所以找不到原因
方法就是:一天不停的運行,然後用 time.sleep() 停頓一定的時間開始一次任務,但是就有些雞肋

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章