美文网首页
jsoup+okhttp实现网页搜索表单的爬取

jsoup+okhttp实现网页搜索表单的爬取

作者: A然后呢 | 来源:发表于2020-07-03 19:56 被阅读0次

jsoup可以爬取静态页面,不能爬取动态加载的页面,
为了能爬取搜索功能,本来的思路是,通过HttpUnit结合jsoup 往表单添加数据,然后虚拟点击,实现请求,因为我这个功能是打算在Android端用的,经过查阅资料发现Android端不能用HttpUnit,并且也没有HttpUnit的替代品,然后放弃此方案

分析网页发现表单提交指向的路径action="/index.php/vod/search.html
通过点击按钮进行post提交,key=wd


image.png

通过okhttp进行post请求,模拟网页进行搜索,然后拿到网页html信息

 OkHttpClient okHttpClient = new OkHttpClient();               //创建 okhttp对象
        Request.Builder builder = new Request.Builder();      //创建请求对象
        FormBody.Builder builder1 = new FormBody.Builder();  //创建表单请求体
        builder1.add("wd", soso);                                      //添加键值   =搜索的内容
        builder1.add("page", (page++) + "");                   //添加键值   =页数

        Request build = builder.url(url)               //完成请求对象
                .post(builder1.build())
                .build();
        Call call = okHttpClient.newCall(build);         //拿到call对象
        call.enqueue(new Callback() {                     //进行异步请求
            @Override
            public void onFailure(Call call, IOException e) {   //失败
                Log.e("结果====", "失败");
            }

            @Override
            public void onResponse(Call call, Response response) throws IOException {  //成功
                String string = response.body().string();     //从body里获取请求到html内容
                Log.e("内容====", string);
                Document parse = Jsoup.parse(string);          //用jsoup解析字符串
                //通过类名查找标签
                  Elements elementsByClass = parse.getElementsByClass("stui-vodlist__thumb lazyload");  
                for (Element em : elementsByClass
                ) {    //爬取需要的内容
                    String title = em.attr("title");//data-original 
                    String image = em.attr("data-original");
                    String href = em.attr("href");  //获得点击播放的地址

                    DataBean dataBean = new DataBean(title, image, href);
                    arrayList.add(dataBean);

                    runOnUiThread(new Runnable() {
                        @Override
                        public void run() {   //去主线程刷新 UI
                            adapter_rec2.notifyDataSetChanged();
                            adapter_rec2.loadMoreComplete();
                        }
                    });

                    Log.e("内容====", dataBean.toString());
                }
            }
        });

这样就可以模拟进行请求,然后解析出来我们想要的数据

相关文章

网友评论

      本文标题:jsoup+okhttp实现网页搜索表单的爬取

      本文链接:https://www.haomeiwen.com/subject/hzreqktx.html