自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

如何利用Python爬蟲實(shí)現(xiàn)給微信群發(fā)新聞早報(bào)?

開發(fā) 后端
后期更改了一種方案,通過修改爬蟲方案,創(chuàng)建 API 服務(wù),編寫 App 去獲取數(shù)據(jù),然后手動(dòng)發(fā)送到微信群,本篇文章將和大家詳細(xì)聊聊具體的實(shí)現(xiàn)過程。

[[433136]]

 1. 場景

經(jīng)常有小伙伴在交流群問我,每天的早報(bào)新聞是怎么獲取的?

其實(shí),早期使用的方案,是利用爬蟲獲取到一些新聞網(wǎng)站的標(biāo)題,然后做了一些簡單的數(shù)據(jù)清洗,最后利用 itchat 發(fā)送到指定的社群中。

由于爬蟲面對(duì)網(wǎng)站改版的不穩(wěn)定性及 itchat 不安全性,所以放棄了這種方案。

后期更改了一種方案,通過修改爬蟲方案,創(chuàng)建 API 服務(wù),編寫 App 去獲取數(shù)據(jù),然后手動(dòng)發(fā)送到微信群。

本篇文章將和大家詳細(xì)聊聊具體的實(shí)現(xiàn)過程。

2. 數(shù)據(jù)爬取

第 1 步,通過 Python 爬蟲獲取數(shù)據(jù)

獲取方式有 2 種,分別是:已有的新聞早報(bào)網(wǎng)站、新聞網(wǎng)站的頭條新聞

選擇一種爬蟲方式,就能很快地爬取到目標(biāo)網(wǎng)站的數(shù)據(jù)

第 2 步,數(shù)據(jù)清洗,排序

將爬取到的數(shù)據(jù)先進(jìn)行一次關(guān)鍵字篩選,然后按照點(diǎn)贊或者閱讀數(shù)按照熱點(diǎn)進(jìn)行排序

第 3 步,參數(shù)化,去重

去掉數(shù)據(jù)中重復(fù)的新聞,然后將最后展示的數(shù)目參數(shù)化 

  1. # 按照點(diǎn)贊數(shù)目,降序排列  
  2. news_sorted_pro = sorted(news, key=itemgetter('news_approve_num'), reverse=True 
  3. result = []  
  4. for news_sorted_item in news_sorted_pro:  
  5.       result.append(news_sorted_item.get('title'))  
  6. # 去重  
  7. result = sorted(set(result), key=result.index)  
  8. # 只取前12條數(shù)據(jù)  
  9. resultresult = result[:self.news_num] if len(result) >= self.news_num else result 

需要注意的是,由于新聞網(wǎng)站會(huì)經(jīng)常改版,建議爬取多個(gè)新聞網(wǎng)站,做好異常處理,做一個(gè)優(yōu)先級(jí),如果一個(gè)網(wǎng)站爬取數(shù)據(jù)失敗,切換到下一個(gè)級(jí)別的網(wǎng)站爬取數(shù)據(jù)

3. 服務(wù)化

將數(shù)據(jù)服務(wù)化,即編寫 API,目的是為了方便終端調(diào)用

如果使用 Python 編寫 API,建議使用 FastAPI 或 Flask 框架,因?yàn)檫@兩個(gè)框架開發(fā) API 方便快捷,以 FastAPI 為例:

第 1 步,安裝依賴

包含 FastAPI 框架及 hypercorn 依賴,hypercorn 是獨(dú)立的 ASGI 服務(wù)器,方便 FastAPI 項(xiàng)目的部署 

  1. # FastAPI框架  
  2. pip3 install fastapi  
  3. pip3 install hypercorn  

第 2 步,編寫 API

使用 FastAPI 很方便,不到 10 行代碼就能編寫一個(gè)接口服務(wù)。

只需要實(shí)例化 FastAPI 對(duì)象,利用裝飾器指定請(qǐng)求方法和路徑即可,調(diào)用上面的爬蟲方法即可。 

  1. from fastapi import FastAPI  
  2. # 實(shí)例化 
  3. app = FastAPI()  
  4. # API,Get方式  
  5. @app.get("/last_news")  
  6. def get_last_news():  
  7.     """  
  8.     最新的新聞  
  9.     :return:  
  10.     """  
  11.     news = get_news()  
  12.     data = {  
  13.         'code': 0,  
  14.         'news': news  
  15.     }  
  16.     # 封裝  
  17.     return data 

如要想本地調(diào)試 API,可以通過 uvicorn 命令運(yùn)行項(xiàng)目。

  1. # 運(yùn)行項(xiàng)目  
  2. uvicorn news:app --reload 

然后訪問下面的地址,查看返回的新聞數(shù)據(jù)

http://127.0.0.1:8000/last_news

第 3 步,生成依賴遷移文件

使用 pip freeze 命令將在本地生成依賴遷移文件 

  1. # 生成遷移文件  
  2. pip freeze > requirements.txt 

第 4 步,上傳代碼

將代碼上傳到代碼托管平臺(tái),比如:碼云、GitLab 等

第 5 步,服務(wù)器拉取代碼

服務(wù)器中通過 git 拉取代碼,并通過依賴文件一鍵安裝所有依賴 

  1. # 安裝依賴  
  2. pip3 install -r requirements.txt 

第 6 步,運(yùn)行服務(wù)

使用 hypercorn 運(yùn)行 FastAPI 項(xiàng)目,使進(jìn)程一直在后臺(tái)運(yùn)行,并保存運(yùn)行日志信息 

  1. # 后臺(tái)運(yùn)行  
  2. # 保存日志,綁定端口號(hào)為:8000  
  3. # nohup hypercorn news:app --bind 0.0.0.0:8000 > /news.log 2>&1 & 

需要注意的是,項(xiàng)目綁定的端口號(hào)需要在防火墻和云服務(wù)器安全組開啟

當(dāng)然,如果使用 Java 編寫 API,推薦使用 Spring Boot,可以快速開發(fā)一個(gè) Restful API 服務(wù)

4. 編寫 App

完成 API 服務(wù)之后,接下來就是在終端編寫一款 App 去訪問 API,拿到數(shù)據(jù)并展示出來

以編寫一款 Android 應(yīng)用為例

首先,我們?cè)诮缑嫔戏胖靡粋€(gè)文本顯示框和一個(gè)按鈕控件

然后,對(duì)按鈕控件設(shè)置點(diǎn)擊事件的監(jiān)聽 

  1. get_news_btn = findViewById(R.id.get_news_btn);  
  2. //監(jiān)聽事件  
  3. get_news_btn.setOnClickListener(this);  
  4. @Override  
  5. public void onClick(View v)  
  6.  
  7.     switch (v.getId())  
  8.     {  
  9.         case R.id.get_news_btn:  
  10.             news_et.setText("獲取中。。。");  
  11.             getNewsMet();  
  12.             break;  
  13.         }  
  14.     } 

接著,使用 Android 的網(wǎng)絡(luò)請(qǐng)求框架 OkHttp 框架調(diào)用 API 獲取數(shù)據(jù) 

  1. /***  
  2. * 獲取新聞  
  3. */  
  4. private void getNewsMet()  
  5.  
  6.      OkHttpClient okHttpClient = new OkHttpClient();  
  7.      //構(gòu)建請(qǐng)求信息:連接請(qǐng)求url 請(qǐng)求方法method 請(qǐng)求頭部headers 請(qǐng)求體body 標(biāo)簽tag  
  8.      Request request = new Request.Builder().url(url).get().build();  
  9. //        Call call = okHttpClient.newCall(request);  
  10.      okHttpClient.newCall(request).enqueue(new Callback() 
  11.      {  
  12.           @Override  
  13.           public void onFailure(Call call, IOException e)  
  14.           { 
  15.                Log.d("xag", "獲取失敗"); 
  16.               showResult(false, "");  
  17.           }   
  18.           @Override 
  19.           public void onResponse(Call call, final Response response) throws IOException  
  20.           {  
  21.               Log.d("xag", "獲取成功")  
  22.               parseJsonWithJsonObject(response);  
  23.           }  
  24.       });  

最后,將新聞數(shù)據(jù)顯示在文本控件中,并復(fù)制到系統(tǒng)剪切板 

  1. private void copyToClip(String content)  
  2.      //獲取剪貼板管理器:  
  3.      ClipboardManager cm = (ClipboardManager) getSystemService(CLIPBOARD_SERVICE);  
  4.      // 創(chuàng)建普通字符型ClipData 
  5.      ClipData mClipData = ClipData.newPlainText("Label", content);  
  6.      // 將ClipData內(nèi)容放到系統(tǒng)剪貼板里。  
  7.      if (null != cm)  
  8.      {  
  9.          cm.setPrimaryClip(mClipData);  
  10.      }  

如果只有 iOS 設(shè)備,使用 Xcode 編寫 iOS 應(yīng)用,建議將 Xcode 升級(jí)到 11.0 以上

創(chuàng)建項(xiàng)目的時(shí)候,推薦使用 SwiftUI 構(gòu)建 UI 界面,然后利用 CocoaPods 添加 Alamofire 網(wǎng)絡(luò)請(qǐng)求依賴庫,其他操作步驟和 Android 端類似,這里不展開說明 

  1. # Uncomment the next line to define a global platform for your project  
  2. source 'https://github.com/CocoaPods/Specs.git'  
  3. platform :ios, '9.0'  
  4. use_frameworks!  
  5. target 'news_eve' do  
  6.   # Comment the next line if you don't want to use dynamic frameworks  
  7.   pod 'Alamofire'  
  8.   pod 'SwiftyJSON'  
  9.   pod 'HandyJSON'  
  10.   # Pods for news_eve  
  11. end 

5. 最后

上面步驟只需要點(diǎn)擊 App 中的按鈕,早報(bào)新聞就復(fù)制到系統(tǒng)剪切板了,接著可以轉(zhuǎn)發(fā)到多個(gè)微信群了

當(dāng)然,最后一步也可以利用 SoloPi 或者無障礙,將內(nèi)容利用自動(dòng)化操作,一鍵轉(zhuǎn)發(fā)出去 

責(zé)任編輯:龐桂玉 來源: 菜鳥學(xué)Python
相關(guān)推薦

2020-04-10 12:25:28

Python爬蟲代碼

2014-11-20 09:38:40

C#

2013-04-12 01:22:02

2020-11-03 10:35:39

Python

2019-12-16 17:25:04

Python微信群同步直播

2013-05-22 10:58:09

微信公眾賬號(hào)微信

2020-05-16 12:06:32

微信公眾平臺(tái)Python開發(fā)

2015-11-12 09:39:28

微信紅包實(shí)現(xiàn)

2013-11-13 07:19:19

2024-12-19 10:00:00

Python發(fā)送消息編程

2013-08-08 10:13:25

微信

2018-06-05 15:04:19

爬蟲微信服務(wù)器

2013-05-24 09:35:46

Java實(shí)現(xiàn)

2017-01-04 18:09:23

Android微信支付快速實(shí)現(xiàn)

2018-12-11 10:39:14

Python服務(wù)器微信

2021-11-06 19:43:34

Python微信服務(wù)器

2018-02-26 08:44:35

Python微信數(shù)據(jù)分析

2017-12-26 09:10:43

Python微信圣誕帽

2020-03-18 09:23:24

Python數(shù)據(jù)SQL

2021-10-15 09:00:02

Python日期轉(zhuǎn)換Python基礎(chǔ)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)