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

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;

}

}

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值