java爬取
① java網路爬蟲爬取web視頻資源,並下載怎麼做
/*這是個下載圖片的爬蟲,給你參考一下*/
import java.io.File;
import java.net.URL;
import java.net.URLConnection;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.Scanner;
import java.util.UUID;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class DownMM {
public static void main(String[] args) throws Exception {
//out為輸出的路徑,注意要以\\結尾
String out = "D:\\JSP\\pic\\java\\";
try{
File f = new File(out);
if(! f.exists()) {
f.mkdirs();
}
}catch(Exception e){
System.out.println("no");
}
String url = "http://www.mzitu.com/share/comment-page-";
Pattern reg = Pattern.compile("<img src=\"(.*?)\"");
for(int j=0, i=1; i<=10; i++){
URL uu = new URL(url+i);
URLConnection conn = uu.openConnection();
conn.setRequestProperty("User-Agent", "Mozilla/5.0 (Windows NT 6.3; WOW64; Trident/7.0; rv:11.0) like Gecko");
Scanner sc = new Scanner(conn.getInputStream());
Matcher m = reg.matcher(sc.useDelimiter("\\A").next());
while(m.find()){
Files.(new URL(m.group(1)).openStream(), Paths.get(out + UUID.randomUUID() + ".jpg"));
System.out.println("已下載:"+j++);
}
}
}
}
② java爬蟲 怎麼動態的獲取html
package httpclient_learn;import java.io.IOException;import org.apache.http.HttpEntity;import org.apache.http.HttpStatus;import org.apache.http.client.ClientProtocolException;import org.apache.http.client.methods.CloseableHttpResponse;import org.apache.http.client.methods.HttpGet;import org.apache.http.client.utils.HttpClientUtils;import org.apache.http.impl.client.CloseableHttpClient;import org.apache.http.impl.client.HttpClients;import org.apache.http.util.EntityUtils;public class HttpClientTest {
public static void main(String[] args) { //1.生成httpclient,相當於該打開一個瀏覽器
CloseableHttpClient httpClient = HttpClients.createDefault();
CloseableHttpResponse response = null; //2.創建get請求,相當於在瀏覽器地址欄輸入 網址
HttpGet request = new HttpGet("https://www.cnblogs.com/"); try { //3.執行get請求,相當於在輸入地址欄後敲回車鍵
response = httpClient.execute(request);
//4.判斷響應狀態為200,進行處理
if(response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) { //5.獲取響應內容
HttpEntity httpEntity = response.getEntity();
String html = EntityUtils.toString(httpEntity, "utf-8");
System.out.println(html);
} else { //如果返回狀態不是200,比如404(頁面不存在)等,根據情況做處理,這里略
System.out.println("返回狀態不是200");
System.out.println(EntityUtils.toString(response.getEntity(), "utf-8"));
}
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally { //6.關閉 HttpClientUtils.closeQuietly(response);
HttpClientUtils.closeQuietly(httpClient);
}
}
}
③ java爬蟲抓取指定數據
根據java網路編程相關的內容,使用jdk提供的相關類可以得到url對應網頁的html頁面代碼。
針對得到的html代碼,通過使用正則表達式即可得到我們想要的內容。
比如,我們如果想得到一個網頁上所有包括「java」關鍵字的文本內容,就可以逐行對網頁代碼進行正則表達式的匹配。最後達到去除html標簽和不相關的內容,只得到包括「java」這個關鍵字的內容的效果。
從網頁上爬取圖片的流程和爬取內容的流程基本相同,但是爬取圖片的步驟會多一步。
需要先用img標簽的正則表達式匹配獲取到img標簽,再用src屬性的正則表達式獲取這個img標簽中的src屬性的圖片url,然後再通過緩沖輸入流對象讀取到這個圖片url的圖片信息,配合文件輸出流將讀到的圖片信息寫入到本地即可。
④ 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)保存圖片到伺服器上
直接通過下載圖片的方式將圖片保存到伺服器本地。
⑤ java 爬取網頁時爬取不全是什麼原因
這種是用js實現的。所以後面的內容實際上是動態生成的,網路爬蟲抓取的是靜態頁面。 至於解決辦法,網上有幾種: 一種是使用自動化測試工具去做,比如selenium,可以模擬點擊等操作,但是這個其實和爬蟲還是有很大區別的。
⑥ Java中怎麼抓取網頁中的圖片
通過httpclient來爬取網站內容,分析當前內容頁中的圖片『規則』
抓取一般都是模擬瀏覽器訪問目標網頁,通過返回的頁面html代碼進行分析自己需要的數據
查找規則,例如你爬取的網頁 ,看到當前頁面顯示的圖片格式如下<img src="http://www..com/img/20101025_user.png">
通過解析爬取的網頁源代碼(html)進行字元串的操作即可,現在有相應的第三方jar包可以幫你更快的完成這部分工作,例如htmlpaser,獲取到對應的地址,然後進行保存或下載。
你可以搜索,java爬蟲(httpclient)和htmlpaser做更多的了解。
⑦ 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();
}
}
⑧ 如何用JAVA爬取AJAX載入後的頁面
普通的爬取是抓不了js的之後的數據的 可以用phantomjs或者htmlUnit實現
附上phantomjs示列代碼
package cn.wang.utils;
import java.util.Random;
import com.gargoylesoftware.htmlunit.BrowserVersion;
import com.gargoylesoftware.htmlunit.CookieManager;
import com.gargoylesoftware.htmlunit.;
import com.gargoylesoftware.htmlunit.WebClient;
public class htmlUnitUtils {
static WebClient webClient = null;
static Random random = new Random();
static{
//1.創建對象
webClient = new WebClient(BrowserVersion.CHROME);
//2.設置參數
//啟動js
webClient.getOptions().setJavaScriptEnabled(true);
//關閉css渲染
webClient.getOptions().setCssEnabled(false);
//啟動重定向
webClient.getOptions().setRedirectEnabled(true);
//設置連接超時時間 ,這里是10S。如果為0,則無限期等待
webClient.getOptions().setTimeout(1000 * 15);
//啟動cookie管理
webClient.setCookieManager(new CookieManager());
//啟動ajax代理
webClient.setAjaxController(new ());
//js運行時錯誤,是否拋出異常
webClient.getOptions().(false);
//設置瀏覽器請求信息
webClient.addRequestHeader("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8");
webClient.addRequestHeader("Accept-Encoding", "gzip, deflate");
webClient.addRequestHeader("Accept-Language", "zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2");
webClient.addRequestHeader("Connection", "keep-alive");
webClient.addRequestHeader("Upgrade-Insecure-Requests", "1");
}
public static void runJs(String url){
try {
webClient.addRequestHeader("User-Agent", Constant.useragents[random.nextInt(Constant.useragents.length)]);
//等待js渲染執行 waitime等待時間(ms)
webClient.waitForBackgroundJavaScript(1000 * 10);
//3.獲取頁面
webClient.getPage(url);
} catch (Exception e) {
e.printStackTrace();
} finally {
if(webClient != null){
webClient.close();
}
}
}
public static void main(String[] args) {
runJs("http://www.gou.hk/");
System.setProperty("phantomjs.binary.path", "D:\\works\\tool\\phantomjs-2.1.1-windows\\bin\\phantomjs.exe");
}
}
⑨ java怎樣爬取jsp文件
不可能,只能抓取被瀏覽器編譯後的html頁面!
⑩ 使用java語言爬取自己的淘寶訂單看看買了哪些東西
Java爬蟲框架WebMagic簡介及使用
一、介紹
webmagic的是一個無須配置、便於二次開發的爬蟲框架,它提供簡單靈活的API,只需少量代碼即可實現一個爬蟲。webmagic採用完全模塊化的設計,功能覆蓋整個爬蟲的生命周期(鏈接提取、頁面下載、內容抽取、持久化),支持多線程抓取,分布式抓取,並支持自動重試、自定義UA/cookie等功能。
二、概覽
WebMagic項目代碼分為核心和擴展兩部分。核心部分(webmagic-core)是一個精簡的、模塊化的爬蟲實現,而擴展部分則包括一些便利的、實用性的功能(例如註解模式編寫爬蟲等)。
WebMagic的結構分為Downloader、PageProcessor、Scheler、Pipeline四大組件,並由Spider將它們彼此組織起來。這四大組件對應爬蟲生命周期中的下載、處理、管理和持久化等功能。而Spider則將這幾個組件組織起來,讓它們可以互相交互,流程化的執行,可以認為Spider是一個大的容器,它也是WebMagic邏輯的核心。
2.1 WebMagic的四個組件
Downloader
Downloader負責從互聯網上下載頁面,以便後續處理。WebMagic默認使用了Apache HttpClient作為下載工具。
PageProcessor
PageProcessor負責解析頁面,抽取有用信息,以及發現新的鏈接。WebMagic使用Jsoup作為HTML解析工具,並基於其開發了解析XPath的工具Xsoup。在這四個組件中,PageProcessor對於每個站點每個頁面都不一樣,是需要使用者定製的部分。
Scheler
Scheler負責管理待抓取的URL,以及一些去重的工作。WebMagic默認提供了JDK的內存隊列來管理URL,並用集合來進行去重。也支持使用Redis進行分布式管理。除非項目有一些特殊的分布式需求,否則無需自己定製Scheler。
Pipeline
Pipeline負責抽取結果的處理,包括計算、持久化到文件、資料庫等。WebMagic默認提供了「輸出到控制台」和「保存到文件」兩種結果處理方案。Pipeline定義了結果保存的方式,如果你要保存到指定資料庫,則需要編寫對應的Pipeline。對於一類需求一般只需編寫一個Pipeline。
Request
Request是對URL地址的一層封裝,一個Request對應一個URL地址。它是PageProcessor與Downloader交互的載體,也是PageProcessor控制Downloader唯一方式。
Page
Page代表了從Downloader下載到的一個頁面——可能是HTML,也可能是JSON或者其他文本格式的內容。Page是WebMagic抽取過程的核心對象,它提供一些方法可供抽取、結果保存等。
ReusltItems
ReusltItems相當於一個Map,它保存PageProcessor處理的結果,供Pipeline使用。它的API與Map很類似,值得注意的是它有一個欄位skip,若設置為true,則不應被Pipeline處理。
webmagic-core
webmagic-core是WebMagic核心部分,只包含爬蟲基本模塊和基本抽取器。webmagic-extension
webmagic-extension是WebMagic的主要擴展模塊,提供一些更方便的編寫爬蟲的工具。包括註解格式定義爬蟲、JSON、分布式等支持。
Downloader-頁面下載
頁面下載是一切爬蟲的開始。
大部分爬蟲都是通過模擬http請求,接收並分析響應來完成。這方面,JDK自帶的HttpURLConnection可以滿足最簡單的需要,而Apache HttpClient(4.0後整合到HttpCompenent項目中)則是開發復雜爬蟲的不二之選。它支持自定義HTTP頭(對於爬蟲比較有用的就是User-agent、cookie等)、自動redirect、連接復用、cookie保留、設置代理等諸多強大的功能。
webmagic使用了HttpClient 4.2,並封裝到了HttpClientDownloader。學習HttpClient的使用對於構建高性能爬蟲是非常有幫助的,官方的Tutorial就是很好的學習資料。目前webmagic對HttpClient的使用仍在初步階段,不過對於一般抓取任務,已經夠用了
PageProcessor-頁面分析及鏈接抽取
Selector是webmagic為了簡化頁面抽取開發的獨立模塊,是整個項目中我最得意的部分。這里整合了CSS Selector、XPath和正則表達式,並可以進行鏈式的抽取,很容易就實現強大的功能。即使你使用自己開發的爬蟲工具,webmagic的Selector仍然值得一試
Jsoup
HtmlParser
Apache tika
HtmlCleaner與Xpath
這里說的頁面分析主要指HTML頁面的分析。頁面分析可以說是垂直爬蟲最復雜的一部分,在webmagic里,PageProcessor是定製爬蟲的核心。通過編寫一個實現PageProcessor介面的類,就可以定製一個自己的爬蟲
HTML分析是一個比較復雜的工作,Java世界主要有幾款比較方便的分析工具:
webmagic的Selector
Scheler-URL管理
URL管理的問題可大可小。對於小規模的抓取,URL管理是很簡單的。我們只需要將待抓取URL和已抓取URL分開保存,並進行去重即可。使用JDK內置的集合類型Set、List或者Queue都可以滿足需要。如果我們要進行多線程抓取,則可以選擇線程安全的容器,例如LinkedBlockingQueue以及ConcurrentHashMap。因為小規模的URL管理非常簡單,很多框架都並不將其抽象為一個模塊,而是直接融入到代碼中。但是實際上,抽象出Scheler模塊,會使得框架的解耦程度上升一個檔次,並非常容易進行橫向擴展,這也是我從scrapy中學到的。
Pipeline-離線處理和持久化
Pipeline其實也是容易被忽略的一部分。大家都知道持久化的重要性,但是很多框架都選擇直接在頁面抽取的時候將持久化一起完成,例如crawer4j。但是Pipeline真正的好處是,將頁面的在線分析和離線處理拆分開來,可以在一些線程里進行下載,另一些線程里進行處理和持久化。
- <dependency>
- <groupId>us.codecraft</groupId>
- <artifactId>webmagic-core</artifactId>
- <version>0.5.3</version>
- </dependency>
- <dependency>
- <groupId>us.codecraft</groupId>
- <artifactId>webmagic-extension</artifactId>
- <version>0.5.3</version>
- </dependency>1234567891012345678910
2.2 用於數據流轉的對象
2.3 控制爬蟲運轉的引擎—Spider
Spider是WebMagic內部流程的核心。Downloader、PageProcessor、Scheler、Pipeline都是Spider的一個屬性,這些屬性是可以自由設置的,通過設置這個屬性可以實現不同的功能。Spider也是WebMagic操作的入口,它封裝了爬蟲的創建、啟動、停止、多線程等功能。
對於編寫一個爬蟲,PageProcessor是需要編寫的部分,而Spider則是創建和控制爬蟲的入口。
2.4 WebMagic項目組成
WebMagic項目代碼包括幾個部分,在根目錄下以不同目錄名分開。它們都是獨立的Maven項目。
WebMagic主要包括兩個包,這兩個包經過廣泛實用,已經比較成熟:
三、 基本的爬蟲
3.1 爬蟲的流程 (可以參考上邊的框架架構圖)
3.2 使用WebMagic爬取一個壁紙網站
首先引入WebMagic的依賴,webmagic-core-{version}.jar和webmagic-extension-{version}.jar。在項目中添加這兩個包的依賴,即可使用WebMagic。
maven中引入依賴jar包
不使用maven的用戶,可以去http://webmagic.io中下載最新的jar包。