022-2345 2937
185 2247 0110
business@forenose.com
客服QQ:2779623375
前嗅大數(shù)據(jù)
用戶QQ群3:606835039
用戶QQ群4:795287153
客服微信
qianxiu0106
訂閱號
服務(wù)號
數(shù)據(jù)專欄
智能大數(shù)據(jù)搬運工,你想要的我們都有
科技資訊
科技學院
科技百科
科技書籍
網(wǎng)站大全
軟件大全
網(wǎng)絡(luò)輿情爬蟲開發(fā) 之英雄帖 | |||
---|---|---|---|
開發(fā)需求 | 用于網(wǎng)絡(luò)輿情信息采集與分析的軟件(接口級) | ||
功能描述 | 1. 信息采集類型 :新聞、政務(wù)網(wǎng)站、論壇、博客、微信、微博、視頻、境外中文媒體,約 3 萬站點 2. 網(wǎng)頁解析字段項 :標題、時間、作者、正文、正文摘要、 URL 、評論數(shù)、轉(zhuǎn)載數(shù)等 3. 數(shù)據(jù)分析類型 :輿情常規(guī)的語義分析、熱點分析 4. 全文檢索功能 | ||
技術(shù)要求 | 1) 部署 \OS :云服務(wù)器 \centos 2) 網(wǎng)絡(luò)爬蟲: Nutch1.6 \ Nutch1.7 3) 離線計算 \ 實時計算: hadoop2.x \ storm 4) 數(shù)據(jù)采集 \ 消息隊列: flume \ Kafka 5) DB : hbase \ mongodb 6) 檢索: solr 7) 其他:開源、無限制 其他要求 | 聯(lián)系方式 1) 24 小時運行 2) 開發(fā)文檔完整 3) 除首次外,完成單次信息采集解析 < 4 小時 | 北京弘易軟件 張工 手機: 13466796522 QQ:1075455138 技術(shù)問答 2016-11-09 11:11:00 HDC調(diào)試需求開發(fā)(15萬預算),能者速來!>>> @S2JH 你好,最近在nutch2.2.1開發(fā)使用時,發(fā)現(xiàn)了一個問題,請教一下您: 問題描述:出現(xiàn)重復抓取現(xiàn)象,即第二次抓取時會將第一次抓取的數(shù)據(jù)再抓取一遍,第三次抓取時會將第一次、第二次抓取的數(shù)據(jù)再抓取一遍,總之就是本次抓取會將新數(shù)據(jù)和前面已經(jīng)抓取過的數(shù)據(jù)再抓取一遍;( urls里面有一個鏈接,第一次抓取時抓取urls里面的鏈接,解析此鏈接產(chǎn)生50條數(shù)據(jù)并存入數(shù)據(jù)庫,第二次抓取時應(yīng)該只抓取剛產(chǎn)生的50條數(shù)據(jù)才對,但是卻抓取了數(shù)據(jù)庫中的所有數(shù)據(jù)51條,即第一次抓取的數(shù)據(jù)又抓取了一遍;第二次抓取數(shù)據(jù)產(chǎn)生了100條數(shù)據(jù)并存入數(shù)據(jù)庫,第三次抓取理論上應(yīng)該是抓取第二次抓取時產(chǎn)生的數(shù)據(jù),但是同樣是抓取了數(shù)據(jù)庫中所有的數(shù)據(jù),將第一次、第二次抓取的數(shù)據(jù)又抓取了一遍,就這樣一直重復抓取,影響了速度,而且頁面解析時會出現(xiàn)重復數(shù)據(jù),這個問題怎么解決呢 ) 技術(shù)問答 2016-07-25 18:24:00 HDC調(diào)試需求開發(fā)(15萬預算),能者速來!>>> http://www.haodf.com/doctor/DE4r0BCkuHzdeZILvCBx2XzuGO4ty.htm 這是一個JS生成的 頁面,源碼里看不到 簡介 處的 東西,同時 后臺 也沒有相關(guān)的 異步請求的 api地址。 怎么搞呢? 用什么組件 可以 獲取到 執(zhí)行完的 頁面完整源碼? 技術(shù)問答 2016-06-22 16:32:00 HDC調(diào)試需求開發(fā)(15萬預算),能者速來!>>> Nutch 主要分為兩個部分:爬蟲 crawler 和查詢 searcher 。 Crawler 主要用于從網(wǎng)絡(luò)上抓取網(wǎng)頁并為這些網(wǎng)頁建立索引。 Searcher 主要利用這些索引檢索用戶的查找關(guān)鍵詞來產(chǎn)生查找結(jié)果。兩者之間的接口是索引,所以除去索引部分,兩者之間的耦合度很低。 Crawler 和 Searcher 兩部分盡量分開的目的主要是為了使兩部分可以分布式配置在硬件平臺上,例如將 Crawler 和 Searcher 分別放在兩個主機上,這樣可以提升性能。 爬蟲, Crawler : Crawler 的重點在兩個方面, Crawler 的工作流程和涉及的數(shù)據(jù)文件的格式和含義。數(shù)據(jù)文件主要包括三類,分別是 web database ,一系列的 segment 加上 index ,三者的物理文件分別存儲在爬行結(jié)果目錄下的 db 目錄下 webdb 子文件夾內(nèi), segments 文件夾和 index 文件夾。那么三者分別存儲的信息是什么呢? Web database ,也叫 WebDB ,其中存儲的是爬蟲所抓取網(wǎng)頁之間的鏈接結(jié)構(gòu)信息,它只在爬蟲 Crawler 工作中使用而和 Searcher 的工作沒有任何關(guān)系。 WebDB 內(nèi)存儲了兩種實體的信息: page 和 link 。 Page 實體通過描述網(wǎng)絡(luò)上一個網(wǎng)頁的特征信息來表征一個實際的網(wǎng)頁,因為網(wǎng)頁有很多個需要描述, WebDB 中通過網(wǎng)頁的 URL 和網(wǎng)頁內(nèi)容的 MD5 兩種索引方法對這些網(wǎng)頁實體進行了索引。 Page 實體描述的網(wǎng)頁特征主要包括網(wǎng)頁內(nèi)的 link 數(shù)目,抓取此網(wǎng)頁的時間等相關(guān)抓取信息,對此網(wǎng)頁的重要度評分等。同樣的, Link 實體描述的是兩個 page 實體之間的鏈接關(guān)系。 WebDB 構(gòu)成了一個所抓取網(wǎng)頁的鏈接結(jié)構(gòu)圖,這個圖中 Page 實體是圖的結(jié)點,而 Link 實體則代表圖的邊。 一次爬行會產(chǎn)生很多個 segment ,每個 segment 內(nèi)存儲的是爬蟲 Crawler 在單獨一次抓取循環(huán)中抓到的網(wǎng)頁以及這些網(wǎng)頁的索引。 Crawler 爬行時會根據(jù) WebDB 中的 link 關(guān)系按照一定的爬行策略生成每次抓取循環(huán)所需的 fetchlist ,然后 Fetcher 通過 fetchlist 中的 URLs 抓取這些網(wǎng)頁并索引,然后將其存入 segment 。 Segment 是有時限的,當這些網(wǎng)頁被 Crawler 重新抓取后,先前抓取產(chǎn)生的 segment 就作廢了。在存儲中。 Segment 文件夾是以產(chǎn)生時間命名的,方便我們刪除作廢的 segments 以節(jié)省存儲空間。 Index 是 Crawler 抓取的所有網(wǎng)頁的索引,它是通過對所有單個 segment 中的索引進行合并處理所得的。 Nutch 利用 Lucene 技術(shù)進行索引,所以 Lucene 中對索引進行操作的接口對 Nutch 中的 index 同樣有效。但是需要注意的是, Lucene 中的 segment 和 Nutch 中的不同, Lucene 中的 segment 是索引 index 的一部分,但是 Nutch 中的 segment 只是 WebDB 中各個部分網(wǎng)頁的內(nèi)容和索引,最后通過其生成的 index 跟這些 segment 已經(jīng)毫無關(guān)系了。 Crawler 工作流程: 在分析了 Crawler 工作中設(shè)計的文件之后,接下來我們研究一下 Crawler 的抓取流程以及這些文件在抓取中扮演的角色。 Crawler 的工作原理主要是:首先 Crawler 根據(jù) WebDB 生成一個待抓取網(wǎng)頁的 URL 集合叫做 Fetchlist ,接著下載線程 Fetcher 開始根據(jù) Fetchlist 將網(wǎng)頁抓取回來,如果下載線程有很多個,那么就生成很多個 Fetchlist ,也就是一個 Fetcher 對應(yīng)一個 Fetchlist 。然后 Crawler 根據(jù)抓取回來的網(wǎng)頁 WebDB 進行更新,根據(jù)更新后的 WebDB 生成新的 Fetchlist ,里面是未抓取的或者新發(fā)現(xiàn)的 URLs ,然后下一輪抓取循環(huán)重新開始。這個循環(huán)過程可以叫做“產(chǎn)生 / 抓取 / 更新”循環(huán)。 指向同一個主機上 Web 資源的 URLs 通常被分配到同一個 Fetchlist 中,這樣的話防止過多的 Fetchers 對一個主機同時進行抓取造成主機負擔過重。另外 Nutch 遵守 Robots Exclusion Protocol ,網(wǎng)站可以通過自定義 Robots.txt 控制 Crawler 的抓取。 在 Nutch 中, Crawler 操作的實現(xiàn)是通過一系列子操作的實現(xiàn)來完成的。這些子操作 Nutch 都提供了子命令行可以單獨進行調(diào)用。下面就是這些子操作的功能描述以及命令行,命令行在括號中。 1. 創(chuàng)建一個新的 WebDb ( admin db -create ). 2. 將抓取起始 URLs 寫入 WebDB 中 ( inject ). 3. 根據(jù) WebDB 生成 fetchlist 并寫入相應(yīng)的 segment( generate ). 4. 根據(jù) fetchlist 中的 URL 抓取網(wǎng)頁 ( fetch ). 5. 根據(jù)抓取網(wǎng)頁更新 WebDb ( updatedb ). 6. 循環(huán)進行 3 - 5 步直至預先設(shè)定的抓取深度。 7. 根據(jù) WebDB 得到的網(wǎng)頁評分和 links 更新 segments ( updatesegs ). 8. 對所抓取的網(wǎng)頁進行索引 ( index ). 9. 在索引中丟棄有重復內(nèi)容的網(wǎng)頁和重復的 URLs ( dedup ). 10. 將 segments 中的索引進行合并生成用于檢索的最終 index( merge ). Crawler 詳細工作流程是:在創(chuàng)建一個 WebDB 之后 ( 步驟 1), “產(chǎn)生 / 抓取 / 更新”循環(huán) ( 步驟 3 - 6) 根據(jù)一些種子 URLs 開始啟動。當這個循環(huán)徹底結(jié)束, Crawler 根據(jù)抓取中生成的 segments 創(chuàng)建索引(步驟 7 - 10 )。在進行重復 URLs 清除(步驟 9 )之前,每個 segment 的索引都是獨立的(步驟 8 )。最終,各個獨立的 segment 索引被合并為一個最終的索引 index (步驟 10 )。 其中有一個細節(jié)問題, Dedup 操作主要用于清除 segment 索引中的重復 URLs ,但是我們知道,在 WebDB 中是不允許重復的 URL 存在的,那么為什么這里還要進行清除呢?原因在于抓取的更新。比方說一個月之前你抓取過這些網(wǎng)頁,一個月后為了更新進行了重新抓取,那么舊的 segment 在沒有刪除之前仍然起作用,這個時候就需要在新舊 segment 之間進行除重。 另外這些子操作在第一次進行 Crawler 運行時可能并不用到,它們主要用于接下來的索引更新,增量搜索等操作的實現(xiàn)。這些在以后的文章中我再詳細講。 個性化設(shè)置: Nutch 中的所有配置文件都放置在總目錄下的 conf 子文件夾中,最基本的配置文件是 conf/nutch-default.xml 。這個文件中定義了 Nutch 的所有必要設(shè)置以及一些默認值,它是不可以被修改的。如果你想進行個性化設(shè)置,你需要在 conf/nutch-site.xml 進行設(shè)置,它會對默認設(shè)置進行屏蔽。 Nutch 考慮了其可擴展性,你可以自定義插件 plugins 來定制自己的服務(wù),一些 plugins 存放于 plugins 子文件夾。 Nutch 的網(wǎng)頁解析與索引功能是通過插件形式進行實現(xiàn)的,例如,對 HTML 文件的解析與索引是通過 HTML document parsing plugin , parse-html 實現(xiàn)的。所以你完全可以自定義各種解析插件然后對配置文件進行修改,然后你就可以抓取并索引各種類型的文件了。 技術(shù)問答 2009-03-29 20:49:00 HDC調(diào)試需求開發(fā)(15萬預算),能者速來!>>> 課程背景: Nutch 誕生于 2002 年 8 月,是 Apache 旗下的一個用 Java 實現(xiàn)的開源搜索引擎項目,自 Nutch1.2 版本之后, Nutch 已經(jīng)從搜索引擎演化為網(wǎng)絡(luò)爬蟲,接著 Nutch 進一步演化為兩大分支版本: 1.X 和 2.X ,最大的區(qū)別在于 2.X 對底層的數(shù)據(jù)存儲進行了抽象以支持各種底層存儲技術(shù)。在 Nutch 的進化過程中,產(chǎn)生了 Hadoop 、 Tika 和 Gora 三個 Java 開源項目。如今這三個項目都發(fā)展迅速,極其火爆,尤其是 Hadoop ,其已成為大規(guī)模數(shù)據(jù)處理的事實上的標準。 Tika 使用多種現(xiàn)有的開源內(nèi)容解析項目來實現(xiàn)從多種格式的文件中提取元數(shù)據(jù)和結(jié)構(gòu)化文本, Gora 支持把大數(shù)據(jù)持久化到多種存儲實現(xiàn)。 課程大綱: 1 、 Nutch 是什么? Nutch 是 Apache 旗下的 Java 開源項目,最初是一個搜索引擎,現(xiàn)在是一個網(wǎng)絡(luò)爬蟲。 2 、 Nutch 的設(shè)計初衷 ? 商業(yè)搜索引擎不開源,搜索結(jié)果不純粹是根據(jù)網(wǎng)頁本身的價值進行排序,而是有眾多商業(yè)利益考慮。 Nutch 提供了開源的解決方案,幫助人們很容易地建立一個搜索引擎,為用戶提供優(yōu)質(zhì)的搜索結(jié)果,并能從一臺機器擴展到成百上千臺。 3 、為什么要學習 Nutch ? 搜索技術(shù)是信息時代的必備技術(shù)之一,沒有搜索功能的軟件是無法想象的,而搜索引擎是搜索技術(shù)的集大成者。通過 Nutch 的學習,可以對百度、谷歌這樣的搜索巨頭的內(nèi)部機制有所了解,并能根據(jù)自己的需要打造適合自己的搜索引擎,當然,也可以把搜索技術(shù)應(yīng)用到幾乎所有的軟件開發(fā)中 4 、 Nutch 的設(shè)計目標 ? 每個月抓取幾十億網(wǎng)頁 為這些網(wǎng)頁維護一個索引 對索引文件執(zhí)行每秒上千次的搜索 提供高質(zhì)量的搜索結(jié)果 以最小的成本運作 5 、 Nutch 的發(fā)展歷程? 11 年發(fā)展歷程, 3 大分支版本 強調(diào)重用,誕生了 Java 開源項目 Hadoop 、 Tika 、 Gora 不重新發(fā)明輪子,使用了大量第三方開源項目 6 、 Nutch 的整體架構(gòu)? 插件機制、數(shù)據(jù)抓取、數(shù)據(jù)解析、鏈接分析、建立索引、分布式搜索等。 對于一個搜索引擎來說,最終可能由成百上千臺服務(wù)器組成,然而,初創(chuàng)公司最初可能只有幾臺機器作為嘗試,隨著公司的發(fā)展逐步增加機器,因此,線性可擴展的分布式存儲與分布式計算是至關(guān)重要的。 Nutch 參考了 Google 的兩篇論文: MapReduce 計算模型以及 GFS 存儲模型,并做了實現(xiàn),后來把這兩大部分剝離出來形成獨立的開源項目 Hadoop 。由此可知, Hadoop 誕生于 Nutch ,核心由分布式計算和分布式存儲組成,是 MapReduce 和 GFS 的 JAVA 開源實現(xiàn)。 Nutch 使用 HDFS 作為存儲實現(xiàn)一直持續(xù)了很多年,然而使用 HDFS 有許多限制,后來考慮對存儲層進行抽象,剝離并形成了新的開源項目 Gora ,以支持多種存儲技術(shù),包括 RDBMS 和 NoSQL 。 對于搜索引擎來說,需要抓取各種各樣的文件,解析這些不同格式的文件是一個難題,為了簡化設(shè)計,也為了重用,于是誕生了 Tika ,一個專為內(nèi)容分析而誕生的工具箱。 7 、 Nutch 3 大分支版本? Nutch1.2 是一個完整的搜索引擎 Nutch1.7 是一個基于 HDFS 的網(wǎng)絡(luò)爬蟲 Nutch2.2.1 是一個基于 Gora 的網(wǎng)絡(luò)爬蟲 1.X 系列可用于生產(chǎn)環(huán)境、 2.X 系列還不成熟 8 、 Nutch 的應(yīng)用領(lǐng)域? 站內(nèi)搜索引擎、全網(wǎng)搜索引擎、垂直搜索引擎、數(shù)據(jù)采集 9 、 nutch 的使用? 一些具體的實踐方法及演示 講師介紹: 楊尚川 ,系統(tǒng)架構(gòu)設(shè)計師,系統(tǒng)分析師, 2013 年度優(yōu)秀開源項目 APDPlat 發(fā)起人,資深 Nutch 搜索引擎專家。多年專業(yè)的軟件研發(fā)經(jīng)驗,從事過管理信息系統(tǒng) (MIS) 開發(fā)、移動智能終端 (Win CE 、 Android 、 Java ME) 開發(fā)、搜索引擎 (nutch 、 lucene 、 solr 、 elasticsearch) 開發(fā)、大數(shù)據(jù)分析處理 (Hadoop 、 Hbase 、 Pig 、 Hive) 等工作。目前為獨立咨詢顧問,專注于大數(shù)據(jù)、搜索引擎等相關(guān)技術(shù),為客戶提供 Nutch 、 Lucene 、 Hadoop 、 Solr 、 ElasticSearch 、 HBase 、 Pig 、 Hive 、 Gora 等框架的解決方案、技術(shù)支持、技術(shù)咨詢以及培訓等服務(wù)。 現(xiàn)場或線上參課 報名: http://www.osforce.cn/opencourse/31.html 技術(shù)問答 2013-09-12 17:30:00 HDC調(diào)試需求開發(fā)(15萬預算),能者速來!>>> 在設(shè)計蜘蛛的時候,要注意些什么?比如索引的頻率,JavaScript的識別,最大化模擬瀏覽器或者直接包裝一個Webkit 在識別網(wǎng)頁元素的時候,要注意些什么?比如價格的識別,商品描述的識別,賣家等級的識別 索引的結(jié)果放入文件還是NoSQL數(shù)據(jù)系統(tǒng)?Cassandra?Hbase?MangoDB?MySQL? 先對索引排序之后放入數(shù)據(jù)系統(tǒng)還是從數(shù)據(jù)系統(tǒng)中取得結(jié)果之后在搜索服務(wù)器上面進行排序,然后返回給瀏覽器? 新手,不懂太多...請高手,教育...指點... 謝先!!! 技術(shù)問答 2011-03-11 23:54:00 HDC調(diào)試需求開發(fā)(15萬預算),能者速來!>>> 爬取網(wǎng)頁的指定信息,不需要保存完整頁面。比方說阿里巴巴的需求信息,爬取后轉(zhuǎn)換為本地數(shù)據(jù)結(jié)構(gòu)數(shù)據(jù)庫存儲。當然,如果它的需求信息更新了,我還得跟新我的本地數(shù)據(jù),所以還的判斷網(wǎng)頁是否更新。索引及查詢用Lucene就行了,現(xiàn)在是抓取部分,不知道哪個軟件定制化程度高一些,而且要容易使用,因為我是菜鳥... 技術(shù)問答 2011-05-12 17:03:00 HDC調(diào)試需求開發(fā)(15萬預算),能者速來!>>> 很多網(wǎng)站是用js或Jquery 生成數(shù)據(jù)的,到后臺獲取到數(shù)據(jù)以后,用 document.write()或者("#id").html="" 的方式 寫到頁面中,這個時候用瀏覽器查看源碼是看不到數(shù)據(jù)的。 HttpClient是不行的,看網(wǎng)上說HtmlUnit,說 可以獲取后臺js加載完后的完整頁面,但是我按照文章上說的 寫了 ,都不好使。一般的代碼是這樣寫的: String url = "http://xinjinqiao.tprtc.com/admin/main/flrpro.do"; try { WebClient webClient = new WebClient(BrowserVersion.FIREFOX_10); //設(shè)置webClient的相關(guān)參數(shù) webClient.getOptions().setJavaScriptEnabled(true); webClient.getOptions().setCssEnabled(false); webClient.setAjaxController(new NicelyResynchronizingAjaxController()); //webClient.getOptions().setTimeout(50000); webClient.getOptions().setThrowExceptionOnScriptError(false); //模擬瀏覽器打開一個目標網(wǎng)址 HtmlPage rootPage = webClient.getPage(url); System.out.println("為了獲取js執(zhí)行的數(shù)據(jù) 線程開始沉睡等待"); Thread.sleep(3000);//主要是這個線程的等待 因為js加載也是需要時間的 System.out.println("線程結(jié)束沉睡"); String html = rootPage.asText(); System.out.println(html); } catch (Exception e) { } 其實根本不好使。 求解答,其中典型的就是這個鏈接的頁面,怎么能在java程序中獲取其中的數(shù)據(jù)? http://xinjinqiao.tprtc.com/admin/main/flrpro.do 技術(shù)問答 2014-07-25 17:27:00 HDC調(diào)試需求開發(fā)(15萬預算),能者速來!>>> 用htmlUnit抓去工商銀行網(wǎng)站(http://www.icbc.com.cn/ICBCDynamicSite2/money/moneytabs.htm)的理財產(chǎn)品時,只能抓去到頁面加載完之后直接顯示的現(xiàn)金管理類-》靈通系列的兩個產(chǎn)品。其他的需要鼠標經(jīng)過才能觸發(fā)的mouseenter事件的產(chǎn)品,就抓去不了。怎么才能爬去到其他div的理財產(chǎn)品呢。跪求大神解惑。 技術(shù)問答 2015-04-27 22:25:00 HDC調(diào)試需求開發(fā)(15萬預算),能者速來!>>> 有誰做過互聯(lián)網(wǎng)爬蟲, 請問有什么比較好的技術(shù)實現(xiàn)網(wǎng)頁中圖片和視頻還有大文本的存儲。 我的初步想法是針對標題做索引用mysql實現(xiàn), 但是大的二進制數(shù)據(jù)不知道怎么處理,有那個大神給支個招! 技術(shù)問答 2016-05-05 22:48:00 HDC調(diào)試需求開發(fā)(15萬預算),能者速來!>>> 用 通常的 對 網(wǎng)站、app 抓包的方式 ,獲取 到 應(yīng)用商店(應(yīng)用寶、360商店 等) 的 下載地址,然后 使用程序 下載,能 實現(xiàn)嗎? 如果能這樣的話,商店的某個 應(yīng)用的 下載量 直接就刷上去了。。。 我分別 使用 wireshark 和 fiddler 嘗試了一下 應(yīng)用寶 ,因為 對 協(xié)議 不是 特別了解,所以 也沒有 獲取到具體的地址。。。也不知道 到底 可不可行。。。 當 點擊下載 ,從fiddler 可以 觀察到 8-9 個 http 連接,但是 這個 連接 和平時 看到的網(wǎng)站的連接 不一樣 :好像 請求頭和響應(yīng)頭 都是 字節(jié)的形式,而且 好像 請求參數(shù) 也不是 明文的,因為看不到 參數(shù)。 這個 地址 就是 應(yīng)用寶的 ip 了。。 查看其中一個,請求頭 只有使用 十六進制的 格式查看 才能看到。。 可以看到 右側(cè)的是"翻譯"的請求頭 響應(yīng) 也是一樣 ,使用 字節(jié)的格式 查看,然后 看到 “翻譯” 響應(yīng)頭,但是 響應(yīng)內(nèi)容 是些 啥 就看不大出來了。。 而且 可以看到 響應(yīng)返回的 MIME 信息為 application/octet-stream , 表示 二進制文件 而且 長度 也不是 文件大小,有可能 是 多次 建立連接,多次 傳輸。。。 (但是 我看了 其他的 非 下載的鏈接 返回的也是這樣的。。。沒有通常的 text/html ,就是說 非下載 的頁面 也是 字節(jié)的 形式 返回的?) 然后 使用 wireshark 試了下。 因為 wireshark 可以監(jiān)測到所有的 協(xié)議,所以 點擊一次下載 產(chǎn)生了 幾十個 連接。 然后 查看其中 的一個 http 協(xié)議的連接。 其實 和 fiddler 的結(jié)果 是 一樣的 可以看到 ip地址和端口 等, 沒有參數(shù),也就 是 沒有找到 地址。 這跟 通常的網(wǎng)頁 的 結(jié)果 是不一樣的,沒有 找到 理想的 http://www.aaaa.com/video/2016-04/29/1.pdf 類似的地址。。。 在應(yīng)用寶的網(wǎng)頁 上 雖然 能得到類似的 文件地址,但是 估計 這個下載 不會 算在 下載量中的。。 還有 就是 可以看到 在 http 請求前 有幾次(按 3次握手來說的話,應(yīng)該是 3次吧。。) tcp 的連接,看到 有文章 說 http 的請求 是 依靠tcp的 建立的 所以 到底 這個 過程 是怎么樣的,就是 整個 連接傳輸?shù)倪^程,應(yīng)該不是 一般 的http 請求、響應(yīng) 過程。。 然后 有可能 實現(xiàn) 程序下載應(yīng)用商店 內(nèi)的 app嗎? 技術(shù)問答 2016-05-05 18:47:00 HDC調(diào)試需求開發(fā)(15萬預算),能者速來!>>> 想使用 Wireshark 攔截請求,比如 一個網(wǎng)站,或者 軟件 通常我的做法是 清空所有 然后 點擊一下,看 產(chǎn)生的新連接。 結(jié)果 Wireshark 里 太多了,十幾萬個 ,而且 不停 唰唰唰 的增加,點了 一下 還沒看清呢,沒了。。。。 再找 也不知道去哪找了。。 使用過濾器吧,光 http的 怕不全。。 使用 ip過濾吧,但是 并不知道 ip 是什么啊,網(wǎng)站還有域名,軟件 沒有啊,根本不知道 ip是什么 而且 ip 是不是準確,而且全不全的 也不確定,比如 有的 軟件 點擊 一次 請求 很多 地址,包含 多個 ip 技術(shù)問答 2016-05-06 18:40:00 HDC調(diào)試需求開發(fā)(15萬預算),能者速來!>>> public boolean updateDraftMail(MailInfo mailInfo, Integer mailType , String mailNum) throws Exception { //已讀寫的方式打開草稿箱 Store store = mailInfo.getReceiveProperties(); //qq郵箱的設(shè)置 String typeName = ""; switch (mailType) { case 1: typeName = "INBOX"; break; case 2: typeName = "Sent Messages"; break; case 3: typeName = "Drafts"; break; default: break; } //暫時只支持qq郵箱 Folder folder = store.getFolder(typeName); folder.open(Folder.READ_WRITE); //讀取已有的郵件 MimeMessage message = null; try { message = (MimeMessage) folder.getMessage(Integer.parseInt(mailNum)); } catch (ArrayIndexOutOfBoundsException ex) { message = (MimeMessage) folder.getMessage(Integer.parseInt(mailNum) - 1); } //更新郵件信息 updateMessageMsg(message, mailInfo); if(null!=folder) folder.close(true); if(null!=store) store.close(); return true; } public void updateMessageMsg(MimeMessage mailMessage, MailInfo mailInfo) throws GeneralSecurityException, MessagingException { //設(shè)置可修改 mailMessage.saveChanges(); try { //設(shè)置自定義發(fā)件人昵稱 String nick=""; try { if(!StringUtil.isEmpty(mailInfo.getNick())){ nick=javax.mail.internet.MimeUtility.encodeText(mailInfo.getNick()); } } catch (UnsupportedEncodingException e) { e.printStackTrace(); } // 設(shè)置郵件消息的發(fā)送者 mailMessage.setFrom(new InternetAddress(nick+" <"+mailInfo.getUsername()+">")); // 創(chuàng)建郵件的接收者地址 to:發(fā)送;cc:抄送 Address[][] maillToArr = getMailToAddress(mailInfo); // 設(shè)置郵件消息的接收者,發(fā)送,抄送 if (maillToArr != null && maillToArr[0] != null && maillToArr[0].length > 0) { mailMessage.setRecipients(Message.RecipientType.TO, maillToArr[0]); } if (maillToArr != null && maillToArr[1] != null && maillToArr[1].length > 0) { mailMessage.setRecipients(Message.RecipientType.CC, maillToArr[1]); } // 設(shè)置郵件消息的主題 mailMessage.setSubject(mailInfo.getSubject()); // 設(shè)置郵件消息發(fā)送的時間 mailMessage.setSentDate(Calendar.getInstance().getTime()); // MimeMultipart類是一個容器類,包含MimeBodyPart類型的對象 Multipart multiPart = new MimeMultipart(); // 創(chuàng)建一個包含HTML內(nèi)容的MimeBodyPart BodyPart bodyPart = new MimeBodyPart(); // 設(shè)置html郵件消息內(nèi)容 bodyPart.setContent(mailInfo.getContent(), "text/html; charset=utf-8"); multiPart.addBodyPart(bodyPart); //添加附件 int i = 0; if(null!=mailInfo.getAttachFilePaths()&&mailInfo.getAttachFilePaths().length != 0){ for(String attachFile : mailInfo.getAttachFilePaths()){ bodyPart=new MimeBodyPart(); FileDataSource fds=new FileDataSource(attachFile); //得到數(shù)據(jù)源 bodyPart.setDataHandler(new DataHandler(fds)); //得到附件本身并放入BodyPart bodyPart.setFileName(MimeUtility.encodeText(mailInfo.getAttachFileNames()[i])); //得到文件名并編碼(防止中文文件名亂碼)同樣放入BodyPart multiPart.addBodyPart(bodyPart); i++; } } // 設(shè)置郵件消息的主要內(nèi)容 mailMessage.setContent(multiPart); } catch (Exception e) { e.printStackTrace(); } } 報錯信息: javax.mail.IllegalWriteException: IMAPMessage is read-only at com.sun.mail.imap.IMAPMessage.setHeader(IMAPMessage.java:813) at javax.mail.internet.MimeMessage.updateHeaders(MimeMessage.java:2181) at javax.mail.internet.MimeMessage.saveChanges(MimeMessage.java:2142) at util.javaEmail.MailSender.updateMessageMsg(MailSender.java:138) at util.javaEmail.MailSender.updateDraftMail(MailSender.java:323) at controller.mail.mailController.updateDraftBox(mailController.java:325) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:497) at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:221) at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:136) at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:110) at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:832) at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:743) at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:85) at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:961) at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:895) at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:967) at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:869) at javax.servlet.http.HttpServlet.service(HttpServlet.java:650) at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:843) at javax.servlet.http.HttpServlet.service(HttpServlet.java:731) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) at org.springframework.orm.hibernate4.support.OpenSessionInViewFilter.doFilterInternal(OpenSessionInViewFilter.java:152) at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:121) at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:61) at org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:108) at org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:137) at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:125) at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:66) at org.apache.shiro.web.servlet.AbstractShiroFilter.executeChain(AbstractShiroFilter.java:449) at org.apache.shiro.web.servlet.AbstractShiroFilter$1.call(AbstractShiroFilter.java:365) at org.apache.shiro.subject.support.SubjectCallable.doCall(SubjectCallable.java:90) at org.apache.shiro.subject.support.SubjectCallable.call(SubjectCallable.java:83) at org.apache.shiro.subject.support.DelegatingSubject.execute(DelegatingSubject.java:383) at org.apache.shiro.web.servlet.AbstractShiroFilter.doFilterInternal(AbstractShiroFilter.java:362) at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:125) at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:346) at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:262) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:218) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:110) at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:506) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:169) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103) at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:962) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:452) at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1087) at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:637) at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:318) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) at java.lang.Thread.run(Thread.java:745) 技術(shù)問答 2017-07-06 13:46:00 HDC調(diào)試需求開發(fā)(15萬預算),能者速來!>>> 最近在做一個項目用到j(luò)avamail推送郵件,我在本地項目(WIN10系統(tǒng))里配置好之后是可以成功發(fā)送郵件的,但是放到服務(wù)器(WIN SERVER 2012 R2)上就有一些問題,沒有報錯,也catch不到異常,但是填寫的郵箱接收不到郵件。這里是代碼。找不到是什么原因,尋求幫助。 final String to = "我自己的郵箱"; final String from = "我自己的郵箱"; final String host = "郵箱服務(wù)器"; final Properties properties = System.getProperties(); properties.setProperty("mail.smtp.host", host); properties.setProperty("mail.smtp.auth", "true"); properties.setProperty("mail.smtp.port", "587"); final Session session = Session.getDefaultInstance(properties, new Authenticator() { @Override protected PasswordAuthentication getPasswordAuthentication() { return new PasswordAuthentication("我的郵箱", "我的郵箱密碼"); } }); try { String nick = ""; try { nick = MimeUtility.encodeText("管理員"); } catch (Exception e) { e.printStackTrace(); } final MimeMessage message = new MimeMessage(session); message.setFrom((Address) new InternetAddress(String.valueOf(nick) + " <" + from + ">")); message.addRecipient(Message.RecipientType.TO, (Address) new InternetAddress(to)); message.setSubject("新留言"); message.setContent( (Object) (" 你好"),"text/html;charset=gb2312"); Transport.send((Message) message); System.out.println("發(fā)送成功"); } catch (MessagingException mex) { System.out.println("發(fā)送失敗"); mex.printStackTrace(); } 技術(shù)問答 2019-01-17 14:49:00 HDC調(diào)試需求開發(fā)(15萬預算),能者速來!>>> 對于使用javamail對郵件進行操作,我的理解是javamail封裝了一系列操作,來執(zhí)行郵件服務(wù)器上命令。 現(xiàn)在我用javamail對郵件進行搜索,它的本質(zhì)是調(diào)用相關(guān)實現(xiàn)了imap協(xié)議的組件的搜索方法。 好了,問題是如果一個用戶收件箱里有10000封郵件,搜索就非常慢。 請問,該如何優(yōu)化呢,我覺得通過javamail是不行了。 各位有何見解? 技術(shù)問答 2011-12-10 22:12:00 |