-
當(dāng)前位置:首頁 > 創(chuàng)意學(xué)院 > 營(yíng)銷推廣 > 專題列表 > 正文
網(wǎng)絡(luò)爬蟲關(guān)鍵詞抓?。ňW(wǎng)絡(luò)爬蟲關(guān)鍵詞抓取詞云圖)
大家好!今天讓創(chuàng)意嶺的小編來大家介紹下關(guān)于網(wǎng)絡(luò)爬蟲關(guān)鍵詞抓取的問題,以下是小編對(duì)此問題的歸納整理,讓我們一起來看看吧。
創(chuàng)意嶺作為行業(yè)內(nèi)優(yōu)秀的企業(yè),服務(wù)客戶遍布全球各地,相關(guān)業(yè)務(wù)請(qǐng)撥打電話:175-8598-2043,或添加微信:1454722008
本文目錄:
一、python爬蟲一般都爬什么信息
python爬蟲一般都爬什么信息?
一般說爬蟲的時(shí)候,大部分程序員潛意識(shí)里都會(huì)聯(lián)想為Python爬蟲,為什么會(huì)這樣,我覺得有兩個(gè)原因:
1.Python生態(tài)極其豐富,諸如Request、Beautiful Soup、Scrapy、PySpider等第三方庫(kù)實(shí)在強(qiáng)大
2.Python語法簡(jiǎn)潔易上手,分分鐘就能寫出一個(gè)爬蟲(有人吐槽Python慢,但是爬蟲的瓶頸和語言關(guān)系不大)
爬蟲是一個(gè)程序,這個(gè)程序的目的就是為了抓取萬維網(wǎng)信息資源,比如你日常使用的谷歌等搜索引擎,搜索結(jié)果就全都依賴爬蟲來定時(shí)獲取
看上述搜索結(jié)果,除了wiki相關(guān)介紹外,爬蟲有關(guān)的搜索結(jié)果全都帶上了Python,前人說Python爬蟲,現(xiàn)在看來果然誠(chéng)不欺我~
爬蟲的目標(biāo)對(duì)象也很豐富,不論是文字、圖片、視頻,任何結(jié)構(gòu)化非結(jié)構(gòu)化的數(shù)據(jù)爬蟲都可以爬取,爬蟲經(jīng)過發(fā)展,也衍生出了各種爬蟲類型:
● 通用網(wǎng)絡(luò)爬蟲:爬取對(duì)象從一些種子 URL 擴(kuò)充到整個(gè) Web,搜索引擎干的就是這些事
● 垂直網(wǎng)絡(luò)爬蟲:針對(duì)特定領(lǐng)域主題進(jìn)行爬取,比如專門爬取小說目錄以及章節(jié)的垂直爬蟲
● 增量網(wǎng)絡(luò)爬蟲:對(duì)已經(jīng)抓取的網(wǎng)頁進(jìn)行實(shí)時(shí)更新
● 深層網(wǎng)絡(luò)爬蟲:爬取一些需要用戶提交關(guān)鍵詞才能獲得的 Web 頁面
不想說這些大方向的概念,讓我們以一個(gè)獲取網(wǎng)頁內(nèi)容為例,從爬蟲技術(shù)本身出發(fā),來說說網(wǎng)頁爬蟲,步驟如下:
模擬請(qǐng)求網(wǎng)頁資源
從HTML提取目標(biāo)元素
數(shù)據(jù)持久化
相關(guān)推薦:《Python教程》以上就是小編分享的關(guān)于python爬蟲一般都爬什么信息的詳細(xì)內(nèi)容希望對(duì)大家有所幫助,更多有關(guān)python教程請(qǐng)關(guān)注環(huán)球青藤其它相關(guān)文章!
二、如何使用webcollector爬取搜索引擎
使用webcollector爬取搜索引擎,按照關(guān)鍵字搜索的結(jié)果頁面,解析規(guī)則可能會(huì)隨百度搜索的改版而失效。
代碼如下:
[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數(shù)據(jù)庫(kù),用戶名root,密碼mahao
String url = "jdbc:mysql://localhost:3306/wjd";
String username = "root";
String password = "mahao";
//保存抽取到的數(shù)據(jù)
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("成功抓取關(guān)鍵詞" + keyword + "的第" + pageNum + "頁搜索結(jié)果");
// || 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);
/*
* 我們希望繼續(xù)爬取每條搜索結(jié)果指向的網(wǎng)頁,這里統(tǒng)稱為外鏈。
* 我們希望在訪問外鏈時(shí)仍然能夠知道外鏈處于搜索引擎的第幾頁、第幾條,
* 所以將頁號(hào)和排序信息放入后續(xù)的CrawlDatum中,為了能夠區(qū)分外鏈和
* 搜索引擎結(jié)果頁面,我們將其pageType設(shè)置為outlink,這里的值完全由 用戶定義,可以設(shè)置一個(gè)任意的值
* 在經(jīng)典爬蟲中,每個(gè)網(wǎng)頁都有一個(gè)refer信息,表示當(dāng)前網(wǎng)頁的鏈接來源。
* 例如我們首先訪問新浪首頁,然后從新浪首頁中解析出了新的新聞鏈接,
* 則這些網(wǎng)頁的refer值都是新浪首頁。WebCollector不直接保存refer值,
* 但我們可以通過下面的方式,將refer信息保存在metaData中,達(dá)到同樣的效果。
* 經(jīng)典爬蟲中錨文本的存儲(chǔ)也可以通過下面方式實(shí)現(xiàn)。
* 在一些需求中,希望得到當(dāng)前頁面在遍歷樹中的深度,利用metaData很容易實(shí)現(xiàn)
* 這個(gè)功能,在將CrawlDatum添加到next中時(shí),將其depth設(shè)置為當(dāng)前訪問頁面 的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個(gè)結(jié)果:標(biāo)題:%s(%s字節(jié))\tdepth=%s\trefer=%s", pageNum,
rank + 1, page.getDoc().title(), content,
depth, refer);*/
String line = String.format("標(biāo)題:%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");// 獲取中國(guó)的時(shí)區(qū)
myFmt.setTimeZone(timeZoneChina);// 設(shè)置系統(tǒng)時(shí)區(qū)
String grabTime = myFmt.format(currentDate);// new Date()為獲取當(dāng)前系統(tǒng)時(shí)間
data.put("title", page.getDoc().title());
data.put("from", page.getUrl());
data.put("content", content);
data.put("grabTime", grabTime);
//String line = String.format("標(biāo)題:%s\n", page.getDoc().title());
//持久化到word文檔中
//是否為線程安全???
//synchronized(this) {
String destFile = "D:\\"+"Result"+keyword+".doc";
result.append(line);
//將result寫到doc文件中
write2File(destFile,result.toString());
//添加到數(shù)據(jù)庫(kù)中
addResultData(data);
//}
System.out.println(line);
} catch (Exception e) {
//e.printStackTrace();
System.out.println("鏈接"+page.getUrl()+"失效");
}
}
}
//將數(shù)據(jù)保存到mysql數(shù)據(jù)庫(kù)中
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,}", "");//去掉字符串中出現(xiàn)的多個(gè)連續(xù)問號(hào)。
//抓取時(shí)間
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("抓取時(shí)間"+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()) {
// 如果數(shù)據(jù)庫(kù)中不存在該記錄,則添加到數(shù)據(jù)庫(kù)中
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();
}
}
/**
* 將數(shù)據(jù)持久化到本地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 = {"網(wǎng)絡(luò)爬蟲","搜索引擎"};
int pageToal =5;
for (String keyword : keywordsList) {
BdiduKeywordCrawler crawler = new BdiduKeywordCrawler(keyword, pageToal);
crawler.start();
}
}
/**
* 根據(jù)關(guān)鍵詞和頁號(hào)拼接百度搜索對(duì)應(yīng)的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);
}
}
三、網(wǎng)絡(luò)爬蟲主要能干啥?
網(wǎng)絡(luò)爬蟲,是一種自動(dòng)獲取網(wǎng)頁內(nèi)容的程序,是搜索引擎的重要組成部分。一般人能訪問到的網(wǎng)頁,爬蟲也都能抓取。所謂的爬蟲抓取,也是類似于我們?yōu)g覽網(wǎng)頁。但與普通人上網(wǎng)方式不同,爬蟲是可以按照一定的規(guī)則,自動(dòng)的采集信息。
舉個(gè)例子,比如說你從事的是文字編輯工作,需求稿件量大,可是效率很低,最大的一個(gè)原因便是很多的時(shí)間花費(fèi)在了采集資料上,假如繼續(xù)按照之前手動(dòng)瀏覽的方式,要么就是你通宵達(dá)旦熬夜加班,要么便是讓其他人幫你,但顯然兩者都不方便。這種情況下,網(wǎng)絡(luò)爬蟲就顯得很重要。
隨著大數(shù)據(jù)時(shí)代的來臨,網(wǎng)絡(luò)爬蟲在互聯(lián)網(wǎng)中的地位將越來越重要。互聯(lián)網(wǎng)中的數(shù)據(jù)是海量的,如何自動(dòng)高效地獲取互聯(lián)網(wǎng)中我們感興趣的信息并為我們所用是一個(gè)重要的問題,而爬蟲技術(shù)就是為了解決這些問題而生的。
我們感興趣的信息分為不同的類型:如果只是做搜索引擎,那么感興趣的信息就是互聯(lián)網(wǎng)中盡可能多的高質(zhì)量網(wǎng)頁;如果要獲取某一垂直領(lǐng)域的數(shù)據(jù)或者有明確的檢索需求,那么感興趣的信息就是根據(jù)我們的檢索和需求所定位的這些信息,此時(shí),需要過濾掉一些無用信息。前者我們稱為通用網(wǎng)絡(luò)爬蟲,后者我們稱為聚焦網(wǎng)絡(luò)爬蟲。
四、如何用最簡(jiǎn)單的Python爬蟲采集整個(gè)網(wǎng)站
采集網(wǎng)站數(shù)據(jù)并不難,但是需要爬蟲有足夠的深度。我們創(chuàng)建一個(gè)爬蟲,遞歸地遍歷每個(gè)網(wǎng)站,只收集那些網(wǎng)站頁面上的數(shù)據(jù)。一般的比較費(fèi)時(shí)間的網(wǎng)站采集方法從頂級(jí)頁面開始(一般是網(wǎng)站主頁),然后搜索頁面上的所有鏈接,形成列表,再去采集到的這些鏈接頁面,繼續(xù)采集每個(gè)頁面的鏈接形成新的列表,重復(fù)執(zhí)行。
以上就是關(guān)于網(wǎng)絡(luò)爬蟲關(guān)鍵詞抓取相關(guān)問題的回答。希望能幫到你,如有更多相關(guān)問題,您也可以聯(lián)系我們的客服進(jìn)行咨詢,客服也會(huì)為您講解更多精彩的知識(shí)和內(nèi)容。
推薦閱讀:
你對(duì)網(wǎng)絡(luò)促銷的看法(你對(duì)網(wǎng)絡(luò)促銷的看法英語作文)
網(wǎng)絡(luò)營(yíng)銷獨(dú)有的促銷手段(網(wǎng)絡(luò)營(yíng)銷獨(dú)有的促銷手段是)
網(wǎng)絡(luò)營(yíng)銷的方法有哪些-(列舉網(wǎng)絡(luò)營(yíng)銷的方法有哪些)
文創(chuàng)品牌理念(文創(chuàng)品牌理念定位)
文化傳媒公司愿景(文化傳媒企業(yè)愿景范文簡(jiǎn)短)
猜你喜歡
完整的社群營(yíng)銷方案(社群營(yíng)銷的十大案例)
運(yùn)營(yíng)服務(wù)(運(yùn)營(yíng)服務(wù)標(biāo)準(zhǔn))
網(wǎng)站如何優(yōu)化一個(gè)關(guān)鍵詞(優(yōu)化網(wǎng)站關(guān)鍵詞的技巧)
輿情監(jiān)測(cè)管理平臺(tái)(輿情監(jiān)測(cè)管理平臺(tái)有哪些)
淘寶網(wǎng)官方網(wǎng)站網(wǎng)頁版(淘寶店鋪買賣交易平臺(tái))