jquery ajax flask 前后端通讯

灰太狼 2022-06-13 14:38 264阅读 0赞

如题,以自己的博客为例,抓取博客信息,一个api后台服务提供数据,前端服务接收数据并展示

目录结构:

test

|——app

  1. |----\_\_init\_\_.py
  2. |----flaskapp.py(后台服务)

|——blogtest

  1. |----index.html(首页)
  2. |----gettitle.html(标题页)
  3. |----getmian.html(内容页)

|——get_pagenum.py(页码抓取)

|——get_title.py(标题抓取)
|——get_main.py(内容抓取)

|——rest_response.py(返回信息处理)

代码:

抓取部分:

get_pagenum.py:

  1. # -*- coding: utf-8 -*-
  2. #__author__="ZJL"
  3. import requests
  4. from lxml import etree
  5. class GetPageNum(object):
  6. def __init__(self):
  7. self.session = requests.session()
  8. self.headers = {
  9. "Upgrade-Insecure-Requests": "1",
  10. "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36",
  11. "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8",
  12. "Accept-Encoding": "gzip, deflate, sdch",
  13. "Accept-Language": "zh-CN,zh;q=0.8",
  14. }
  15. def get_pagenum(self,resp):
  16. url = "http://blog.csdn.net/u013055678?viewmode=contents"
  17. r = self.session.get(url, headers=self.headers, timeout=30)
  18. html_bodys = etree.HTML(r.content)
  19. pagenum = html_bodys.xpath('//*[@id="papelist"]/span/text()')
  20. if pagenum:
  21. pagenum = pagenum[0].split("共")[1].split("页")[0]
  22. resp.success(pagenum)

get_title.py:

  1. # -*- coding: utf-8 -*-
  2. #__author__="ZJL"
  3. import requests
  4. from lxml import etree
  5. # from rest_response import RestResponse
  6. class TitleGet(object):
  7. def __init__(self):
  8. self.session = requests.session()
  9. self.headers = {
  10. "Upgrade-Insecure-Requests":"1",
  11. "User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36",
  12. "Accept":"text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8",
  13. "Accept-Encoding":"gzip, deflate, sdch",
  14. "Accept-Language":"zh-CN,zh;q=0.8",
  15. }
  16. def get_title(self,pagenum,resp):
  17. data_list=[]
  18. url = "http://blog.csdn.net/u013055678/article/list/"+str(pagenum)
  19. r = self.session.get(url,headers=self.headers,timeout=30)
  20. html_bodys = etree.HTML(r.content)
  21. title_urls = html_bodys.xpath("//span[@class='link_title']/a")
  22. if title_urls:
  23. for title_url in title_urls:
  24. data_dict = {}
  25. url = title_url.xpath("@href")
  26. titletext = title_url.xpath("text()")
  27. if not url and titletext:
  28. continue
  29. url = "http://blog.csdn.net" + url[0].strip()
  30. titletext = titletext[0].strip()
  31. data_dict["url"] = url
  32. data_dict["title"] = titletext
  33. data_list.append(data_dict)
  34. return resp.success(data_list)

get_main.py:

  1. # -*- coding: utf-8 -*-
  2. #__author__="ZJL"
  3. import requests
  4. from lxml import etree
  5. import html
  6. class GetMain(object):
  7. def __init__(self):
  8. self.session = requests.session()
  9. self.headers = {
  10. "Upgrade-Insecure-Requests": "1",
  11. "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36",
  12. "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8",
  13. "Accept-Encoding": "gzip, deflate, sdch",
  14. "Accept-Language": "zh-CN,zh;q=0.8",
  15. }
  16. def get_main(self,url,resp):
  17. r = self.session.get(url, headers=self.headers, timeout=30)
  18. html_bodys = etree.HTML(r.text)
  19. # tree = lxml.html.fromstring(r.text)
  20. # tree = lxml.html.tostring(r.text)
  21. bodys = html_bodys.xpath('//*[@id="article_content"]')
  22. # print((etree.tostring(bodys[0],pretty_print=True)).decode())
  23. html_parser = html.unescape((etree.tostring(bodys[0],pretty_print=True)).decode())
  24. return resp.success(html_parser)

rest_response.py:

  1. # -*- coding: utf-8 -*-
  2. import time
  3. import json
  4. class RestResponse(object):
  5. """
  6. REST请求统一格式返回类,负责返回数据的格式
  7. """
  8. def __init__(self):
  9. self.errCode = 0
  10. self.errMsg = ""
  11. self.acceptAt = time.time() * 1000
  12. self.duration = 0
  13. self.data = {}
  14. def success(self, data):
  15. self.data = data
  16. def error(self, error):
  17. self.errCode = error[0]
  18. self.errMsg = error[1]
  19. def get_json(self):
  20. self.duration = time.time() * 1000 - self.acceptAt
  21. return json.dumps(
  22. {"errCode": self.errCode, "errMsg": self.errMsg, "acceptAt": self.acceptAt, "duration": self.duration,
  23. "data": self.data}, ensure_ascii=False)

后台服务代码:

flaskapp.py:

  1. # -*- coding: utf-8 -*-
  2. #__author__="ZJL"
  3. from flask import Flask
  4. from flask import request
  5. from flask import Response
  6. from get_title import TitleGet
  7. from get_main import GetMain
  8. from get_pagenum import GetPageNum
  9. from rest_response import RestResponse
  10. import json
  11. app = Flask(__name__)
  12. def Response_headers(content):
  13. resp = Response(content)
  14. resp.headers['Access-Control-Allow-Origin'] = '*'
  15. return resp
  16. @app.route('/')
  17. def hello_world():
  18. return Response_headers('hello world')
  19. @app.route('/findTitleList', methods=['POST'])
  20. def findTitleList():
  21. if request.method == 'POST' and request.form['pagenum']:
  22. datax = request.form
  23. print(datax)
  24. # print("zzzzzzzzzz",type(datax))
  25. # print("aaaaaaaaaaa",dict(datax))
  26. # print("zzzzzzzzzz", datax)
  27. pagenum = request.form['pagenum']
  28. tg = TitleGet()
  29. resp = RestResponse()
  30. tg.get_title(pagenum,resp)
  31. content = resp.get_json()
  32. resp = Response_headers(content)
  33. return resp
  34. else:
  35. content = json.dumps({"error_code":"1001"})
  36. resp = Response_headers(content)
  37. return resp
  38. @app.route('/findMain', methods=['POST'])
  39. def findMain():
  40. if request.method == 'POST' and request.form['url']:
  41. url = request.form['url']
  42. gm = GetMain()
  43. resp = RestResponse()
  44. gm.get_main(url,resp)
  45. content = resp.get_json()
  46. content = content
  47. resp = Response_headers(content)
  48. return resp
  49. else:
  50. content = json.dumps({"error_code": "2001"})
  51. resp = Response_headers(content)
  52. return resp
  53. @app.route('/getPagenum', methods=['POST'])
  54. def getPagenum():
  55. if request.method == 'POST':
  56. resp = RestResponse()
  57. gn = GetPageNum()
  58. gn.get_pagenum(resp)
  59. content = resp.get_json()
  60. resp = Response_headers(content)
  61. return resp
  62. else:
  63. content = json.dumps({"error_code": "3001"})
  64. resp = Response_headers(content)
  65. return resp
  66. @app.errorhandler(403)
  67. def page_not_found(error):
  68. content = json.dumps({"error_code": "403"})
  69. resp = Response_headers(content)
  70. return resp
  71. @app.errorhandler(404)
  72. def page_not_found(error):
  73. content = json.dumps({"error_code": "404"})
  74. resp = Response_headers(content)
  75. return resp
  76. @app.errorhandler(400)
  77. def page_not_found(error):
  78. content = json.dumps({"error_code": "400"})
  79. resp = Response_headers(content)
  80. return resp
  81. @app.errorhandler(410)
  82. def page_not_found(error):
  83. content = json.dumps({"error_code": "410"})
  84. resp = Response_headers(content)
  85. return resp
  86. @app.errorhandler(500)
  87. def page_not_found(error):
  88. content = json.dumps({"error_code": "500"})
  89. resp = Response_headers(content)
  90. return resp
  91. if __name__ == '__main__':
  92. app.run(debug=True)#threaded=True,

前端服务:

index.html:

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="utf-8">
  5. <title></title>
  6. <script src="http://cdn.static.runoob.com/libs/jquery/1.10.2/jquery.min.js">
  7. </script>
  8. </head>
  9. <body οnlοad="load()">
  10. <h3>我的blog</h3>
  11. <ul></ul>
  12. </body>
  13. <script>
  14. function load(){
  15. $.ajax({
  16. url:'http://127.0.0.1:5000/getPagenum',
  17. type:'post', //数据发送方式
  18. dataType:'json', //接受数据格式 (这里有很多,常用的有html,xml,js,json)
  19. // data:'pagenum=1', //要传递的数据
  20. error: function(){ //失败
  21. alert('Error loading document');
  22. },
  23. success: function(msg){ //成功
  24. var num = parseInt(msg["data"])
  25. for(var i=1;i<num+1;i++){
  26. $("ul").append($("<li><a href='' id='a"+i+"'>"+i+"</a></li>"));
  27. $('#a'+i).attr('href',"gettitle.html?num="+i);
  28. }
  29. }
  30. });
  31. };
  32. </script>
  33. </html>

gettitle.html:

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="utf-8">
  5. <title>aaaa</title>
  6. <script src="http://cdn.static.runoob.com/libs/jquery/1.10.2/jquery.min.js">
  7. </script>
  8. </head>
  9. <body οnlοad="load()">
  10. <a href="index.html">rturn</a>
  11. <ul>
  12. </ul>
  13. </body>
  14. <script>
  15. var num;
  16. var thisURL = document.URL;
  17. // alert(thisURL);
  18. // alert(thisURL.indexOf("index"));
  19. if(thisURL.indexOf("gettitle")>0){
  20. var getval =thisURL.split("?")[1];
  21. num = getval.split("=")[1];
  22. // alert("aaa"+num);
  23. }else{
  24. num="1";
  25. }
  26. // alert(num)
  27. function load(){
  28. $.ajax({
  29. url:'http://127.0.0.1:5000/findTitleList',
  30. type:'post', //数据发送方式
  31. dataType:'json', //接受数据格式 (这里有很多,常用的有html,xml,js,json)
  32. data:'pagenum='+num, //要传递的数据
  33. error: function(){ //失败
  34. alert('Error loading document');
  35. },
  36. success: function(msg){ //成功
  37. for(var i=0;i<msg["data"].length;i++){
  38. $("ul").append($("<li><a href='' id='a"+i+"'>"+msg["data"][i]["title"]+"</a></li>"));
  39. $('#a'+i).attr('href',"getmian.html?url="+msg["data"][i]["url"]);
  40. }
  41. }
  42. });
  43. };
  44. </script>
  45. </html>

getmian.html:

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="UTF-8">
  5. <title></title>
  6. <script src="http://cdn.static.runoob.com/libs/jquery/1.10.2/jquery.min.js">
  7. </script>
  8. </head>
  9. <body οnlοad="load()">
  10. <a href="gettitle.html">rturn</a>
  11. <div id="blog_main"></div>
  12. </body>
  13. <script>
  14. var thisURL = document.URL;
  15. var getval =thisURL.split("?")[1];
  16. var url = getval.split("=")[1];
  17. // var url = "http://blog.csdn.net/u013055678/article/details/54172693";
  18. function load(){
  19. $.ajax({
  20. url:'http://127.0.0.1:5000/findMain',
  21. type:'post', //数据发送方式
  22. dataType:'json', //接受数据格式 (这里有很多,常用的有html,xml,js,json)
  23. data:'url='+url, //要传递的数据
  24. error: function(){ //失败
  25. alert('Error loading document');
  26. },
  27. success: function(msg){ //成功
  28. $("#blog_main").html(msg["data"]);
  29. }
  30. });
  31. };
  32. </script>
  33. </html>

Center

Center 1

Center 2

发表评论

表情:
评论列表 (有 0 条评论,264人围观)

还没有评论,来说两句吧...

相关阅读