文档章节

Android 利用WebViewJavascriptBridge 实现js和java的交互(一)

丁佳辉
 丁佳辉
发布于 2017/07/13 12:13
字数 2653
阅读 8
收藏 0
点赞 0
评论 0

      此文出自:http://blog.csdn.net/sk719887916/article/details/47189607,skay

    按安卓开发目前现状来说,开发者大部分时间还是花在UI的屏幕适配上,使用原生控件开发成本已不是那么理想,鉴于很多项目和iOS基于一致的ui界面,至使安卓UI开发成本花费更大的代价,因此目前结合HTML5和原生控件是解决UI适配的一种很好的选择,处于APP性能也会用Java和native层进行结合。不管是哪种结合,其实原理都差不多,只要按照它的协议来,是很容易的,今天我们仅对于Html和Java层结合,学习下WebViewJavascriptBridge。

 

    已经熟悉了jsbridge的朋友直接移步:

《Android基于JsBridge封装的高效带加载进度的WebView》:http://blog.csdn.net/sk719887916/article/details/52402470

一 什么是webViewjavascripBridge?

       WebViewJavascriptBridge是移动UIView和Html交互通信的桥梁,用作者的话来说就是实现java(ios为oc)和js的互相调用的桥梁。替代了WebView的自带的JavascriptInterface的接口,使得我们的开发更加灵活和安全。

 

 二 为什么要用webViewjavascripBridge?

     

    对于安卓开发有一段时间的人来说,知道安卓4.4以前谷歌的webview存在安全漏洞,网站可以通过js注入就可以随便拿到客户端的重要信息,甚至轻而易举的调用本地代码进行流氓行为,谷歌后来发现有此漏洞后,增加了防御措施,如果要是js调用本地代码,开发者必须在代码申明JavascriptInterface,

   列如在4.0之前我们要使得webView加载js只需如下代码:

  [java] view plain copy

 print?

  1. mWebView.addJavascriptInterface(new JsToJava(), "myjsfunction");    

 

 

     4.4之后调用需要在调用方法加入加入@JavascriptInterface注解,如果代码无此申明,那么也就无法使得js生效,也就是说这样就可以避免恶意网页利用js对安卓客户端的窃取和攻击。

        但是即使这样,我们很多时候需要在js记载本地代码的时候,要做一些判断和限制,或者有可能也会做些过滤和对用户友好提示,因此JavascriptInterface也就无法满足我们的需求了,特此有大神就写出了WebViewJavascriptBridge框架。

     

 

 

三 怎么使用webViewjavascripBridge

 

   1 将jsBridge.jar引入到我们的工程

          Eclispe

         

           导入jar包, 或者直接copyjar源码, jar可以到gitHub上下载。

 

        Android Studio: 

             

repositories {
    // ...
    maven { url "https://jitpack.io" }
}

dependencies {
    compile 'com.github.lzyzsd:jsbridge:1.0.4'
}

 

     2 WebView包需使用以上包的webView

 

              Layout中使用第三方webView

       EG:

             [html] view plain copy

 print?

  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     android:layout_width="match_parent"  
  4.     android:layout_height="match_parent"  
  5.     android:orientation="vertical" >  
  6.   
  7.     <!-- button 演示Java调用web -->  
  8.     <Button   
  9.         android:id="@+id/button"  
  10.         android:layout_width="match_parent"  
  11.         android:text="@string/button_name"  
  12.         android:layout_height="48dp"  
  13.         />  
  14.       
  15.     <!-- webview 演示web调用Java -->  
  16.     <com.github.lzyzsd.jsbridge.BridgeWebView  
  17.         android:id="@+id/webView"  
  18.         android:layout_width="match_parent"  
  19.         android:layout_height="match_parent" >  
  20.      </com.github.lzyzsd.jsbridge.BridgeWebView>  
  21.   
  22. </LinearLayout>  

  3 Java代码

      1 activity[java] view plain copy

 print?

  1. public class MainActivity extends Activity implements OnClickListener {  
  2.   
  3.     private final String TAG = "MainActivity";  
  4.   
  5.     BridgeWebView webView;  
  6.   
  7.     Button button;  
  8.   
  9.     int RESULT_CODE = 0;  
  10.   
  11.     ValueCallback<Uri> mUploadMessage;  
  12.   
  13.     static class Location {  
  14.         String address;  
  15.     }  
  16.   
  17.     static class User {  
  18.         String name;  
  19.         Location location;  
  20.         String testStr;  
  21.     }  
  22.   
  23.     @Override  
  24.     protected void onCreate(Bundle savedInstanceState) {  
  25.         super.onCreate(savedInstanceState);  
  26.         setContentView(R.layout.activity_main);  
  27.   
  28.         webView = (BridgeWebView) findViewById(R.id.webView);  
  29.   
  30.         button = (Button) findViewById(R.id.button);  
  31.   
  32.         button.setOnClickListener(this);  
  33.   
  34.         webView.setDefaultHandler(new DefaultHandler());  
  35.   
  36.         webView.setWebChromeClient(new WebChromeClient() {  
  37.   
  38.             @SuppressWarnings("unused")  
  39.             public void openFileChooser(ValueCallback<Uri> uploadMsg, String AcceptType, String capture) {  
  40.                 this.openFileChooser(uploadMsg);  
  41.             }  
  42.   
  43.             @SuppressWarnings("unused")  
  44.             public void openFileChooser(ValueCallback<Uri> uploadMsg, String AcceptType) {  
  45.                 this.openFileChooser(uploadMsg);  
  46.             }  
  47.   
  48.             public void openFileChooser(ValueCallback<Uri> uploadMsg) {  
  49.                 mUploadMessage = uploadMsg;  
  50.                 pickFile();  
  51.             }  
  52.         });  
  53.         //加载本地网页  
  54.   
  55.         //webView.loadUrl("file:///android_asset/demo.html");  
  56.         //加载服务器网页  
  57.         webView.loadUrl("https://www.baidu.com");  
  58.   
  59.         //必须和js同名函数,注册具体执行函数,类似java实现类。  
  60.         webView.registerHandler("submitFromWeb", new BridgeHandler() {  
  61.   
  62.             @Override  
  63.             public void handler(String data, CallBackFunction function) {  
  64.   
  65.                 String str ="这是html返回给java的数据:" + data;  
  66.                 // 例如你可以对原始数据进行处理  
  67.                 makeText(MainActivity.this, str, LENGTH_SHORT).show();  
  68.   
  69.                 Log.i(TAG, "handler = submitFromWeb, data from web = " + data);  
  70.                 function.onCallBack( str + ",Java经过处理后截取了一部分:"+ str.substring(0,5));  
  71.             }  
  72.   
  73.         });  
  74.         //模拟用户获取本地位置  
  75.         User user = new User();  
  76.         Location location = new Location();  
  77.         location.address = "上海";  
  78.         user.location = location;  
  79.         user.name = "Bruce";  
  80.   
  81.         webView.callHandler("functionInJs", new Gson().toJson(user), new CallBackFunction() {  
  82.             @Override  
  83.             public void onCallBack(String data) {  
  84.                 makeText(MainActivity.this, "网页在获取你的位置", LENGTH_SHORT).show();  
  85.   
  86.             }  
  87.         });  
  88.   
  89.         webView.send("hello");  
  90.   
  91.     }  
  92.   
  93.     public void pickFile() {  
  94.         Intent chooserIntent = new Intent(Intent.ACTION_GET_CONTENT);  
  95.         chooserIntent.setType("image/*");  
  96.         startActivityForResult(chooserIntent, RESULT_CODE);  
  97.     }  
  98.   
  99.     @Override  
  100.     protected void onActivityResult(int requestCode, int resultCode, Intent intent) {  
  101.         if (requestCode == RESULT_CODE) {  
  102.             if (null == mUploadMessage){  
  103.                 return;  
  104.             }  
  105.             Uri result = intent == null || resultCode != RESULT_OK ? null : intent.getData();  
  106.             mUploadMessage.onReceiveValue(result);  
  107.             mUploadMessage = null;  
  108.         }  
  109.     }  
  110.   
  111.     @Override  
  112.     public void onClick(View v) {  
  113.         if (button.equals(v)) {  
  114.             webView.callHandler("functionInJs", "data from Java", new CallBackFunction() {  
  115.   
  116.                 @Override  
  117.                 public void onCallBack(String data) {  
  118.                     // TODO Auto-generated method stub  
  119.                     Log.i(TAG, "reponse data from js " + data);  
  120.                 }  
  121.   
  122.             });  
  123.         }  
  124.   
  125.     }  
  126.   
  127. }  

2 自定webVIewClient

 

[java] view plain copy

 print?

  1. class MyWebViewClient extends BridgeWebViewClient{  
  2.   
  3.         public MyWebViewClient(BridgeWebView webView) {  
  4.             super(webView);  
  5.         }  
  6.     }  

 

   将自定义webViewClient设置到webview上    [java] view plain copy

 print?

  1. mWebView.setWebViewClient(new MyWebViewClient(mWebView));  


   上面句话很关键:
 

      

      通过实例化webView,用法和安卓原生的view没多大区别,设置WebChromClient, 设置加载的html(同样支持网络和本地文件),接着我们需要给web注册和html端约定好的js方法名。代码列举的submitFromweb和js的执行的方法名一致,玩过NDK的JNI调用的朋友也知道必须和c代码之间有个约定,其实js桥和jni有点类似,

 

通过注册handler来实现回调,Java代码中通过js返回的数据,进行处理后在调用function.onCallback返回给js.这里不做过多解释

 

[java] view plain copy

 print?

  1. //必须和js函数同名,注册具体执行回调函数,类似java实现类。  
  2.         webView.registerHandler("submitFromWeb", new BridgeHandler() {  
  3.   
  4.             @Override  
  5.             public void handler(String data, CallBackFunction function) {  
  6.   
  7.                 String str ="这是html返回给java的数据:" + data;  
  8.                 // 例如你可以对原始数据进行处理  
  9.                 makeText(MainActivity.this, str, LENGTH_SHORT).show();  
  10.   
  11.                 Log.i(TAG, "handler = submitFromWeb, data from web = " + data);  
  12.                 function.onCallBack( str + ",Java经过处理后截取了一部分:"+ str.substring(0,5));  
  13.             }  
  14.   
  15.         });  


     如果是webview刚开始就执行一段Java代码 ,可以通过webView.CallHandler()来实现 。当然我们注册的方法也要和js里面的方法名一致。

      [java] view plain copy

 print?

  1. webView.callHandler("functionInJs", new Gson().toJson(user), new CallBackFunction() {  
  2.            @Override  
  3.            public void onCallBack(String data) {  
  4.             makeText(MainActivity.this, "网页在获取你的位置", LENGTH_SHORT).show();  
  5.   
  6.            }  
  7.        });  

 

  3 Html和js实现

         html代码如下,效果图

 

 

    [html] view plain copy

 print?

  1. <html>  
  2.     <head>  
  3.         <meta content="text/html; charset=utf-8" http-equiv="content-type">  
  4.         <title>  
  5.             js调用java  
  6.         </title>  
  7.     </head>  
  8.       
  9.     <body>  
  10.         <p>  
  11.             <xmp id="show">  
  12.             </xmp>  
  13.         </p>  
  14.         <p>  
  15.             <xmp id="init">  
  16.             </xmp>  
  17.         </p>  
  18.         <p>  
  19.             <input type="text" id="text1" value="用户名(username)" />  
  20.         </p>  
  21.         <p>  
  22.             <input type="text" id="text2" value="password" />  
  23.         </p>  
  24.         <p>  
  25.             <input type="button" id="enter" value="发消息给Native" onclick="testClick();"  
  26.             />  
  27.         </p>  
  28.         <p>  
  29.             <input type="button" id="enter1" value="调用Native方法" onclick="testClick1();"  
  30.             />  
  31.         </p>  
  32.         <p>  
  33.             <input type="button" id="enter2" value="显示html" onclick="testDiv();" />  
  34.         </p>  
  35.         <p>  
  36.             <input type="file" value="打开文件"  />  
  37.         </p>  
  38.     </body>  
  39.       
  40. </html>  

 

  js代码

 

    [javascript] view plain copy

 print?

  1. <script>  
  2.   
  3.        function testDiv() {  
  4.            document.getElementById("show").innerHTML = document.getElementsByTagName("html")[0].innerHTML;  
  5.        }  
  6.   
  7.        function testClick() {  
  8.            var str1 = document.getElementById("text1").value;  
  9.            var str2 = document.getElementById("text2").value;  
  10.   
  11.            //发送消息给java代码  
  12.            var data = "name=" + str1 + ",pass=" + str2;  
  13.   
  14.            window.WebViewJavascriptBridge.send(  
  15.                data  
  16.                , function(responseData) {  
  17.   
  18.                    document.getElementById("show").innerHTML = "repsonseData from java, data = " +responseData  
  19.                }  
  20.            );  
  21.   
  22.        }  
  23.   
  24.        function testClick1() {  
  25.            var str1 = document.getElementById("text1").value;  
  26.            var str2 = document.getElementById("text2").value;  
  27.   
  28.            //调用本地java方法  
  29.            window.WebViewJavascriptBridge.callHandler(  
  30.                'submitFromWeb'  
  31.                , {'param': str1}  
  32.                , function(responseData) {  
  33.                    document.getElementById("show").innerHTML = "send get responseData from java, data = " + responseData  
  34.                }  
  35.            );  
  36.        }  
  37.   
  38.        function bridgeLog(logContent) {  
  39.            document.getElementById("show").innerHTML = logContent;  
  40.        }//注册事件监听  
  41.        function connectWebViewJavascriptBridge(callback) {  
  42.            if (window.WebViewJavascriptBridge) {  
  43.                callback(WebViewJavascriptBridge)  
  44.            } else {  
  45.                document.addEventListener(  
  46.                    'WebViewJavascriptBridgeReady'  
  47.                    , function() {  
  48.                        callback(WebViewJavascriptBridge)  
  49.                    },  
  50.                    false  
  51.                );  
  52.            }  
  53.        }  
  54.        //注册回调函数,第一次连接时调用 初始化函数  
  55.        connectWebViewJavascriptBridge(function(bridge) {  
  56.            bridge.init(function(message, responseCallback) {  
  57.                console.log('JS got a message', message);  
  58.                var data = {  
  59.                    'Javascript Responds': 'Wee!'  
  60.                };  
  61.                console.log('JS responding with', data);  
  62.                responseCallback(data);  
  63.            });  
  64.   
  65.            bridge.registerHandler("functionInJs", function(data, responseCallback) {  
  66.                document.getElementById("show").innerHTML = ("data from Java: = " + data);  
  67.                var responseData = "Javascript Says Right back aka!";  
  68.                responseCallback(responseData);  
  69.            });  
  70.        })  
  71.    </script>  

 

      这段代码不难理解,我们对上面的id为enter的Button注册了一个点击事件,点击后执行以下testClick()方法,依次类推,其他Button注册事件相同,

 

     当点击“发消息给Native”的按钮时,Js通过webWiew的jsBridage.send()发送一条数据给java层(密码和用户名),同时在此用function()来执行应java层回调函数的。此demo中是把java返回的数据插入到"show"的div里面去。

   

testClick1():此方法中调用callHandler来调用Java代码的submitFromweb同名函数,可以结合上面的Activty的代码理解下,此函数调用我们已在java注册实现好的

   

[java] view plain copy

 print?

  1. //必须和js同名函数,注册具体执行函数,类似java实现类。  
  2.         webView.registerHandler("submitFromWeb", new BridgeHandler() {  
  3.   
  4.             @Override  
  5.             public void handler(String data, CallBackFunction function) {  
  6.   
  7.                 String str ="这是html返回给java的数据:" + data;  
  8.                 // 例如你可以对原始数据进行处理  
  9.                 makeText(MainActivity.this, str, LENGTH_SHORT).show();  
  10.   
  11.                 Log.i(TAG, "handler = submitFromWeb, data from web = " + data);  
  12.                 function.onCallBack( str + ",Java经过处理后截取了一部分:"+ str.substring(0,5));  
  13.             }  
  14.   
  15.         });  

 

     java注册Js函数如上面列子 ,那么在js中注册方法来注册呢,

    在js中我们同样可以直接注册一个回调函数,通过 bridge.registerHandler()来注册,接着调用 responseCallback(responseData)来返回数据给java代码的同名函数。f

也可以直接调用init()来指定网页首次加载上面注册java代码。

  

[java] view plain copy

 print?

  1. connectWebViewJavascriptBridge(function(bridge) {  
  2.           bridge.init(function(message, responseCallback) {  
  3.               console.log('JS got a message', message);  
  4.               var data = {  
  5.                   'Javascript Responds': 'Wee!'  
  6.               };  
  7.               console.log('JS responding with', data);  
  8.               responseCallback(data);  
  9.           });  
  10.   
  11.           bridge.registerHandler("functionInJs", function(data, responseCallback) {  
  12.               document.getElementById("show").innerHTML = ("data from Java: = " + data);  
  13.               var responseData = "Javascript Says Right back aka!";  
  14.               responseCallback(responseData);  
  15.           });  
  16.       })  

 

 

四 总结

  

   

通过以上的API介绍,代码示例,不难发现此框架的优雅和简便,对js和java双方来说,如果Html中的js需要调用java代码,而java代码没做任何实现,那么js中方法也是无效的,反之java代码注册的函数,没在js里去回调实现,那么Java层也是无法获取js中数据的,由此可见,此通信是双方支持的,必须由双方来约定,这样就避免了Android之前存在的js注入漏洞,也很大的提高了安全性,也可以保证我们的网页数据不被第三方的APP获取,具体来讲,列如我们的项目某一个web的h5界面,被系统浏览器或者其他第三方App的恶意加载,那么它的java代码想调用你的js函数,实现需要你的H5的Js先注册,不然跟本无法调用你的h5信息。这样保证了这个html数据的安全性,,第三方的浏览器可以加载预览你的网页,但是第三方java无法和你的的h5中的js交互通信的。同样加载我们自己的APP加载第三方的网页时候,我们可以对第三方网页进行一些行为的过滤,方便保护我们手机的安全,列如第三方可以获取本机地址时我们可以提示用户授权。虽然H5并不属于插件的一种,但是借助h5我可以方便的去更新一些运营活动,和某些需要经常需要更换UI的业务功能的地方,以上只JSBridge的使用姿势,,以后再给大家解剖下JsBridge的内部实现。

 

 

jsbridage的封装请参考: <Android基于JsBridge封装的高效带加载进度的WebView>

 

本文转载自:http://blog.csdn.net/sk719887916/article/details/47189607

共有 人打赏支持
丁佳辉
粉丝 18
博文 401
码字总数 195396
作品 0
浦东
程序员
iOS下JS与OC互相调用(六)--WKWebView + WebViewJavascriptBridge

iOS下JS与OC互相调用(六)--WKWebView + WebViewJavascriptBridge 转载:原地址 https://www.jianshu.com/p/e951af9e5e74 上一篇文章介绍了UIWebView 如何通过WebViewJavascriptBridge 来实现......

法斗斗
05/11
0
0
iOS一些代码的取巧写法总结(二)

一、在xib/storyboard里面设置view圆角半径 在xib/storyboard里面设置view圆角半径 神奇的IB_DESIGNABLE和IBInspectable(xib中设置圆角) 二、push pop 动画突然消失的解决方案 产生的原因是动...

朝雨晚风
2016/12/05
0
0
IOS下WEBVIEW 的javascript数组与json定义 及交互

最近在折腾IOS新闻浏览客户端,当中需要用到webview传递JSON数据到IOS上,然后在IOS上解析。刚入门IOS不久,看了不少的书,但都是囫囵吞枣。在开发过程中,遇到不少问题。 开发环境 mac mini...

GIFCOOL
2013/08/20
0
0
Objective-C与Javascript相互通信的中间件

git地址:http://git.oschina.net/feiji1hao/NZOCJSBridge 项目是为混合开发提供Objective-C与Javascript通信的中间件 只需将目录NZOCJSBridge拷贝到自己项目中,项目中自带Demo,使用前请熟...

nerozhao
2015/06/24
0
0
Android WebView的Js对象注入漏洞解决方案

最近在做一个项目过程中,发现了一个很严重的安全漏洞,这个漏洞是乌云平台(http://www.wooyun.org)报告出来的。 1,使用场景 我们很多时候要使用WebView来展示一个网页,现在很多应用为了...

嘻哈开发者
2014/08/25
0
0
WebView 和JS 之间交互

1.android中利用webview调用网页上的js代码。 Android 中可以通过webview来实现和js的交互,在程序中调用js代码,只需要将webview控件的支持js的属性设置为true,,然后通过loadUrl就可以直接...

GuoKai
2012/09/13
0
1
Android提供了一个很强大的WebView控件用来处理Web网页,而在网页中,JavaScrip

Android提供了一个很强大的WebView控件用来处理Web网页,而在网页中,JavaScript又是一个很举足轻重的脚本。本文将介绍如何实现Java代码和Javascript代码的相互调用。 如何实现 实现Java和j...

SuShine
2015/07/06
0
0
Android中WebView实现Javascript调用Java类方法

为了方便网页和Android应用的交互,Android系统提供了WebView中JavaScript网页脚本调用Java类方法的机制。只要调用addJavascriptInterface方法即可映射一个Java对象到JavaScript对象上。 1、...

Dean83
2012/06/28
0
0
android webview js交互,响应webview图片的响应事件

方案思路, 1.在点击图片的时候调用本地的java方法并给出响应的图片地址 2.本地获得图片地址后,开启一个遮罩activity进行显示和处理 第二步的实现很容易实现,关键是第一步的实现,在网页中...

sundy_ly
2013/12/28
0
0
Android中WebView实现Javascript调用Java类方法[转]

为了方便网页和Android应用的交互,Android系统提供了WebView中JavaScript网页脚本调用Java类方法的机制。只要调用addJavascriptInterface方法即可映射一个Java对象到JavaScript对象上。 1、...

kut
2012/05/17
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

JPA @MappedSuperclass 注解说明

基于代码复用和模型分离的思想,在项目开发中使用JPA的@MappedSuperclass注解将实体类的多个属性分别封装到不同的非实体类中。 1.@MappedSuperclass注解只能标准在类上:@Target({java.lang....

海博1600
11分钟前
0
0
Scala Configuration 相关API

Play使用了 Typesafe config library,但是也提供了一个有着更多Scala高级特性的的 Configuration 封装。不熟悉Typesafe配置的开发者可以移步 configuration文件的语法和特性文档。 读取配置...

Landas
今天
1
0
使用cookie技术 记住账号

1. 效果 2. 实现过程 2.1 前端 将用户的选中传递给后台 这个参数的获取是 参考:https://my.oschina.net/springMVCAndspring/blog/1860498 // var rememberLogin = $("#rememberLoginId").i...

Lucky_Me
今天
1
0
《趣谈网络协议》02之网络分层的真实含义

一、提出问题 1.提出问题 当你听到什么二层设备、三层设备、四层 LB 和七层 LB 中层的时候,是否有点一头雾水,不知道这些所谓的层,对应的各种协议具体要做什么“工作”? 2.这四个问题你弄...

aibinxiao
今天
2
0
Python3学习日志二 Python中的集合set和字典dict

1.集合set 定义一个集合set 我们可以看到定义集合set有两种不同的形式,如果要定义一个空的集合set不能用{}而是要用set();另外,集合是无序的,而且set中的元素是不可重复的,如果你定义了一...

Mr_bullshit
今天
0
0
adb 操作指令详解

ADB,即 Android Debug Bridge,它是 Android 开发/测试人员不可替代的强大工具,也是 Android 设备玩家的好玩具。 注:有部分命令的支持情况可能与 Android 系统版本及定制 ROM 的实现有关。...

孟飞阳
今天
0
0
nodejs安装以及环境配置(很好的node安装和配置文章,少走很多弯路)

一、安装环境 1、本机系统:Windows 10 Pro(64位) 2、Node.js:v6.9.2LTS(64位) 二、安装Node.js步骤 1、下载对应你系统的Node.js版本:https://nodejs.org/en/download/ 2、选安装目录进...

sprouting
今天
1
0
Redisson

了解了Redisson,发现使用挺简单的,接下来准备深入学习一下。 Redisson介绍 Redisson是架设于Redis基础之上的一个Java驻内存数据网格(In-Memory Data Grid) Redisson在基于NIO的Netty框架上...

to_ln
今天
0
0
python有哪些好玩的应用实现,用python爬虫做一个二维码生成器

python爬虫不止可以批量下载数据,还可以有很多有趣的应用,之前也发过很多,比如天气预报实时查询、cmd版的实时翻译、快速浏览论坛热门帖等等,这些都可以算是爬虫的另一个应用方向! 今天给...

python玩家
今天
0
0
python爬虫日志(3)-爬去异步加载网页

在浏览器检查元素页面中,选取Network中的XHR选项即可观察每次加载页面,网页发出的请求,观察url的规律即可利用封装的函数对每一页进行爬取。

茫羽行
今天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部