1。在现场,经常有朋友在交流群里问我,每天的早间新闻怎么获取?其实早期使用的方案是通过爬虫获取一些新闻网站的标题,然后做一些简单的数据清洗,最后使用itchat发送到指定的社区。由于网站改版不稳定,itchat不安全,爬虫放弃了这个方案。后来换了一个方案,通过修改爬虫方案,创建一个API服务,写一个App获取数据,然后手动发送到微信群。本文将详细讲一下具体的实现过程。2、第一步数据爬取,通过Python爬虫获取数据有两种方式,分别是:现有新闻早报网站的头条新闻和新闻网站。选好爬虫方式,快速爬到目标网站数据第二步,数据清洗,排序会先按关键词过滤爬取的数据,然后根据热点按赞数或阅读量排序。Step3,参数化,去重,去除数据中的重复新闻,然后参数化最后显示的条数#根据点赞数,降序排序news_sorted_pro=sorted(news,key=itemgetter('news_approve_num'),reverse=True)result=[]fornews_sorted_iteminnews_sorted_pro:result.append(news_sorted_item.get('title'))#去重result=sorted(set(result),key=result.index)#只取前12条数据resultresult=result[:self.news_num]iflen(result)>=self.news_numelseresult需要注意更重要的是,由于新闻网站会经常改版,建议抓取多个新闻网站,做好异常处理,以及设定优先级。如果一个网站爬取数据失败,则切换到下一级网站爬取数据。3.Servicing服务数据,也就是写API,方便终端调用。如果使用Python编写API,推荐使用FastAPI或者Flask框架,因为这两个框架开发API方便快捷。以FastAPI为例:第一步,安装依赖包括FastAPI框架和hypercorn所依赖的。hypercorn是一个独立的ASGI服务器,方便FastAPI项目的部署。#FastAPI框架pip3installsfastapip3installhypercorn第二步,编写API使用FastAPI非常方便,不到10行代码就可以编写一个接口服务。只需要实例化FastAPI对象,使用装饰器指定请求方式和路径,调用上面的爬虫方法即可。fromfastapiimportFastAPI#Instantiationapp=FastAPI()#API,获取方法@app.get("/last_news")defget_last_news():"""最新消息:return:"""news=get_news()data={'code':0,'news':news}#Encapsulatereturndata如果想在本地调试API,可以通过uvicorn命令运行项目。#运行项目uvicornnews:app--reload然后访问如下地址查看返回的新闻数据http://127.0.0.1:8000/last_news第三步,生成依赖迁移文件使用pipfreeze命令生成依赖迁移文件locally#生成迁移文件pipfreeze>requirements.txt第四步,上传代码将代码上传到代码托管平台,如:码云,GitLab等。第五步,服务端通过git从服务端拉取代码到拉取代码,并通过依赖文件一键安装所有依赖#安装依赖pip3install-rrequirements.txt第六步,运行服务使用hypercorn运行FastAPI项目,保持进程在后台运行,并保存运行日志信息#后台运行#保存日志,绑定端口号为:8000#nohuphypercornnews:app--bind0.0.0.0:8000>/news.log2>&1&需要注意的是项目绑定的端口号需要在防火墙和云中启用erversecuritygroup当然,如果你使用Java写API,推荐使用SpringBoot,可以快速开发一个RestfulAPI服务4.写一个App完成API服务之后,接下来就是在上面写一个App终端访问API,获取数据并显示。以编写Android应用程序为例。首先,我们在界面上放置一个文本显示框和一个按钮控件,然后为按钮控件设置点击事件监听get_news_btn=findViewById(R.id.get_news_btn);//监听事件(Viewv){switch(v.getId()){caseR.id.get_news_btn:news_et.setText("获取...");getNewsMet();break;}}接下来使用Android的网络请求框架OkHttp框架调用API获取数据/****GetNews*/privatevoidgetNewsMet(){OkHttpClientokHttpClient=newOkHttpClient();//Build请求信息:连接请求urlrequestmethodmethodrequestheaderheaders请求bodytagtagRequestrequest=newRequest.Builder().url(url).get().build();//Callcall=okHttpClient.newCall(request);okHttpClient.newCall(request).enqueue(newCallback(){@OverridepublicvoidonFailure(Callcall,IOExceptione){Log.d("xag","GetFailed");showResult(false,"");}@OverridepublicvoidonResponse(Callcall,finalResponseresponse)throwsIOException{log.d("xag","acquiredsuccessfully")parseJsonWithJsonObject(response);}});}最后在文本控件中显示新闻数据,复制到系统剪贴板privatevoidcopyToClip(Stringcontent){//获取clipboardManager:ClipboardManagercm=(ClipboardManager)getSystemService(CLIPBOARD_SERVICE);//创建普通字符ClipDataClipDatamClipData=ClipData.newPlainText("Label",content);//将ClipData的内容放入系统剪贴板。if(null!=cm){cm.setPrimaryClip(mClipData);}}如果您只有iOS设备,请使用Xcode编写iOS应用程序。建议将Xcode升级到11.0或以上版本。创建项目时,推荐使用SwiftUI构建UI界面,然后使用CocoaPods添加Alamofire网络请求依赖库,其他操作步骤与Android端类似,此处不再展开描述#Uncommentthenextlinetodefineaglobalplatformforyourprojectsource'https://github.com/CocoaPods/Specs.git'platform:ios,'9.0'use_frameworks!target'news_eve'do#Commentthenextlineifyoudon'twanttousedynamicframeworkspod'Alamofire'pod'SwiftyJSON'pod'HandyJSON'#Podsfornews_eveend5。上面最后一步,你只需要点击App中的按钮,晨报就会被复制到系统剪贴板,然后转发到多个微信群当然最后一步也可以使用SoloPi或者无障碍,使用自动化操作一键转发内容
