Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537
Java中支持的爬蟲框架有很多,比如WebMagic、Spider、Jsoup等。今天我們使用Jsoup來實現一個簡單的爬蟲程序。
?Jsoup擁有十分方便的api來處理html文檔,比如參考了DOM對象的文檔遍歷方法,參考了CSS選擇器的用法等等,因此我們可以使用Jsoup快速地掌握爬取頁面數據的技巧。
1)編寫HTML頁面
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Insert title here</title>
</head>
<body>
<table>
<thead>
<tr>
<td>商品名字</td>
<td>商品圖片</td>
</tr>
</thead>
<tbody>
<tr>
<td class="pname">product1</td>
<td class="pimg"><img src="img/1.bmp"/></td>
</tr>
<tr>
<td class="pname">product2</td>
<td class="pimg"><img src="img/2.bmp"/></td>
</tr>
</tbody>
</table>
</body>
</html>
頁面中表格的商品信息是我們要爬取的數據。其中屬性pname類的商品名稱,以及屬于pimg類的商品圖片。
2)使用HttpClient讀取HTML頁面
HttpClient是一個處理Http協議數據的工具,使用它可以將HTML頁面作為輸入流讀進java程序中。可以從http://hc.apache.org/下載HttpClient的jar包。
//獲得HttpClient對象
HttpClient httpClient=new DefaultHttpClient();
//定義要爬取數據的目標頁面url
String url="http://localhost:8080/MyShop/shop.jsp";
//使用HttpGet對象綁定url
HttpGet httpGet=new HttpGet(url);
//訪問url獲得響應消息封裝在HttpResponse對象中
HttpResponse httpResponse=httpClient.execute(httpGet);
//entity中是響應消息的實體
HttpEntity entity=httpResponse.getEntity();
//使用EntityUtils的toString獲得url指定頁面的字符串內容,即html本身
String html=EntityUtils.toString(entity);
System.out.println(html);
3)使用Jsoup解析html字符串
通過引入Jsoup工具,直接調用parse方法來解析一個描述html頁面內容的字符串來獲得一個Document對象。該Document對象以操作DOM樹的方式來獲得html頁面上指定的內容。相關API可以參考Jsoup官方文檔:https://jsoup.org/cookbook/
下面我們使用Jsoup來獲取上述html中指定的商品名稱和價格的信息。
//JSOUP解析頁面數據,獲得Document對象
Document doc=Jsoup.parse(html);
//在Document對象的select方法中使用選擇器來獲得指定的元素,該選擇器與CSS及Jquery的選擇器相同。
Elements eles=doc.select("table tbody tr .pname");
Element ele=eles.get(0);
//獲得指定元素的文本內容
System.out.println(ele.text());
Elements ele_imgs=doc.select("table tbody img");
//獲得指定元素的src屬性的值
String img_src=ele_imgs.get(0).attr("src");
System.out.println(img_src);
至此,我們已經實現使用HttpClient+Jsoup爬取HTML頁面數據的功能。接下來,我們讓效果更直觀一些,比如將爬取的數據存到數據庫中,將圖片存到服務器上。
1)保存普通數據到數據庫中
將爬取的數據封裝進實體Bean中,并存到數據庫內。
//將數據封裝到Javabean中
Product p=new Product();
p.setPid(UUID.randomUUID().toString());
p.setPname(ele.text());
p.setPimg(img_src);
//將存入數據庫中
ProductDao dao=new ProductDao();
try {
dao.addProduct(p);
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//dao的操作
public void addProduct(Product p) throws SQLException {
QueryRunner qr=new QueryRunner(JDBCUtil.getDataSource());
String sql="insert into product values(?,?,?)";
qr.update(sql,p.getPid(),p.getPname(),p.getPimg());
}
2)保存圖片到服務器上
直接通過下載圖片的方式將圖片保存到服務器本地。
private void downloadImg(HttpServletRequest request,Product p) throws ClientProtocolException, IOException {
//獲得圖片的原url
String url="http://localhost:8080"+p.getPimg();
//使用HttpClient獲得圖片資源
HttpClient httpClient=new DefaultHttpClient();
HttpGet httpGet=new HttpGet(url);
HttpResponse httpResponse=httpClient.execute(httpGet);
//獲得請求的圖片資源的輸入流
InputStream is=httpResponse.getEntity().getContent();
//在服務器本地創建文件,用于接收圖片
String img_name=p.getPimg().substring(p.getPimg().lastIndexOf("/")+1);
String realPath=request.getRealPath("/Download/"+img_name);
File dir=new File(request.getRealPath("/Download"));
if(!dir.exists()){
//如果文件夾不存在,則創建
dir.mkdirs();
}
//讀寫數據,保存圖片
File file=new File(realPath);
FileOutputStream fos=new FileOutputStream(file);
int b=0;
while((b=is.read())!=-1){
fos.write(b);
}
fos.close();
}
本案簡單實現了使用HttpClient+Jsoup爬取網絡數據,對于爬蟲技術本身,還有很多值得深挖的地方,以后再為大家講解。
何配置一個從網頁爬去數據的java項目
用工具如myeclipse,可以新建項目,然后把java代碼放在src目錄下,把 html或者jsp頁面放到webroot目錄下,當然可以自己新建目錄,js放的位置要看你html中自己引用的相對目錄是什么,jat包需要放在lib目錄下,如果開發環境沒有部署tomcat,還得自己部署。
如果只是一個單純的java項目,只想讓java程序運行,那就只需要安裝好jdk,就可以執行java程序了。否則那就需要安裝tomcat或者其他的網絡應用服務器,也就是jsp頁面。
枷鎖
如果不想借助myeclipse等集成環境,那可以在tomcat中自己建立項目目錄,一定放在root文件夾下,然后是web-inf,實在不會的話可以把你要部署的項目代碼什么的都粘貼上來,會有人手把手教你如何部署。
sql文件是以字符串形式存在的,一般是用于生成初始化數據庫。如果是擴展性好的程序,一般都有一個配置文件,說明sql文件的路徑。然后在java代碼中,根據配置文件找到sql文件,以字符串形式打開,然后讀取字符串,作為sql語句執行。這個過程不需要考慮會不會出錯,因為完整的項目都已經做好了處理。
所以,sql文件應該放到最初的位置不要動它,或者安裝說明把它挪到應該在的地方。
科技
爬取指定網站的數據de的java代碼
Package zy.crawl.hupu;
Import java.io.IOException;
Import zy.crawl.common.*;
Import java.util.ArrayList;
Import java.util.List;
Import org.apache.http.HttpEntity;
Import org.apache.http.HttpHost;
Import org.apache.http.HttpResponse;
Import org.apache.http.HttpStatus;
Import org.apache.http.client.HttpClient;
Import org.apache.http.client.methods.HttpGet;
Import org.apache.http.conn.params.ConnRoutePNames;
Import org.apache.http.impl.client.DefaultHttpClient;
Import org.apache.http.params.CoreConnectionPNames;
Import org.apache.http.util.EntityUtils;
Import org.jsoup.Jsoup;
Import org.jsoup.nodes.Document;
Import org.jsoup.nodes.Element;
Import org.jsoup.select.Elements;
Publicclass rawlHupu
{
Private List<NewsInfo>newsList=newArrayList<>();//用來存儲爬取的信息對象
Public StringGetHtml(Stringurl)//還方法是設置網絡鏈接,是固定的用法
{
Stringhtml=null;
HttpClient httpClient=new DefaultHttpClient();
術棧定義
一般來說是指將N種技術互相組合在一起(N>1),作為一個有機的整體來實現某種目的或功能。也可以指掌握這些技術以及配合使用的經驗。
舉個例子:
開發一個普通OA(辦公自動化)系統,我們使用了html+css+javascript+vue+ Spring Boot+Spring cloud+hibernate + Spring+rocket Mq+Redis+Es+linux+ mysql等等,這些技術加起來就可以稱為技術棧。
互聯網公司的技術棧整體分為5大塊:前端、后端、中間件、運維和工具。
下面就分別給大家解釋一下最重要的前端、后端運用了哪些技術,這些技術又能解決什么問題。
前端技術棧
01
使用css3作為頁面的樣式控制
解決頁面渲染問題。
02
使用Html5作為頁面結構的標簽語言
解決移動端的頁面兼容性問題。
03
使用seajs框架
解決項目中模塊開發和加載的問題。
04
使用使用Jquery前端js框架
解決方便操作頁面元素的問題。
05
引用流行的前端插件實現業務需求
使用bootstrapValidator作為表單的驗證插件
使用bootstrap進行頁面的布局;
使用layer作為彈窗插件;
使用jQuery cxSelect 實現下拉列表的多級聯動;
使用bootstrap fileinput完成多文件的上傳;
使用icheck完成對多選框的美化;
使用百度ueditor解決復雜內容編輯場景。
06
自定義業務插件抽取
主要解決系統導出使用的功能代碼重復性問題。收藏功能;點贊功能;評論功能;留言功能;關注功能;頁面多處個人信息的設置;頁面多處商品頁面調起支付的功能;題庫的組卷系統中的試題欄。
后端技術棧
01
項目分層思想實現分布式架構
Core層(中心、核心):與業務無關,提供基礎的能力,比如:數據庫持久,redis緩存,http封裝,通用工具。統一的core項目,提供基礎的能力we-core-Db項目:mybatis的mapper的基礎上做了二次封裝;we-core-redis項目:基于jedis的基礎上做了二次封裝;we-core-web:存放一些與web環境下使用的工具類和處理器;自定義web環境;使用的aop注解;統一的異常處理器;自定義分頁標簽的。 base層(根基、基礎):該層中的項目有且只能代表一個真實存在而且能獨立存在的核心實體對應的業務。 business層(業務邏輯層):業務層,解決多端,多項目公用的業務流程。 web層:為互聯網用戶提供對外服務,在這層的每一個項目都有自己不被共享的業務。
02
抽取獨立服務實現服務共享
好多項目都會使用到很多相同的服務,我們會把它抽取成獨立的項目,先以jar包的方式提供公用。 比如:短信服務,郵件服務,字典服務,收藏服務,關注服務,訂單服務,支付服務3. 基于jedis的基礎上做了二次封裝,實現java對redis的讀寫。應用場景: 整個項目使用統一的id生成策略。 使用緩存進行存放freemark代碼片段的內容,解決高頻查詢數據給服務器帶來的壓力。
03
使用maven進行項目的管理
使用maven自定義骨架可以實現公司內部創建項目模板化,減少大家創建項目時的時間,創建完就能使用;使用maven的聚合的特性實現多項目統一進行構建;使用maven繼承的特性實現同一項目的不同maven工程的相同配置問題;使用maven的屬性我們可以使用自定義變量以及訪問其他配置項值解決我們配置重復的問題;使用maven幫助我們規范工程資源的的存放;使用maven的依賴特性可以解決我們,jar包之間的依賴,排出依賴。;使用maven倉庫的http代理可以實現讓maven幫助我們查找,下載所需的jar包,我們只需要指定依賴的gav;使用maven我們把公司自己的開發的項目發布到nexus上供其他的項目使用。
04
使用nexus進行內網私服搭建
解決jar包重復下載的問題; 解決公司內部項目共享的問題; maven倉庫以外的jar包管理。
05
使用gitlab進行項目的版本管理
解決團隊多人協同開發項目的問題,我們團隊制定了使用git開發的規范流程。
06
使用jenkins/hudson實現項目的自動化部署
解決項目自動化構建,發布,回滾等問題;定時構建及時發現項目中的問題;實現一鍵發布縮短發布的時間;自動構建和發布的大致流程;從gitlab上拉取最新的代碼;使用maven進行構建項目;將構建完成的項目使用scp復制到指定服務器中;并通過遠程調用指定服務器的腳本進行項目的發布。
07
使用mysql進行數據存儲
這個不用多解釋。
08
使用Spring+SpringMvc+Mybitas
使用經典的ssm作為平臺的MVC框架, 處理http請求,處理業務邏輯,訪問數據庫。
09
使用hibernateValidator
實現后端接收到的參數進行參數的合法性驗證,像非空,最小,最大,范圍等。
10
使用spring mvc的攔截器
實現項目內的權限控制,比如:sso權限驗證,角色的驗證,支付的驗證等。
11
使用spring mvc的AOP
實現多處相同代碼抽取出來使用AOP的方式進行公用,比如:json視圖的固定格式返回。
12
使用logback
作為架構的日志框架。
13
使用flying-saucer+itext+freemark
解決項目中pdf的應用場景,比如:學生下載的準考證,測試報告等。
14
使用JavaMail技術
實現郵件的發送服務。
15
使用TestNg+H2
實現進行單元化測試,保證代碼質量。
16
使用Cookie+Redis
實現平臺單點登錄。
17
實現SpringMvc提供
的HandlerExceptionResolver接口
使用spring提供HandlerExceptionResolver實現全站統一異常處理。 包括:業務異常,登錄超時異常,其他異常。
18
實現SpringMvc提供
的ServletContextAware接口
可以實現項目啟動時添加一些操作。 初始化freemarker的配置; 初始化項目全局共享的靜態變量(域名,文件存儲目錄等)。
19
使用Quartz
實現定時任務處理。
20
使用網絡爬蟲技術Jsoup
解決爬取其他網站的數據信息問題。
21
使用Qdcode
解決生成二維碼的功能。
22
使用jsp的自定義標簽
解決全站分頁的實現。
23
使用阿里的Druid
作為連接數據庫的連接池。
24
使用spring的Ioc容器解決對象的依賴注入
使用Ioc實現指定特定接口的實現類以應對業務實現的變化;使用ioc實現業務中需要的配置注入,防止參數值寫死。
25
使用CXF或者Axis
實現通過WebService和第三方進行對接。
26
結合自定義注解+反射
實現對方法訪問的控制以及添加額外業務邏輯。
比如:個人信息在多個請求Controller中都需要填充。
27
使用Mybatis框架
解決數據持久化的問題;引入開源的:Mybatis的Mapper接口的方式實現支持單表的curd,避免寫更多的重復代碼;引入pagehelper解決mybatis的分頁問題;使用Mybatis的Interceptor實現sql的打印功能。
28
使用Jsp,Freemark
作為視圖層的處理技術。
29
使用Freemark+字符串替換實現自定義vt標簽
自定義視圖標簽主要為了解決像字典那種字段不斷需要跨表查詢的問題。
30
自定義json視圖
自定義json視圖是為了實現規定json返回的統一格式。
31
使用El表達式和jstl標簽庫
解決訪問model中的數據以及頁面上顯示的邏輯處理。
32
使用自定義注解實現某些功能的標注
在處理json返回值的時候可以在標注一下@Void就表示不需要包裹; 在sso攔截權限的時候可以標注一下方法是否需要攔截; 在多個Controller里都需要設置用戶信息到頁面的時候,我們可以利用Aop+Annotation的方式實現。
會用一種是入門,全部會用是大神!
*請認真填寫需求信息,我們會在24小時內與您取得聯系。