《太好玩了爬虫、部署API、加小程序一条龙玩转知乎热榜!.docx》由会员分享,可在线阅读,更多相关《太好玩了爬虫、部署API、加小程序一条龙玩转知乎热榜!.docx(11页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、太好玩了,爬虫、部署API、加小程序,一条龙玩转知乎热榜!|周萝卜来源|萝卜大杂烩一直想做一个从爬虫到数据处理到API部署再到小程序展示的一条龙工程最近抽了些时间实现了一个关于知乎热榜的今天就来共享一下数据爬取首先我们看下需要爬取的知乎热榜s:/zhihu/billboard这个热榜可以返回50条热榜数据而这些数据都是通过页面的一个JavaScript返回的于是我们就可以通过解析这段JS代码来获取对应数据urls:/zhihu/billboardheadersUser-Agent:,Cookie:defget_hot_zhihu():resrequests.get(url,headershea
2、ders)contentBeautifulSoup(res.text,html.parser)hot_datacontent.find(script,idjs-initialData).stringhot_jsonjson.loads(hot_data)hot_listhot_jsoninitialStatetopstoryhotListreturnhot_list然后我们再点击一个热榜查看下详细的热榜页面我们一直向下下拉页面并翻开阅读器的调试板就可以看到如下的一个恳求该接口返回了一个包含热榜答复信息的json文件可以通过解析该文件来获取对应的答复defget_answer_zhihu(id)
3、:urls:/zhihu/api/v4/questions/%s/answers?include%idheadersUser-Agent:,Cookie:resrequests.get(urlConfig.ZHIHU_QUERY,headersheaders)data_jsonres.json()answer_infoforiindata_jsondata:ifpaid_infoini:continueanswer_info.append(author:iauthorname,voteup_count:ivoteup_count,comment_count:icomment_count,con
4、tent:icontent,reward_info:ireward_inforeward_member_count)returnanswer_info数据存储获取到数据之后我们需要存储到数据库中以便于后续使用。因为后面准备使用Flask来搭建API效劳所以这里存储数据的经过也基于Flask来做用插件flask_sqlalchemy。定义数据构造我们定义三张表分别存储知乎热榜的详细列表信息热榜的热度信息以及热榜对应的答复信息classZhihuDetails(db.Model):_tablename_ZhihuDetailsiddb.Column(db.Integer,primary_keyTr
5、ue)hot_iddb.Column(db.String(32),uniqueTrue,indexTrue)hot_namedb.Column(db.Text)hot_linkdb.Column(db.String(64)hot_cardiddb.Column(db.String(32)classZhihuMetrics(db.Model):_tablename_ZhihuMetricsiddb.Column(db.Integer,primary_keyTrue)hot_metricsdb.Column(db.String(64)hot_cardiddb.Column(db.String(32
6、),indexTrue)update_timedb.Column(db.DateTime)classZhihuContent(db.Model):_tablename_ZhihuContentiddb.Column(db.Integer,primary_keyTrue)answer_iddb.Column(db.Integer,indexTrue)authordb.Column(db.String(32),indexTrue)voteup_countdb.Column(db.Integer)comment_countdb.Column(db.Integer)reward_infodb.Colu
7、mn(db.Integer)contentdb.Column(db.Text)定时任务由于我们需要定时查询热榜列表以及热榜的热度值所以这里需要定时运行相关的任务使用插件flask_apscheduler来做定时任务我们的定时任务涉及到了网络恳求以及数据入库的操作把这局部定时任务代码单独拉出来在Flask工程的根目录下创立一个文件apschedulerjob.py由于在运行该文件时是没有Flaskapp变量的所以我们需要手动调用app_context()方法来创立app上下文defopera_db():withscheduler.app.app_context():.当然这里的scheduler
8、变量是在create_app中初始化过的fromflask_apschedulerimportAPSchedulerschedulerAPScheduler()defcreate_app(config_name):appFlask(_name_)app.config.from_object(configconfig_name)configconfig_name.init_app(app)db.init_app(app)scheduler.init_app(app).接着我们就可以根据前面的两个爬虫函数来分别入库数据了入库热榜热度数据update_metricsZhihuMetrics(hot_
9、metricsitargetmetricsAreatext,hot_cardidicardId,update_timedatetime.datetime.now()入库热榜列表数据new_detailsZhihuDetails(hot_idiid,hot_nameitargettitleAreatext,hot_linkitargetlinkurl,hot_cardidicardId)入库热榜答复数据new_contentZhihuContent(answer_idanswer_id,authoranswerauthor,voteup_countanswervoteup_count,comme
10、nt_countanswercomment_count,reward_infoanswerreward_info,contentanswercontent)最后我们就可以在Flask的入口程序中启动定时任务了importosfromappimportcreate_app,schedulerappcreate_app(os.getenv(FLASK_CONFIG)ordefault)if_name_main_:scheduler.start()app.run(debugTrue)编写API热榜列表API我们首先来做热榜列表的接口在数据库表ZhihuMetrics中拿到当天热榜的最新热度信息然后再
11、根据热榜热度信息来获取对应的列表信息可以总结到如下的一个函数中defzhihudata():current_time%s-%s-%s00:00:00%(datetime.now().year,datetime.now().month,datetime.now().day,)zhihumetrics_dataZhihuMetrics.query.filter(ZhihuMetrics.update_timecurrent_time).group_by(ZhihuMetrics.hot_cardid).order_by(ZhihuMetrics.update_time).all()metrics_
12、listdb_opera.db_to_list(zhihumetrics_data)details_listfordinmetrics_list:zhihudetails_dataZhihuDetails.query.filter_by(hot_cardidd1).first()details_list.append(zhihudetails_data.hot_name,zhihudetails_data.hot_link,d0,d1,d2)returndetails_list接着定义一个视图函数返回json数据api.route(/api/zhihu/hot/)defzhihu_api_da
13、ta():zhihu_datazhihudata()data_listfordatainzhihu_data:data_dicttitle:data0,link:data1,metrics:data2,hot_id:data3,update_time:data4data_list.append(data_dict)returnjsonify(code:0,content:data_list),200热榜详情API下面再来做热榜详情接口该接口可以返回热榜热度走势信息为前端画图提供数据。defzhihudetail(hot_id):zhihumetrics_detailsZhihuMetrics.
14、query.filter_by(hot_cardidhot_id).order_by(ZhihuMetrics.update_time).all()Columncategories:,series:name:热度走势,data:foriinzhihumetrics_details:Columncategories.append(datetime.strftime(i.update_time,%Y-%m-%d%H:%M)Columnseries0data.append(int(i.hot_metrics.split()0)returnColumnapi.route(/api/zhihu/deta
15、il/id/)defzhihu_api_detail(id):zhihu_detailzhihudetail(id)returnjsonify(code:0,data:zhihu_detail),200接入小程序对于小程序端我们这里使用了uni-app框架这是一个可以一份代码多端运行的框架还是比拟不错的。创立工程首先通过IDEHBuilder创立一个uni-app模板改造工程我们简单改造下该模板首先修改下index.nvue文件把tabList修改如下data()returntabList:id:tab01,name:知乎热榜,newsid:0,id:tab02,name:微博热榜,newsi
16、d:23,我们暂时只保存两个tab页签没错后面还要再做微博的热榜接下来翻开news-page.nvue文件修改网络恳求地址uni.request(url:/127.0.0.1:5000/api/zhihu/hot/,data:,把URL地址指向我们自己的API效劳地址然后再添加我们自己的新闻参数hot_id:news.hot_id,metrics:news.metrics,news_url:news.link再修改函数goDetail如下goDetail(detail)if(this.navigateFlag)return;this.navigateFlagtrue;uni.navigateT
17、o(url:/pages/detail/detail-new?queryencodeURIComponent(JSON.stringify(detail);setTimeout()this.navigateFlagfalse;,200),点击每条热榜时就会跳转到url对应的/pages/detail/detail-new页面引入uCharts下面编写detail-new.nvue文件这里主要用到了uni-app的插件uCharts。这是一个高性能的跨端图表插件非常好用。template局部templateviewclassqiun-columnsviewclassqiun-bg-whiteqi
18、un-title-barqiun-common-mtviewclassqiun-title-dot-light柱状热力分布/view/viewviewclassqiun-chartscanvascanvas-idcanvasColumnidcanvasColumnclasschartstouchstarttouchColumn/canvas/viewviewclassqiun-bg-whiteqiun-title-barqiun-common-mtviewclassqiun-title-dot-light线性走势/view/viewviewclassqiun-chartscanvascanva
19、s-idcanvasLineidcanvasLineclasschartstouchstarttouchColumn/canvas/view/view/template创立两个view分别用于展示柱状图以及折线图再编写script局部getServerData()uni.request(url:/127.0.0.1:5000/api/zhihu/detail/this.details.hot_id,data:,success:function(res)_self.serverDatares.data.data;letColumncategories:,series:;Column.catego
20、riesres.data.data.categories;Column.seriesres.data.data.series;_self.showColumn(canvasColumn,Column);_self.showLine(canvasLine,Column);,fail:()_self.tips网络错误小程序端请检查合法域名,);再根据uCharts的官方文档编写对应的展示图表函数showColumn(canvasId,chartData)canvaColumnnewuCharts($this:_self,canvasId:canvasId,type:column,legend:sh
21、ow:true,fontSize:11,background:#FFFFFF,pixelRatio:_self.pixelRatio,animation:true,categories:chartData.categories,series:chartData.series,enableScroll:true,xAxis:disableGrid:true,scrollShow:true,itemCount:4,yAxis:/disabled:true,dataLabel:true,width:_self.cWidth*_self.pixelRatio,height:_self.cHeight*_self.pixelRatio,extra:column:type:group,width:_self.cWidth*_self.pixelRatio*0.45/chartData.categories.length);这样我们就完成了根本的工程开发我们可以到小程序的模拟器来查看效果啦热榜列表页面热榜详情页面根本的效果是有了不过还有很多需要优化的地方下一次我会共享出优化后的代码和怎样把API效劳部署到云端同时还是提供出供大众练习的API不要错过哦往期回顾资讯活体人脑细胞5分钟学会打游戏资讯资讯技术共享点珍藏点点赞点在看
限制150内