网络爬虫关键词抓取(网络爬虫关键词抓取词云图)
大家好!今天让创意岭的小编来大家介绍下关于网络爬虫关键词抓取的问题,以下是小编对此问题的归纳整理,让我们一起来看看吧。
创意岭作为行业内优秀的企业,服务客户遍布全球各地,相关业务请拨打电话:175-8598-2043,或添加微信:1454722008
本文目录:
一、python爬虫一般都爬什么信息
python爬虫一般都爬什么信息?
一般说爬虫的时候,大部分程序员潜意识里都会联想为Python爬虫,为什么会这样,我觉得有两个原因:
1.Python生态极其丰富,诸如Request、Beautiful Soup、Scrapy、PySpider等第三方库实在强大
2.Python语法简洁易上手,分分钟就能写出一个爬虫(有人吐槽Python慢,但是爬虫的瓶颈和语言关系不大)
爬虫是一个程序,这个程序的目的就是为了抓取万维网信息资源,比如你日常使用的谷歌等搜索引擎,搜索结果就全都依赖爬虫来定时获取
看上述搜索结果,除了wiki相关介绍外,爬虫有关的搜索结果全都带上了Python,前人说Python爬虫,现在看来果然诚不欺我~
爬虫的目标对象也很丰富,不论是文字、图片、视频,任何结构化非结构化的数据爬虫都可以爬取,爬虫经过发展,也衍生出了各种爬虫类型:
● 通用网络爬虫:爬取对象从一些种子 URL 扩充到整个 Web,搜索引擎干的就是这些事
● 垂直网络爬虫:针对特定领域主题进行爬取,比如专门爬取小说目录以及章节的垂直爬虫
● 增量网络爬虫:对已经抓取的网页进行实时更新
● 深层网络爬虫:爬取一些需要用户提交关键词才能获得的 Web 页面
不想说这些大方向的概念,让我们以一个获取网页内容为例,从爬虫技术本身出发,来说说网页爬虫,步骤如下:
模拟请求网页资源
从HTML提取目标元素
数据持久化
相关推荐:《Python教程》以上就是小编分享的关于python爬虫一般都爬什么信息的详细内容希望对大家有所帮助,更多有关python教程请关注环球青藤其它相关文章!
二、如何使用webcollector爬取搜索引擎
使用webcollector爬取搜索引擎,按照关键字搜索的结果页面,解析规则可能会随百度搜索的改版而失效。
代码如下:
[java] view plain copy
package com.wjd.baidukey.crawler;
import java.io.ByteArrayInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.net.URLEncoder;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.TimeZone;
import org.apache.poi.poifs.filesystem.DirectoryEntry;
import org.apache.poi.poifs.filesystem.POIFSFileSystem;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import cn.edu.hfut.dmic.contentextractor.ContentExtractor;
import cn.edu.hfut.dmic.webcollector.model.CrawlDatum;
import cn.edu.hfut.dmic.webcollector.model.CrawlDatums;
import cn.edu.hfut.dmic.webcollector.model.Page;
import cn.edu.hfut.dmic.webcollector.plugin.ram.RamCrawler;
public class BdiduKeywordCrawler extends RamCrawler{
private Connection connection;
private PreparedStatement pstatement;
// 连接MySql数据库,用户名root,密码mahao
String url = "jdbc:mysql://localhost:3306/wjd";
String username = "root";
String password = "mahao";
//保存抽取到的数据
StringBuilder result = new StringBuilder();
public BdiduKeywordCrawler(String keyword, int maxPageNum) throws Exception {
for (int pageNum = 1; pageNum <= maxPageNum; pageNum++) {
String url = createUrl(keyword, pageNum);
CrawlDatum datum = new CrawlDatum(url)
.putMetaData("keyword", keyword)
.putMetaData("pageNum", pageNum + "")
.putMetaData("pageType", "searchEngine")
.putMetaData("depth", "1");
addSeed(datum);
}
}
@Override
public void visit(Page page, CrawlDatums next) {
String keyword = page.getMetaData("keyword");
String pageType = page.getMetaData("pageType");
int depth = Integer.valueOf(page.getMetaData("depth"));
if (pageType.equals("searchEngine")) {
int pageNum = Integer.valueOf(page.getMetaData("pageNum"));
System.out.println("成功抓取关键词" + keyword + "的第" + pageNum + "页搜索结果");
// || div[class=result-op c-container xpath-log ]>h4>a
Elements results = page.select("div[class=result c-container ]>h4>a");
// Elements results1 = page.select("div[class=result-op c-container xpath-log]>h4>a");//,div[id=result-op c-container xpath-log]>h4>a
//System.out.println(results1.get(0));
//results.add(results1.get(0));
for (int rank = 0; rank < results.size(); rank++) {
Element result = results.get(rank);
/*
* 我们希望继续爬取每条搜索结果指向的网页,这里统称为外链。
* 我们希望在访问外链时仍然能够知道外链处于搜索引擎的第几页、第几条,
* 所以将页号和排序信息放入后续的CrawlDatum中,为了能够区分外链和
* 搜索引擎结果页面,我们将其pageType设置为outlink,这里的值完全由 用户定义,可以设置一个任意的值
* 在经典爬虫中,每个网页都有一个refer信息,表示当前网页的链接来源。
* 例如我们首先访问新浪首页,然后从新浪首页中解析出了新的新闻链接,
* 则这些网页的refer值都是新浪首页。WebCollector不直接保存refer值,
* 但我们可以通过下面的方式,将refer信息保存在metaData中,达到同样的效果。
* 经典爬虫中锚文本的存储也可以通过下面方式实现。
* 在一些需求中,希望得到当前页面在遍历树中的深度,利用metaData很容易实现
* 这个功能,在将CrawlDatum添加到next中时,将其depth设置为当前访问页面 的depth+1即可。
*/
CrawlDatum datum = new CrawlDatum(result.attr("abs:href"))
.putMetaData("keyword", keyword)
.putMetaData("pageNum", pageNum + "")
.putMetaData("rank", rank + "")
.putMetaData("pageType", "outlink")
.putMetaData("depth", (depth + 1) + "")
.putMetaData("refer", page.getUrl());
next.add(datum);
}
} else if (pageType.equals("outlink")) {
/*int pageNum = Integer.valueOf(page.getMetaData("pageNum"));
int rank = Integer.valueOf(page.getMetaData("rank"));
String refer = page.getMetaData("refer");*/
try {
String content = ContentExtractor.getContentByUrl(page.getUrl());
/*String line = String.format(
"第%s页第%s个结果:标题:%s(%s字节)\tdepth=%s\trefer=%s", pageNum,
rank + 1, page.getDoc().title(), content,
depth, refer);*/
String line = String.format("标题:%s\n来源:%s\n正文:%s", page.getDoc().title(),page.getUrl(),content);
HashMap<String, String> data = new HashMap<String,String>();
Date currentDate = new java.util.Date();
SimpleDateFormat myFmt = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
TimeZone timeZoneChina = TimeZone.getTimeZone("Asia/Shanghai");// 获取中国的时区
myFmt.setTimeZone(timeZoneChina);// 设置系统时区
String grabTime = myFmt.format(currentDate);// new Date()为获取当前系统时间
data.put("title", page.getDoc().title());
data.put("from", page.getUrl());
data.put("content", content);
data.put("grabTime", grabTime);
//String line = String.format("标题:%s\n", page.getDoc().title());
//持久化到word文档中
//是否为线程安全???
//synchronized(this) {
String destFile = "D:\\"+"Result"+keyword+".doc";
result.append(line);
//将result写到doc文件中
write2File(destFile,result.toString());
//添加到数据库中
addResultData(data);
//}
System.out.println(line);
} catch (Exception e) {
//e.printStackTrace();
System.out.println("链接"+page.getUrl()+"失效");
}
}
}
//将数据保存到mysql数据库中
private void addResultData(HashMap<String, String> data) {
String title = data.get("title");
String source_url = data.get("from");
String content = data.get("content").replaceAll("\\?{2,}", "");//去掉字符串中出现的多个连续问号。
//抓取时间
String grabTime = data.get("grabTime");
/*SimpleDateFormat format = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
Date date = null;
try {
date = format.parse(grabTime);
} catch (Exception e) {
e.printStackTrace();
}*/
//System.out.println("抓取时间"+grabTime);
try {
connection = DriverManager.getConnection(url, username, password);
String sql = "INSERT INTO wjd_keyword_search_table(TITLE,GRAP_TIME,CONTENT,SOURCE_URL) VALUES(?,?,?,?)";
String checkSql = "select 1 from wjd_keyword_search_table where TITLE='" + title + "'";
Statement statement = connection.prepareStatement(checkSql);
ResultSet result = statement.executeQuery(checkSql);
if (!result.next()) {
// 如果数据库中不存在该记录,则添加到数据库中
pstatement = connection.prepareStatement(sql);
pstatement.setString(1, title);
//pstatement.setString(2, date);
pstatement.setString(2,grabTime);
pstatement.setString(3, content);
pstatement.setString(4, source_url);
pstatement.executeUpdate();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
/**
* 将数据持久化到本地doc文件中
* @param destFile
* @param line
*/
private void write2File(String destFile, String line) {
try {
//doc content
ByteArrayInputStream bais = new ByteArrayInputStream(line.getBytes());
POIFSFileSystem fs = new POIFSFileSystem();
DirectoryEntry directory = fs.getRoot();
directory.createDocument("WordDocument", bais);
FileOutputStream ostream = new FileOutputStream(destFile);
fs.writeFilesystem(ostream);
bais.close();
ostream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
public static void main(String[] args) throws Exception {
String[] keywordsList = {"网络爬虫","搜索引擎"};
int pageToal =5;
for (String keyword : keywordsList) {
BdiduKeywordCrawler crawler = new BdiduKeywordCrawler(keyword, pageToal);
crawler.start();
}
}
/**
* 根据关键词和页号拼接百度搜索对应的URL
*/
public static String createUrl(String keyword, int pageNum)
throws Exception {
int first = (pageNum-1) * 10;
keyword = URLEncoder.encode(keyword, "utf-8");
return String.format("https://www.baidu.com/s?wd=%s&pn=%s",
keyword, first);
}
}
三、网络爬虫主要能干啥?
网络爬虫,是一种自动获取网页内容的程序,是搜索引擎的重要组成部分。一般人能访问到的网页,爬虫也都能抓取。所谓的爬虫抓取,也是类似于我们浏览网页。但与普通人上网方式不同,爬虫是可以按照一定的规则,自动的采集信息。
举个例子,比如说你从事的是文字编辑工作,需求稿件量大,可是效率很低,最大的一个原因便是很多的时间花费在了采集资料上,假如继续按照之前手动浏览的方式,要么就是你通宵达旦熬夜加班,要么便是让其他人帮你,但显然两者都不方便。这种情况下,网络爬虫就显得很重要。
随着大数据时代的来临,网络爬虫在互联网中的地位将越来越重要。互联网中的数据是海量的,如何自动高效地获取互联网中我们感兴趣的信息并为我们所用是一个重要的问题,而爬虫技术就是为了解决这些问题而生的。
我们感兴趣的信息分为不同的类型:如果只是做搜索引擎,那么感兴趣的信息就是互联网中尽可能多的高质量网页;如果要获取某一垂直领域的数据或者有明确的检索需求,那么感兴趣的信息就是根据我们的检索和需求所定位的这些信息,此时,需要过滤掉一些无用信息。前者我们称为通用网络爬虫,后者我们称为聚焦网络爬虫。
四、如何用最简单的Python爬虫采集整个网站
采集网站数据并不难,但是需要爬虫有足够的深度。我们创建一个爬虫,递归地遍历每个网站,只收集那些网站页面上的数据。一般的比较费时间的网站采集方法从顶级页面开始(一般是网站主页),然后搜索页面上的所有链接,形成列表,再去采集到的这些链接页面,继续采集每个页面的链接形成新的列表,重复执行。
以上就是关于网络爬虫关键词抓取相关问题的回答。希望能帮到你,如有更多相关问题,您也可以联系我们的客服进行咨询,客服也会为您讲解更多精彩的知识和内容。
推荐阅读: