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