導航:首頁 > 編程語言 > java爬取網頁

java爬取網頁

發布時間:2022-04-21 02:19:15

1. java jsoup怎樣爬取特定網頁內的數據

1、Jsoup簡述

Java中支持的爬蟲框架有很多,比如WebMagic、Spider、Jsoup等。
​ Jsoup擁有十分方便的api來處理html文檔,比如參考了DOM對象的文檔遍歷方法,參考了CSS選擇器的用法等等,因此我們可以使用Jsoup快速地掌握爬取頁面數據的技巧。

2、快速開始

1)分析HTML頁面,明確哪些數據是需要抓取的

2)使用HttpClient讀取HTML頁面
HttpClient是一個處理Http協議數據的工具,使用它可以將HTML頁面作為輸入流讀進java程序中.

3)使用Jsoup解析html字元串
通過引入Jsoup工具,直接調用parse方法來解析一個描述html頁面內容的字元串來獲得一個Document對象。該Document對象以操作DOM樹的方式來獲得html頁面上指定的內容。

3、保存爬取的頁面數據

1)保存普通數據到資料庫中
將爬取的數據封裝進實體Bean中,並存到資料庫內。

2)保存圖片到伺服器上
直接通過下載圖片的方式將圖片保存到伺服器本地。

2. java 抓取網頁數據,要怎麼抓取

如果是一般允許抓取的頁面用 wget就可以抓取了,
不允許抓取的的爬蟲程序可以考慮用HttpClient

3. 如何利用 java 多線程 爬取大量網頁

多線程 爬取網頁

1:減少在創建和銷毀線程上所花的時間以及系統資源的開銷

2:如不使用線程池,有可能造成系統創建大量線程而導致消耗完系統內存.

推薦JSoup ,HttpClient等

JSoup 強在爬取速度快, 解析方便

HttpClient可以提交比較復雜的請求,滿足登陸等復雜需求

4. java如何獲取動態網頁內容

Htmlunit這個工具類,進行http請求訪問,獲取html網頁,以及過濾網頁html標簽獲取網頁文本。
主要的思路還是以下幾點:
1.了解你要爬取的網頁的元素,以及通訊,校驗安全機制。常用方法通過chrome瀏覽器訪問你要獲取的網頁,基本上一個老司機打開F12就差不多知道頁面的表單,數據以及通過什麼樣的請求方式請求服務,並又是怎麼樣返回,載入到頁面進行渲染。如果還不熟悉這個F12,那還不趕快去get起來啊,時間短,效率快,看一遍就知道怎麼用了的好東西不利用起來,不是太浪費了。
2.了解了你要訪問的網頁的你想要獲取的元素之後,就是怎麼發起http的request請求,模擬這個請求獲取response。那這個request就是通過在程序里模擬的瀏覽器器發起,如果成功發起,那麼你需要的數據就藏在這個response里。
3.成功獲取response之後,就是怎麼進行解析,獲取你想要的數據。當然,如果是json數據,那麼解析起來就很容易。如果返回的是整個html,那也是有辦法解析,抽取轉換成需要的文本進行入庫。
接下來,就通過實際的編碼,來如何一步步實現。
有些網站,是通過登陸來取得認證看到更多數據,有些網站可以直接發請求訪問。而我寫的這個列子,就是登陸之後,獲取的網站內部的數據。
基本思路就是,通過登陸拿到令牌,然後拿著這個令牌,去訪問這個網站內你需要訪問的地址,從而獲取數據。來,讓我們看看代碼是如何實現的。

5. java怎麼爬取指定網頁的數據

把下面代碼復制到文本文檔中,然後將文本文檔改成".html"形式這個是提取表格中的數據的方法,看看是你想要的不NewDocument

6. java 怎樣獲取一個網頁的內容 要網頁裡面的表格數據 (通過源碼不能直接獲取數據),請教

根據java網路編程相關的內容,使用jdk提供的相關類可以得到url對應網頁的html頁面代碼。
針對得到的html代碼,通過使用正則表達式即可得到我們想要的內容。

比如,我們如果想得到一個網頁上所有包括「java」關鍵字的文本內容,就可以逐行對網頁代碼進行正則表達式的匹配。最後達到去除html標簽和不相關的內容,只得到包括「java」這個關鍵字的內容的效果。

從網頁上爬取圖片的流程和爬取內容的流程基本相同,但是爬取圖片的步驟會多一步。

需要先用img標簽的正則表達式匹配獲取到img標簽,再用src屬性的正則表達式獲取這個img標簽中的src屬性的圖片url,然後再通過緩沖輸入流對象讀取到這個圖片url的圖片信息,配合文件輸出流將讀到的圖片信息寫入到本地即可。

7. Java網路爬蟲怎麼實現

網路爬蟲是一個自動提取網頁的程序,它為搜索引擎從萬維網上下載網頁,是搜索引擎的重要組成。
傳統爬蟲從一個或若干初始網頁的URL開始,獲得初始網頁上的URL,在抓取網頁的過程中,不斷從當前頁面上抽取新的URL放入隊列,直到滿足系統的一定停止條件。對於垂直搜索來說,聚焦爬蟲,即有針對性地爬取特定主題網頁的爬蟲,更為適合。

以下是一個使用java實現的簡單爬蟲核心代碼:
public void crawl() throws Throwable {
while (continueCrawling()) {
CrawlerUrl url = getNextUrl(); //獲取待爬取隊列中的下一個URL
if (url != null) {
printCrawlInfo();
String content = getContent(url); //獲取URL的文本信息

//聚焦爬蟲只爬取與主題內容相關的網頁,這里採用正則匹配簡單處理
if (isContentRelevant(content, this.regexpSearchPattern)) {
saveContent(url, content); //保存網頁至本地

//獲取網頁內容中的鏈接,並放入待爬取隊列中
Collection urlStrings = extractUrls(content, url);
addUrlsToUrlQueue(url, urlStrings);
} else {
System.out.println(url + " is not relevant ignoring ...");
}

//延時防止被對方屏蔽
Thread.sleep(this.delayBetweenUrls);
}
}
closeOutputStream();
}
private CrawlerUrl getNextUrl() throws Throwable {
CrawlerUrl nextUrl = null;
while ((nextUrl == null) && (!urlQueue.isEmpty())) {
CrawlerUrl crawlerUrl = this.urlQueue.remove();
//doWeHavePermissionToVisit:是否有許可權訪問該URL,友好的爬蟲會根據網站提供的"Robot.txt"中配置的規則進行爬取
//isUrlAlreadyVisited:URL是否訪問過,大型的搜索引擎往往採用BloomFilter進行排重,這里簡單使用HashMap
//isDepthAcceptable:是否達到指定的深度上限。爬蟲一般採取廣度優先的方式。一些網站會構建爬蟲陷阱(自動生成一些無效鏈接使爬蟲陷入死循環),採用深度限制加以避免
if (doWeHavePermissionToVisit(crawlerUrl)
&& (!isUrlAlreadyVisited(crawlerUrl))
&& isDepthAcceptable(crawlerUrl)) {
nextUrl = crawlerUrl;
// System.out.println("Next url to be visited is " + nextUrl);
}
}
return nextUrl;
}
private String getContent(CrawlerUrl url) throws Throwable {
//HttpClient4.1的調用與之前的方式不同
HttpClient client = new DefaultHttpClient();
HttpGet httpGet = new HttpGet(url.getUrlString());
StringBuffer strBuf = new StringBuffer();
HttpResponse response = client.execute(httpGet);
if (HttpStatus.SC_OK == response.getStatusLine().getStatusCode()) {
HttpEntity entity = response.getEntity();
if (entity != null) {
BufferedReader reader = new BufferedReader(
new InputStreamReader(entity.getContent(), "UTF-8"));
String line = null;
if (entity.getContentLength() > 0) {
strBuf = new StringBuffer((int) entity.getContentLength());
while ((line = reader.readLine()) != null) {
strBuf.append(line);
}
}
}
if (entity != null) {
nsumeContent();
}
}
//將url標記為已訪問
markUrlAsVisited(url);
return strBuf.toString();
}
public static boolean isContentRelevant(String content,
Pattern regexpPattern) {
boolean retValue = false;
if (content != null) {
//是否符合正則表達式的條件
Matcher m = regexpPattern.matcher(content.toLowerCase());
retValue = m.find();
}
return retValue;
}
public List extractUrls(String text, CrawlerUrl crawlerUrl) {
Map urlMap = new HashMap();
extractHttpUrls(urlMap, text);
extractRelativeUrls(urlMap, text, crawlerUrl);
return new ArrayList(urlMap.keySet());
}
private void extractHttpUrls(Map urlMap, String text) {
Matcher m = (text);
while (m.find()) {
String url = m.group();
String[] terms = url.split("a href=\"");
for (String term : terms) {
// System.out.println("Term = " + term);
if (term.startsWith("http")) {
int index = term.indexOf("\"");
if (index > 0) {
term = term.substring(0, index);
}
urlMap.put(term, term);
System.out.println("Hyperlink: " + term);
}
}
}
}
private void extractRelativeUrls(Map urlMap, String text,
CrawlerUrl crawlerUrl) {
Matcher m = relativeRegexp.matcher(text);
URL textURL = crawlerUrl.getURL();
String host = textURL.getHost();
while (m.find()) {
String url = m.group();
String[] terms = url.split("a href=\"");
for (String term : terms) {
if (term.startsWith("/")) {
int index = term.indexOf("\"");
if (index > 0) {
term = term.substring(0, index);
}
String s = //" + host + term;
urlMap.put(s, s);
System.out.println("Relative url: " + s);
}
}
}

}
public static void main(String[] args) {
try {
String url = "";
Queue urlQueue = new LinkedList();
String regexp = "java";
urlQueue.add(new CrawlerUrl(url, 0));
NaiveCrawler crawler = new NaiveCrawler(urlQueue, 100, 5, 1000L,
regexp);
// boolean allowCrawl = crawler.areWeAllowedToVisit(url);
// System.out.println("Allowed to crawl: " + url + " " +
// allowCrawl);
crawler.crawl();
} catch (Throwable t) {
System.out.println(t.toString());
t.printStackTrace();
}
}

8. 如果運用java獲取其他網站的內容

簡單的jsoup爬取,靜態頁面形式;

String url="a.atimo.cn";//靜態頁面鏈接地址
Document doc = Jsoup.connect(url).userAgent("Mozilla").timeout(4000).get();
if(doc!=null){

Elements es = doc.select("div.comments>ul>li");// System.out.println(es);
if(es!=null && es.size()>0){
for (Element element : es) {

String link = element.select("div>h3").attr("href");

String title = element.select("div>h3").text();

String author = element.select("div.c-abstract>em").text();

String content = element.select("dd>a>div.icos>i:eq(1)").text();

}

}

}

通過jsop解析返回Document 使用標簽選擇器,選擇頁面標簽中的值,即可獲取頁面內容。

9. java 網路爬蟲怎麼實現

以爬取豆瓣《紅海行動》的所有評論為例,目標是爬取所有評論以及發表評論的用戶名。

getHtml()類,首先是URL url1=new URL(url);模擬在網頁輸入網址,接著 URLConnection uc=url1.openConnection();模擬敲回車鍵打開該網址頁面,後面的看注釋應該能看懂了。bf.readLine()是依次每行讀取頁面的源碼,

/**
* 下載HTML頁面源碼
* @author yangjianxin
* @return string @author yangjianxin
* @time 2018-03-09
*/

public static String getHtml(String url,String encoding) {
StringBuffer sb=new StringBuffer();
BufferedReader bf = null;
InputStreamReader isr = null;
try {
//創建網路連接
URL url1=new URL(url);
//打開網路
URLConnection uc=url1.openConnection();
uc.setRequestProperty("User-Agent", "Mozilla/4.0 (compatible; MSIE 5.0; Windows NT; DigExt)");
//建立文件輸入流
isr=new InputStreamReader(uc.getInputStream(),encoding);
//高效率讀取
bf=new BufferedReader(isr);
//下載頁面源碼

String temp=null;
while((temp=bf.readLine())!=null) {
sb.append(temp+"\n");
}
//System.out.println(sb.toString());

} catch (MalformedURLException e) {
System.out.println("網頁打開失敗,請重新輸入網址。");
e.printStackTrace();
}catch (IOException e) {
System.out.println("網頁打開失敗,請檢查網路。");
e.printStackTrace();
}finally {
if(bf!=null) {try {
bf.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
if(isr!=null) {
try {
isr.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
return sb.toString();

}

getGoalDate()類,Document document=Jsoup.parse(html),運用Jsoup.parse()解析網頁源碼,接著就是開始確定自己需要爬取的東西在網頁里的位置,這需要我們對html有點了解,能看、讀懂網頁標簽,可以看出當前頁面的所有評論都在id為"content"的大盒子里,每條評論都在class名為"main review-item"的小盒子里, for(Element el:elments)是指對象el在當前頁面循環去小盒子"main review-item"查找我們要爬取的東西,也就是用戶名和評論, String name=el.getElementsByClass("name").text()中的「name」可以在當前盒子里查找到用戶名,用.text()將它賦予給變數name,同理評論也是這樣抓取,如果不用將它存入磁碟,則可以後面那段文件操作刪除,只列印就行

10. 如何使用Java抓取網頁上指定部分的內容

1. 你可以選擇用Java代碼來找到整個網頁的html代碼,如下
(注意在處理網頁方面的內容時,需要導入htmlparser包來支持)

import org.htmlparser.util.ParserException;
import org.htmlparser.visitors.HtmlPage;
import org.htmlparser.Parser;
import org.htmlparser.filters.HasAttributeFilter;
import org.htmlparser.util.NodeList;

public class htmlmover {
public static void main(String[] args){
NodeList rt= getNodeList("http://forex.hexun.com/rmbhl/");
System.out.println(rt.toHtml());
}
public static NodeList getNodeList(String url){
Parser parser = null;
HtmlPage visitor = null;
try {
parser = new Parser(url);
parser.setEncoding("GBK");
visitor = new HtmlPage(parser);
parser.visitAllNodesWith(visitor);
} catch (ParserException e) {
e.printStackTrace();
}
NodeList nodeList = visitor.getBody();
return nodeList;
}
}

以上代碼,public static NodeList getNodeList(String url) 為主體
傳入需要分析網頁的 url(String類型),返回值是網頁Html節點List(Nodelist類型)
這個方法我沒有什麼要說的,剛開始的時候沒看懂(沒接觸過),後來用了幾次也懂點皮毛了
注意: parser.setEncoding("GBK"); 可能你的工程編碼格式是UTF-8,有錯誤的話需要改動

運行該程序

2.通過瀏覽器工具直接查看 IE是按F12 (剛開始沒發現這個方法,於是傻乎乎地找上面的代碼)

分析你所獲得的html代碼讓人眼花繚亂,不要緊,找到自己需要趴取的內容,找到它上下文有特徵的節點

<!--中行牌價 開始-->
<div id="sw01_con1">
<table width="655" border="0" cellspacing="0" cellpadding="0" class="hgtab">
<thead>
<tr>
<th width="85" align="center" class="th_l">交易幣種</th>
<th width="80" align="center">交易單位</th>
<th width="130" align="center">現價(人民幣)</th>
<th width="80" align="center">賣出價</th>
<th width="100" align="center">現匯買入價</th>
<th width="95" align="center">現鈔買入價</th>
</tr>
</thead>
<tbody>
<tr align="center">
<td> 英鎊</td>
<td>100</td>
<td>992.7</td>
<td>1001.24</td>
<td>993.26</td>
<td class="no">962.6</td>
</tr>
<tr align="center" bgcolor="#f2f3f4">
<td> 港幣</td>
<td>100</td>
<td>81.54</td>
<td>82.13</td>
<td>81.81</td>
<td class="no">81.16</td>
</tr>
<tr align="center">
<td> 美元</td>
<td>100</td>
<td>635.49</td>
<td>639.35</td>
<td>636.8</td>
<td class="no">631.69</td>
</tr>
<tr align="center" bgcolor="#f2f3f4">
<td> 瑞士法郎</td>
<td>100</td>
<td>710.89</td>
<td>707.78</td>
<td>702.14</td>
<td class="no">680.46</td>
</tr>
<tr align="center">
<td> 新加坡元</td>
<td>100</td>
<td>492.45</td>
<td>490.17</td>
<td>486.27</td>
<td class="no">471.25</td>
</tr>
<tr align="center" bgcolor="#f2f3f4">
<td> 瑞典克朗</td>
<td>100</td>
<td>93.66</td>
<td>93.79</td>
<td>93.04</td>
<td class="no">90.17</td>
</tr>
<tr align="center">
<td> 丹麥克朗</td>
<td>100</td>
<td>116.43</td>
<td>115.59</td>
<td>114.67</td>
<td class="no">111.13</td>
</tr>
<tr align="center" bgcolor="#f2f3f4">
<td> 挪威克朗</td>
<td>100</td>
<td>110.01</td>
<td>109.6</td>
<td>108.73</td>
<td class="no">105.37</td>
</tr>
<!--{2011-10-01 23:16:00}-->
</tbody>
</table>
</div>
<!--中行牌價 結束-->

大家可以看到這是一段很有規律,書寫非常規范的Html代碼(這只是第一部分,中行牌價,可以想像,接下來還會有並列的 相似的3部分)

大家想截取這些節點中的數據
以下代碼仍需導入htmlparser Java支持包
import java.util.ArrayList;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import org.htmlparser.Node;
import org.htmlparser.NodeFilter;
import org.htmlparser.Parser;
import org.htmlparser.util.NodeList;
import org.htmlparser.util.ParserException;

public class Currencyrate {
public static void main(String[] args){
String url="http://forex.hexun.com/rmbhl/";
ArrayList<String> rt= getNodeList(url);
for (int i = 0; i < rt.size(); i++){
System.out.println(rt.get(i));
}
}

public static ArrayList<String> getNodeList(String url){
final ArrayList<String> result=new ArrayList<String>();
Parser parser = null;
NodeList nodeList=null;
try {
parser = new Parser(url);
parser.setEncoding("GBK");

nodeList = parser.parse(
new NodeFilter(){
@Override
public boolean accept(Node node){
Node need=node;
if(getStringsByRegex(node.getText())){
for(int i=0;i<6;i++){
result.add(need.toPlainTextString()); need=need.getPreviousSibling().getPreviousSibling();
}
return true;
}
return false;
}
}
);
}catch (ParserException e) {
e.printStackTrace();
}
return result;
}

public static boolean getStringsByRegex(String txt) {
String regex="td class=\"no\"";
Pattern p = Pattern.compile(regex);
Matcher m = p.matcher(txt);
if (m.find()){
return true;
}
return false;
}
}

廢話不多說,
public static ArrayList<String> getNodeList(String url) 主要方法
parser.setEncoding("GBK"); 需要注意,代碼編碼格式

nodeList = parser.parse(
new NodeFilter(){
@Override
public boolean accept(Node node){
}

);
nodelist是html節點的列表,現在使用NodeFilter ( 節點過濾器 )實例, 重載NodeFilter類中的accept()方法
在parser這個Parser類訪問整個html頁面的時候,每遇到一個html節點,就會訪問這個
accept()方法,返回True的話就會將這個節點 放進nodelist中,否則就不會將這個節點放進去。這個就是NodeFilter功能。
代碼段一獲取整個html頁面時候 parser.visitAllNodesWith(visitor); 就是獲取所有節點

所以現在我們要趴取網頁上的內容,只要告訴accept()這個方法,哪些節點要放進nodelist去,即 遇到哪些節點需要返回true。
於是
public boolean accept(Node node){
Node need=node;
if(getStringsByRegex(node.getText())){
for(int i=0;i<6;i++){
result.add(need.toPlainTextString()); need=need.getPreviousSibling().getPreviousSibling();
}
return true;
}
return false;
}
Parser類在遇到節點,就把這個節點拿過去問accept(),於是accept()方法分析,如果滿足getStringsByRegex(node.getText())就要了

接下來分析getStringsByRegex(),只剩下最後一步了,大家堅持啊!

String regex="td class=\"no\"";
Pattern p = Pattern.compile(regex);
Matcher m = p.matcher(txt);
if (m.find()){
return true;
}
return false;
}
大家可以發現我們索要的每一段都是
<tr align="center">
<td> 英鎊</td>
<td>100</td>
<td>992.7</td>
<td>1001.24</td>
<td>993.26</td>
<td class="no">962.6</td>
</tr>
所以只要找到<td class="no">這個節點就行了,我們用正則表達式去比較
String regex="td class=\"no\""; 這個是比較標准(正則表達式 td class=」no」 其中兩個引號需要作為轉義字元來表示 成\「 )
變數txt是我們傳過去的需要比較的節點的node.getText(),如果符合的話m.find就是true,於是getStringsByRegex()返回true,說明這個節點就是我們所需要的哪些節點,於是
for(int i=0;i<6;i++){
result.add(need.toPlainTextString()); need=need.getPreviousSibling().getPreviousSibling();
}
每一段html,6個為一組,先是962.6,然後是993.26,1001.24,992.7,100,英鎊分別被add進result這個ArrayList<String>中去,返回,這個ArrayList裝的就是我們需要抓取的數據

大家可以把我們所獲得的String數據數出來試試看,是不是我們需要的順序,main()函數獲得ArrayList<String>,就可以顯示到我們所需要的Java widget上去了

閱讀全文

與java爬取網頁相關的資料

熱點內容
人工智慧編譯視頻 瀏覽:524
什麼新聞app比較真實 瀏覽:347
自製編譯器自製編程語言 瀏覽:111
python常態開發 瀏覽:133
復制加密卡到榮耀手錶 瀏覽:679
dellemc伺服器如何安裝系統 瀏覽:705
python爬取整個網頁 瀏覽:664
程序員搞笑圖片上線 瀏覽:776
杜pdf 瀏覽:233
小米直播伺服器地址 瀏覽:487
redhatlinux服務 瀏覽:548
APP頁面頂端展示畫面叫什麼 瀏覽:820
python兩點間距離 瀏覽:183
新程序員珠海和武漢哪個適合發展 瀏覽:275
爬取vip視頻python代碼 瀏覽:668
單片機中trisd什麼意思 瀏覽:129
計算機編程天才 瀏覽:930
伺服器如何調高解析度 瀏覽:33
機匯app為什麼這么便宜 瀏覽:144
反饋控制演算法 瀏覽:582