HOME 首頁
SERVICE 服務(wù)產(chǎn)品
XINMEITI 新媒體代運(yùn)營(yíng)
CASE 服務(wù)案例
NEWS 熱點(diǎn)資訊
ABOUT 關(guān)于我們
CONTACT 聯(lián)系我們
創(chuàng)意嶺
讓品牌有溫度、有情感
專注品牌策劃15年

    網(wǎng)絡(luò)爬蟲關(guān)鍵詞抓?。ňW(wǎng)絡(luò)爬蟲關(guān)鍵詞抓取詞云圖)

    發(fā)布時(shí)間:2023-03-12 10:40:21     稿源: 創(chuàng)意嶺    閱讀: 1105        問大家

    大家好!今天讓創(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

    本文目錄:

    網(wǎng)絡(luò)爬蟲關(guān)鍵詞抓?。ňW(wǎng)絡(luò)爬蟲關(guān)鍵詞抓取詞云圖)

    一、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)短)