。。。 你這問的 也太抽象了好么 你起碼把cityCode和order的關系給出來啊。。。
創(chuàng)新互聯(lián)是專業(yè)的官渡網(wǎng)站建設公司,官渡接單;提供成都網(wǎng)站建設、網(wǎng)站制作,網(wǎng)頁設計,網(wǎng)站設計,建網(wǎng)站,PHP網(wǎng)站建設等專業(yè)做網(wǎng)站服務;采用PHP框架,可快速的進行官渡網(wǎng)站開發(fā)網(wǎng)頁制作和功能擴展;專業(yè)做搜索引擎喜愛的網(wǎng)站,專業(yè)的做網(wǎng)站團隊,希望更多企業(yè)前來合作!
Java爬蟲框架WebMagic簡介及使用
一、介紹
webmagic的是一個無須配置、便于二次開發(fā)的爬蟲框架,它提供簡單靈活的API,只需少量代碼即可實現(xiàn)一個爬蟲。webmagic采用完全模塊化的設計,功能覆蓋整個爬蟲的生命周期(鏈接提取、頁面下載、內容抽取、持久化),支持多線程抓取,分布式抓取,并支持自動重試、自定義UA/cookie等功能。
二、概覽
WebMagic項目代碼分為核心和擴展兩部分。核心部分(webmagic-core)是一個精簡的、模塊化的爬蟲實現(xiàn),而擴展部分則包括一些便利的、實用性的功能(例如注解模式編寫爬蟲等)。
WebMagic的結構分為Downloader、PageProcessor、Scheduler、Pipeline四大組件,并由Spider將它們彼此組織起來。這四大組件對應爬蟲生命周期中的下載、處理、管理和持久化等功能。而Spider則將這幾個組件組織起來,讓它們可以互相交互,流程化的執(zhí)行,可以認為Spider是一個大的容器,它也是WebMagic邏輯的核心。
2.1 WebMagic的四個組件
Downloader
Downloader負責從互聯(lián)網(wǎng)上下載頁面,以便后續(xù)處理。WebMagic默認使用了Apache HttpClient作為下載工具。
PageProcessor
PageProcessor負責解析頁面,抽取有用信息,以及發(fā)現(xiàn)新的鏈接。WebMagic使用Jsoup作為HTML解析工具,并基于其開發(fā)了解析XPath的工具Xsoup。在這四個組件中,PageProcessor對于每個站點每個頁面都不一樣,是需要使用者定制的部分。
Scheduler
Scheduler負責管理待抓取的URL,以及一些去重的工作。WebMagic默認提供了JDK的內存隊列來管理URL,并用集合來進行去重。也支持使用Redis進行分布式管理。除非項目有一些特殊的分布式需求,否則無需自己定制Scheduler。
Pipeline
Pipeline負責抽取結果的處理,包括計算、持久化到文件、數(shù)據(jù)庫等。WebMagic默認提供了“輸出到控制臺”和“保存到文件”兩種結果處理方案。Pipeline定義了結果保存的方式,如果你要保存到指定數(shù)據(jù)庫,則需要編寫對應的Pipeline。對于一類需求一般只需編寫一個Pipeline。
2.2 用于數(shù)據(jù)流轉的對象
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處理。
2.3 控制爬蟲運轉的引擎—Spider
Spider是WebMagic內部流程的核心。Downloader、PageProcessor、Scheduler、Pipeline都是Spider的一個屬性,這些屬性是可以自由設置的,通過設置這個屬性可以實現(xiàn)不同的功能。Spider也是WebMagic操作的入口,它封裝了爬蟲的創(chuàng)建、啟動、停止、多線程等功能。
對于編寫一個爬蟲,PageProcessor是需要編寫的部分,而Spider則是創(chuàng)建和控制爬蟲的入口。
2.4 WebMagic項目組成
WebMagic項目代碼包括幾個部分,在根目錄下以不同目錄名分開。它們都是獨立的Maven項目。
WebMagic主要包括兩個包,這兩個包經(jīng)過廣泛實用,已經(jīng)比較成熟:
webmagic-core
webmagic-core是WebMagic核心部分,只包含爬蟲基本模塊和基本抽取器。
webmagic-extension
webmagic-extension是WebMagic的主要擴展模塊,提供一些更方便的編寫爬蟲的工具。包括注解格式定義爬蟲、JSON、分布式等支持。
三、 基本的爬蟲
3.1 爬蟲的流程 (可以參考上邊的框架架構圖)
Downloader-頁面下載
頁面下載是一切爬蟲的開始。
大部分爬蟲都是通過模擬http請求,接收并分析響應來完成。這方面,JDK自帶的HttpURLConnection可以滿足最簡單的需要,而Apache HttpClient(4.0后整合到HttpCompenent項目中)則是開發(fā)復雜爬蟲的不二之選。它支持自定義HTTP頭(對于爬蟲比較有用的就是User-agent、cookie等)、自動redirect、連接復用、cookie保留、設置代理等諸多強大的功能。
webmagic使用了HttpClient 4.2,并封裝到了HttpClientDownloader。學習HttpClient的使用對于構建高性能爬蟲是非常有幫助的,官方的Tutorial就是很好的學習資料。目前webmagic對HttpClient的使用仍在初步階段,不過對于一般抓取任務,已經(jīng)夠用了
PageProcessor-頁面分析及鏈接抽取
Selector是webmagic為了簡化頁面抽取開發(fā)的獨立模塊,是整個項目中我最得意的部分。這里整合了CSS Selector、XPath和正則表達式,并可以進行鏈式的抽取,很容易就實現(xiàn)強大的功能。即使你使用自己開發(fā)的爬蟲工具,webmagic的Selector仍然值得一試
Jsoup
HtmlParser
Apache tika
HtmlCleaner與Xpath
這里說的頁面分析主要指HTML頁面的分析。頁面分析可以說是垂直爬蟲最復雜的一部分,在webmagic里,PageProcessor是定制爬蟲的核心。通過編寫一個實現(xiàn)PageProcessor接口的類,就可以定制一個自己的爬蟲
HTML分析是一個比較復雜的工作,Java世界主要有幾款比較方便的分析工具:
webmagic的Selector
Scheduler-URL管理
URL管理的問題可大可小。對于小規(guī)模的抓取,URL管理是很簡單的。我們只需要將待抓取URL和已抓取URL分開保存,并進行去重即可。使用JDK內置的集合類型Set、List或者Queue都可以滿足需要。如果我們要進行多線程抓取,則可以選擇線程安全的容器,例如LinkedBlockingQueue以及ConcurrentHashMap。因為小規(guī)模的URL管理非常簡單,很多框架都并不將其抽象為一個模塊,而是直接融入到代碼中。但是實際上,抽象出Scheduler模塊,會使得框架的解耦程度上升一個檔次,并非常容易進行橫向擴展,這也是我從scrapy中學到的。
Pipeline-離線處理和持久化
Pipeline其實也是容易被忽略的一部分。大家都知道持久化的重要性,但是很多框架都選擇直接在頁面抽取的時候將持久化一起完成,例如crawer4j。但是Pipeline真正的好處是,將頁面的在線分析和離線處理拆分開來,可以在一些線程里進行下載,另一些線程里進行處理和持久化。
3.2 使用WebMagic爬取一個壁紙網(wǎng)站
首先引入WebMagic的依賴,webmagic-core-{version}.jar和webmagic-extension-{version}.jar。在項目中添加這兩個包的依賴,即可使用WebMagic。
maven中引入依賴jar包
dependency
groupIdus.codecraft/groupId
artifactIdwebmagic-core/artifactId
version0.5.3/version
/dependency
dependency
groupIdus.codecraft/groupId
artifactIdwebmagic-extension/artifactId
version0.5.3/version
/dependency1234567891012345678910
不使用maven的用戶,可以去中下載最新的jar包。
/**
* 得到一個新的訂單代碼
* 說明,此函數(shù)還沒有進行過多線程測試,更新數(shù)據(jù)庫時未加鎖
* @return 新的訂單代碼
*/
public String getOrderCode(){
//getParameter這個方法就是從數(shù)據(jù)庫取2個參數(shù)的值 ORDER_CODE_DATE 和
//ORDER_CODE_NO是數(shù)據(jù)庫字段名
BasParameters orderCodeDate = getParameter(ORDER_CODE_DATE);
BasParameters orderCodeNo = getParameter(ORDER_CODE_NO);
//當前日期
String currDate=new SimpleDateFormat("yyyyMMdd").format(new Date(System.currentTimeMillis()));
//每天的起始數(shù)
int orderNo = 100;
//表里存的日期和當前日期相同,順序號累加
if (currDate.equals(orderCodeDate.getValue())){
orderCodeNo.setValue(""+(Integer.parseInt(orderCodeNo.getValue())+1));
orderNo = (Integer.parseInt(orderCodeNo.getValue()));
//save 就是保存ORDER_CODE_DATE 和 ORDER_CODE_NO當前值到數(shù)據(jù)庫
save(orderCodeNo);
} else {
//表里存的日期和當前日期不同,順序號重新開始,更新參數(shù)表的日期
orderCodeDate.setValue(currDate);
save(orderCodeDate);
orderCodeNo.setValue(orderNo);
save(orderCodeNo);
}
return currDate + new DecimalFormat("000000").format(orderNo);
}
第一個不就是一對多嗎? 我給你看看已訂單號進行關聯(lián)
訂單號,訂單日期,用戶姓名,送貨地址
1 2015/9/1 kill 北京
訂單項id,訂單號,商品名稱,商品價格,商品數(shù)量)
123 1 泡面 10 100
223 1 純凈水 11 111
省,市,區(qū),街道 訂單號
1 1 1 1 1
2 2 2 2 1
strust2 (我沒有用過不過我一般是這樣做的)
直接用用后臺進行校驗
網(wǎng)站題目:java用戶下訂單代碼 java用戶下訂單代碼怎么寫
轉載來于:http://vcdvsql.cn/article26/ddsidcg.html
成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站維護、定制開發(fā)、網(wǎng)站建設、標簽優(yōu)化、品牌網(wǎng)站設計、全網(wǎng)營銷推廣
聲明:本網(wǎng)站發(fā)布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經(jīng)允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)