java 爬虫 抓取关键字_爬虫任务二:爬取(用到htmlunit和jsoup)通过百度搜索引擎关键字搜取到的新闻标题和url,并保存在本地文件中(主体借鉴了网上的资料)...-程序员宅基地

技术标签: java 爬虫 抓取关键字  

packagecom.zhaowu.renwu2;importjava.io.BufferedReader;importjava.io.IOException;importjava.io.InputStream;importjava.io.InputStreamReader;importjava.net.MalformedURLException;importjava.net.URL;importorg.jsoup.Jsoup;importorg.jsoup.nodes.Document;importorg.jsoup.nodes.Element;importorg.jsoup.select.Elements;importcom.gargoylesoftware.htmlunit.BrowserVersion;importcom.gargoylesoftware.htmlunit.FailingHttpStatusCodeException;importcom.gargoylesoftware.htmlunit.WebClient;importcom.gargoylesoftware.htmlunit.html.HtmlInput;importcom.gargoylesoftware.htmlunit.html.HtmlPage;public classRenWu {//搜索页数

private static int N = 6;//搜索关键词

private static String keyWord = "爬虫";//第一页搜索结果

private staticHtmlPage firstBaiduPage;//Baidu对应每个搜索结果的第一页第二页第三页等等其中包含“&pn=1”,“&pn=2”,“&pn=3”等等,//提取该链接并处理可以获取到一个模板,用于定位某页搜索结果

private static String template = "";public static voidmain(String[] args) {

goSearch(N, keyWord);

}private static void goSearch(final int n, finalString keyWord) {

Thread thread= new Thread(newRunnable() {public voidrun() {//页数

int x =n;

System.out.println("爬取百度关于关键字“" + keyWord + "”搜索结果的前" + x + "页");

FileUtil.toFile("爬取百度关于关键字“" + keyWord + "”搜索结果的前" + x + "页\n");//1.获取并输出第一页百度查询内容

Elements firstElementsLink = null;try{

firstElementsLink=getFirstPage(keyWord);

}catch(Exception e) {

e.printStackTrace();

}for(Element link : firstElementsLink) {//链接url

String linkHref = link.attr("href");//链接标题

String linkText =link.text();if(linkHref.length() > 13 & linkText.length() > 4) {

String content= "链接url: " + linkHref + "\n\t链接标题: " + linkText + "\n";

System.out.println(content);

FileUtil.toFile(content);

}

}//2.读取第二页及之后页面预处理//以firstBaiduPage作为参数,定义template,即网页格式。

nextHref(firstBaiduPage);//3.获取百度第一页之后的搜索结果

for(int i = 1; i< x; i++) {

System.out.println("\n---------百度搜索关键字“" + keyWord + "”第" + (i + 1) + "页结果------");

FileUtil.toFile("\n---------百度搜索关键字“" + keyWord + "”第" + (i + 1) + "页结果------" + "\n");//根据已知格式修改生成新的一页的链接

String tempURL = template.replaceAll("&pn=1", "&pn=" + i + "");//显示该搜索模板

System.out.println("\t该页地址为:" +tempURL);

RenWu renWu= newRenWu();//实现摘取网页源码

String htmls = renWu.getPageSource(tempURL, "utf-8");//网页信息转换为jsoup可识别的doc模式

Document doc =Jsoup.parse(htmls);//摘取该页搜索链接

Elements links = doc.select("a[data-click]");//该处同上getFirstPage的相关实现

for(Element link : links) {//链接url

String linkHref = link.attr("href");//链接标题

String linkText =link.text();if(linkHref.length() > 13 & linkText.length() > 4) {

String content= "链接url: " + linkHref + "\n\t链接标题: " + linkText + "\n";

System.out.println(content);

FileUtil.toFile(content);

}

}

}

}

});

thread.start();

}publicString getPageSource(String pageURL, String encoding) {//输入:url链接&编码格式//输出:该网页内容

StringBuffer sb = newStringBuffer();try{//构建一URL对象

URL url = newURL(pageURL);//使用openStream得到一输入流并由此构造一个BufferedReader对象

InputStream in =url.openStream();

InputStreamReader ir= newInputStreamReader(in);

BufferedReader br= newBufferedReader(ir);

String line;while((line = br.readLine()) != null) {

sb.append(line);

sb.append("\n");

}

br.close();

}catch(Exception e) {

e.printStackTrace();

}returnsb.toString();

}/** 获取百度搜索第一页内容*/

public static Elements getFirstPage(String keyWord) throwsFailingHttpStatusCodeException, MalformedURLException, IOException {//设置浏览器的User-Agent

WebClient webClient = newWebClient(BrowserVersion.FIREFOX_52);//HtmlUnit对JavaScript的支持不好,关闭之

webClient.getOptions().setJavaScriptEnabled(false);//HtmlUnit对CSS的支持不好,关闭之

webClient.getOptions().setCssEnabled(false);//百度搜索首页页面

HtmlPage htmlPage = webClient.getPage("http://www.baidu.com/");//获取搜索输入框并提交搜索内容(查看源码获取元素名称)

HtmlInput input = htmlPage.getHtmlElementById("kw");//将搜索词模拟填进百度输入框(元素ID如上)

input.setValueAttribute(keyWord);//获取搜索按钮并点击

HtmlInput btn = htmlPage.getHtmlElementById("su");//模拟搜索按钮事件,获取第一页的html内容

firstBaiduPage =btn.click();//将获取到的百度搜索的第一页信息输出//通过page.asXml()来获取百度首页的源代码,//通过page.asTest()来获取页面的文字

String content =firstBaiduPage.asXml().toString();//转换为Jsoup识别的doc格式

Document doc =Jsoup.parse(content);

System.out.println("---------百度搜索关键字“" + keyWord + "”第1页结果--------");

FileUtil.toFile("---------百度搜索关键字“" + keyWord + "”第1页结果--------" + "\n");//返回包含类似等的元素

Elements firstElementsLink = doc.select("a[data-click]");//返回此类链接,即第一页的百度搜素链接

returnfirstElementsLink;

}/** 获取下一页地址*/

public static voidnextHref(HtmlPage firstBaiduPage) {

WebClient webClient= newWebClient(BrowserVersion.FIREFOX_52);

webClient.getOptions().setJavaScriptEnabled(false);

webClient.getOptions().setCssEnabled(false);//获取到百度第一页搜索的底端的页码的html代码

String morelinks = firstBaiduPage.getElementById("page").asXml();//转换为Jsoup识别的doc格式

Document doc =Jsoup.parse(morelinks);//提取这个html中的包含的部分

Elements links = doc.select("a[href]");//设置只取一次每页链接的模板格式

boolean getTemplate = true;for(Element e : links) {//将提取出来的标签中的链接取出

String linkHref = e.attr("href");if(getTemplate) {//补全模板格式

template = "http://www.baidu.com" +linkHref;

getTemplate= false;

}

}

}

}

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_29479087/article/details/115042905

智能推荐

第二章 西门子数控机床采集方案_西门子840dsl 通过opcua读取-程序员宅基地

文章浏览阅读6.8k次,点赞4次,收藏73次。第二章 西门子数控机床采集方案前言一、西门子官方网站介绍二、828D与840D SL介绍三、OPC UA采集方案四、机床端设置4.1 数控软件版本确认4.2 V4.05的OPC UA激活设置4.2.1 设置系统选项4.2.2 设置 MiniWeb 通讯端口的 IP 地址4.2.3 MiniWeb 监控 IP 地址4.2.4 配置启动 MiniWeb 服务4.2.5 重启数控系统4.3 V4.07的OPC UA激活设置4.3.1 设置系统选项4.3.2 设置 MiniWeb 通讯端口的 IP 地址4.3.3 _西门子840dsl 通过opcua读取

初识Mongdb之数据插入篇_mongotemplate.insert 如果表不存在-程序员宅基地

文章浏览阅读2.7k次,点赞9次,收藏8次。目录数据插入数据之源数据导入数据插入方法面向编程插入命令行导入数据脚本多个集群启动(自启动不推荐)小故事(点击查看)数据插入数据之源我们在实际的开发应用之中,数据到底从何而来,是已经准备好的数据源吗?当然不是,如果没有数据就需要你自己去收集(数据挖掘),利用爬虫来解决,最后存储到数据库(MySQL,mongdb,Redis,pandas......),充分利用这些数据库来操作数据,可以达到事半功倍的效果。对于本专栏使用是的数据是随机生成的数据源,便于我们日常学_mongotemplate.insert 如果表不存在

P1918 保龄球_p1918c++-程序员宅基地

文章浏览阅读186次。`map`_p1918c++

基于单片机的加热炉炉温控制系统设计-程序员宅基地

文章浏览阅读3.5k次,点赞7次,收藏41次。但由于输出控制量只有两种状态,使被控参数在两个方向上变化的速率均为最大,因此容易引起反馈回路产生振荡,对自动控制加热炉炉温控制系统会产生十分不利的影响,甚至会因为输出开关的频繁动作而不能满足加热炉炉温控制系统对控制精度的要求。但随着计算机与超大规模集成电路的迅速发展,以现代控制理论和计算机为基础,采用数字控制、显示、A/D与D/A转换,配合执行器与控制阀构成的计算机控制加热炉炉温控制系统,在过程控制过程中得到越来越广泛的应用。由于炉温控制加热炉炉温控制系统的控制对象具有惯性大,连续性的特点。_基于单片机的加热炉炉温控制系统设计

Oracle-----约束简介&非空约束&唯一约束&主键约束-程序员宅基地

文章浏览阅读2.1k次,点赞2次,收藏4次。上一篇????:Oracle-----为表重命名&数据表删除&闪回技术&修改表结构文章目录1、约束简介2、非空约束(not null、nk)2.1 范例1:使用非空约束2.2 范例2:正确地增加语句2.3 范例3:错误地增加语句3、唯一约束(unique、uk)3.1 范例1:使用唯一约束3.2 范例2:正确地增加语句3.3 范例3:错误地增加语句3.4 范例4:查询user...

CamVid数据集(智能驾驶场景的语义分割)_camvid数据集11类别-程序员宅基地

文章浏览阅读3.3k次,点赞2次,收藏7次。前言CamVid 数据集是由剑桥大学公开发布的城市道路场景的数据集。CamVid全称:The Cambridge-driving Labeled Video Database,它是第一个具有目标类别语义标签的视频集合。数据集包 括 700 多张精准标注的图片用于强监督学习,可分为训练集、验证集、测试集。同时, 在 CamVid 数据集中通常使用 11 种常用的类别来进行分割精度的评估,分别为:道路 (Road)、交通标志(Symbol)、汽车(Car)、天空(Sky)、行人道(Sidewalk)、电_camvid数据集11类别

随便推点

阿里云服务器使用教程_新手入门超详细一看就懂_阿里云服务器教程-程序员宅基地

文章浏览阅读8.2k次,点赞12次,收藏201次。阿里云服务器使用教程包括云服务器购买、云服务器配置选择、云服务器开通端口号、搭建网站所需Web环境、安装网站程序、域名解析到云服务器公网IP地址,最后网站上线全流程,阿小云分享阿里云服务器详细使用教程_阿里云服务器教程

浏览器复制粘贴以及手机端webview复制粘贴_华为手机webview 粘贴无数据-程序员宅基地

文章浏览阅读6.1k次,点赞4次,收藏4次。一、浏览器赋值粘贴1、document.execCommand这部分参考文档:https://developer.mozilla.org/zh-CN/docs/Web/API/Document/execCommand咱们再浏览器中使用的复制大部分都是用的这个原理2、例子://这是一个点击方法,放到复制按钮上即可 function copyArticle1() { cons..._华为手机webview 粘贴无数据

Boost中ASIO的一些用法-定时器_boost asio不编译可以用吗-程序员宅基地

文章浏览阅读2.1k次。一、介绍ASIO,基于操作系统的异步机制,可有效避免多线程编程的诸多副作用。目前主要关注于通信方面,使用大量的类封装了socket,提供更高层次的接口二、使用不需要编译,默认不支持SSL,要支持的话需要自己编译OpenSSL。三、用法Sample1、定时器#include #include #include using namespace bo_boost asio不编译可以用吗

c语言编程实现strlen,C语言::模拟实现strlen函数(示例代码)-程序员宅基地

文章浏览阅读750次。编写一个C语言程序模拟实现strlen函数.算法strlen函数功能是计算字符串中字符的个数.(除\0外)而字符串本身就是一个字符数组,只不过末尾以\0结束.因此,我们只需遍历除\0之外的所有字符即可.有三种方法可以解决这个问题.算法总结方法一:设置一个整型计数器,遍历字符串.方法二:通过不断函数自身的递归.方法三:与方法一类似,设置一个char*变量标记字符串尾部,通过指针相减得到字符长度.核心..._c语言实现strlen

P74-前端基础项目开发-首页main部分开发广告栏-项目完整代码_首页广告开发-程序员宅基地

文章浏览阅读904次。P74-前端基础项目开发-首页main部分开发广告栏-项目完整代码1.概述这篇文章是首页开发最后一个部分,也是这个项目的结束部分。通过这个项目练习让我们掌握了HTML+CSS的基础使用。2.广告栏2.1.广告栏需求样式2.2.创建广告栏内容在index.html文件中创建广告栏内容 <!-- 创建广告容器 --> <div class="ad w"> <ul class="shortcut"> <li> _首页广告开发

TS流结构图_现代电视技术中解析ts包头的工作流程图-程序员宅基地

文章浏览阅读2k次。该说真正了解TS,还是看了朋友推荐的《数字电视业务信息及其编码》一书之后,MPEG2 TS和数字电视是紧密不可分割的,值得总结一下其中的一些关系。ISO/IEC-13818-1:系统部分;ISO/IEC-13818-2:视频;ISO/IEC-13818-3:音频;ISO/IEC-13818-4:一致性测试;ISO/IEC-13818-5:软件部分;ISO/IEC-138_现代电视技术中解析ts包头的工作流程图

推荐文章

热门文章

相关标签