百度网页关键字抓取(新闻标题和url,并保存在本地文件中(主体借鉴了网上的资料))
优采云 发布时间: 2021-10-02 07:18百度网页关键字抓取(新闻标题和url,并保存在本地文件中(主体借鉴了网上的资料))
爬虫任务2:爬虫(使用htmlunit和jsoup)通过百度搜索引擎关键词找到的新闻标题和URL,并将其保存在本地文件中(主体从在线材料中吸取经验教训)
采用Maven项目是为了避免到处寻找依赖的jar包
4.0.0
com.zhaowu
pachong01
0.0.1-SNAPSHOT
org.apache.httpcomponents
httpclient
4.5.3
org.jsoup
jsoup
1.11.2
commons-io
commons-io
2.6
org.quartz-scheduler
quartz
2.3.0
cn.edu.hfut.dmic.webcollector
WebCollector
2.71
org.apache.poi
poi
3.17
net.sourceforge.htmlunit
htmlunit
2.29
代码:renwu.class:
package com.zhaowu.renwu2;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.MalformedURLException;
import java.net.URL;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import com.gargoylesoftware.htmlunit.BrowserVersion;
import com.gargoylesoftware.htmlunit.FailingHttpStatusCodeException;
import com.gargoylesoftware.htmlunit.WebClient;
import com.gargoylesoftware.htmlunit.html.HtmlInput;
import com.gargoylesoftware.htmlunit.html.HtmlPage;
public class RenWu {
// 搜索页数
private static int N = 6;
// 搜索关键词
private static String keyWord = "爬虫";
// 第一页搜索结果
private static HtmlPage firstBaiduPage;
// Baidu对应每个搜索结果的第一页第二页第三页等等其中包含“&pn=1”,“&pn=2”,“&pn=3”等等,
// 提取该链接并处理可以获取到一个模板,用于定位某页搜索结果
private static String template = "";
public static void main(String[] args) {
goSearch(N, keyWord);
}
private static void goSearch(final int n, final String keyWord) {
Thread thread = new Thread(new Runnable() {
public void run() {
// 页数
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 = new RenWu();
// 实现摘取网页源码
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();
}
public String getPageSource(String pageURL, String encoding) {
// 输入:url链接&编码格式
// 输出:该网页内容
StringBuffer sb = new StringBuffer();
try {
// 构建一URL对象
URL url = new URL(pageURL);
// 使用openStream得到一输入流并由此构造一个BufferedReader对象
InputStream in = url.openStream();
InputStreamReader ir = new InputStreamReader(in);
BufferedReader br = new BufferedReader(ir);
String line;
while((line = br.readLine()) != null) {
sb.append(line);
sb.append("\n");
}
br.close();
} catch (Exception e) {
e.printStackTrace();
}
return sb.toString();
}
/*
* 获取百度搜索第一页内容
*/
public static Elements getFirstPage(String keyWord) throws FailingHttpStatusCodeException, MalformedURLException, IOException {
//设置浏览器的User-Agent
WebClient webClient = new WebClient(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]");
// 返回此类链接,即第一页的百度搜素链接
return firstElementsLink;
}
/*
* 获取下一页地址
*/
public static void nextHref(HtmlPage firstBaiduPage) {
WebClient webClient = new WebClient(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中的包含<a href=""....>的部分
Elements links = doc.select("a[href]");
// 设置只取一次每页链接的模板格式
boolean getTemplate = true;
for (Element e : links) {
// 将提取出来的<a>标签中的链接取出
String linkHref = e.attr("href");
if(getTemplate) {
// 补全模板格式
template = "http://www.baidu.com" + linkHref;
getTemplate = false;
}
}
}
}
导出到本地文件(附加在末尾)的封装的Fangfa类是fileutil.class:
package com.zhaowu.renwu2;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
public class FileUtil {
public static void toFile (String content) {
File file = null;
FileWriter fw = null;
file = new File("/home/acer/桌面/aaa");
try {
if (!file.exists()) {
file.createNewFile();
}
fw = new FileWriter(file,true);
fw.write(content);//向文件中复制内容
fw.flush();
} catch (IOException e) {
e.printStackTrace();
}finally{
if(fw != null){
try {
fw.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
发布于2018-05-09 09:03shen6阅读(112)4)评论(0)编辑)