❶ j2ee的關鍵技術是什麼
J2EE里禪友陪我在達內學習時告擾,
主要的技術有:
1Corejava就不說了
2Servlet
3jsP
4JDBC
5框架類
SSH——SpringStruts2(WebWork內核)Hibernate
EJB
6OraclePLSQL
7賀蠢JsXML等....
❷ C# 判斷MP3格式(除擴展名)
MP3格式前3個位元組一定494433即ASCII的ID3,用stream讀前3個位元組判斷即可。
❸ PHP如何用header設置文件下載頭!感謝~
$path="http://*****/wlyz/1.txt";
header("Content-Type:application/force-download");
header("Content-Disposition:attachment;filename=".basename($path));
readfile($path);
這段代碼可以新建一個PHP文件,放入以上代碼,然後用一個<a>標簽鏈接到這版個php文件,帶上參權數,傳入需要下載的文件的路徑。
❹ php 一個頁面有好幾個radio按鈕,怎麼實現radio按鈕切換,檢索條件部分跟在動態切換。
這個是需要用JS來實現的,就類似tap選項卡的效果。下面是找的一個例子,和你想要的效果一樣
<!DOCTYPEhtmlPUBLIC"-//W3C//DTDXHTML1.0Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<htmlxmlns="http://www.w3.org/1999/xhtml">
<head>
<metahttp-equiv="Content-Type"content="text/html;charset=utf-8"/>
<title>Radio切換效果</title>
<style>
*{margin:0;padding:0;}
body{margin:50px;font-size:12px;color:#666;}
li{list-style:none;}
div{width:210px;}#tab1,#tab2{width:398px;height:34px;border:1px#cfedffsolid;border-bottom:0;background:url(images/title.gif)repeat-x;}#tab1ul,#tab2ul{margin:0;padding:0;}#tab1li,#tab2li{float:left;padding:030px;height:34px;line-height:34px;text-align:center;border-right:1px#ebf7ffsolid;cursor:pointer;}#tab1li.now,#tab2li.now{color:#5299c4;background:#fff;font-weight:bold;}.tablist{width:378px;height:100px;padding:10px;font-size:14px;line-height:24px;border:1px#cfedffsolid;border-top:0;display:none;}.block{display:block;}
fieldset{width:378px;border:1px#B0C0D1solid;padding:10px;}
legend{background:#B0C0D1;padding:4px10px;color:#fff;}#c{margin-top:10px;}.c1,.c2{width:378px;line-height:20px;}.c1{color:#014CC9;}.c2{color:#7E6095;}
h3{font-size:16px;padding:5px0;}.red{color:#BD0A01;}
</style>
</head>
<body>
<h1>Radio切換</h1>
<scripttype="text/javascript">
functionradioShow(){
varmyradio=document.getElementsByName("myradio");
vardiv=document.getElementById("c").getElementsByTagName("div");
for(i=0;i<div.length;i++){
if(myradio[i].checked){
div[i].style.display="block";
}else{
div[i].style.display="none";
}
}
}
</script>
<formname="ck">
<fieldset>
<legend>I'mRadio</legend>
<h3>請選擇:</h3>
<labelfor="r1"class="red">
<inputname="myradio"id="r1"type="radio"value=""checked="checked"onclick="radioShow();"/>XML教程</label>
<labelfor="r2"class="red">
<inputname="myradio"id="r2"type="radio"value=""onclick="radioShow();"/>瀏覽器腳本</label>
<divid="c">
<divclass="c1">
<labelfor="xml">
<inputname="c2"type="checkbox"id="xml"value=""/>XML</label>
<labelfor="dtd">
<inputname="c2"id="dtd"type="checkbox"value=""/>DTD</label>
<labelfor="xmldom">
<inputname="c2"id="xmldom"type="checkbox"value=""/>XMLDOM</label>
<labelfor="xsl">
<inputname="c2"id="xsl"type="checkbox"value=""/>XSL</label>
<labelfor="xslt">
<inputname="c2"id="xslt"type="checkbox"value=""/>XSLT</label>
<labelfor="xslfo">
<inputname="c2"id="xslfo"type="checkbox"value=""/>XSL-FO</label>
<labelfor="xpath">
<inputname="c2"id="xpath"type="checkbox"value=""/>XPath</label>
<labelfor="xquery">
<inputname="c2"id="xquery"type="checkbox"value=""/>XQuery</label>
<labelfor="xlink">
<inputname="c2"id="xlink"type="checkbox"value=""/>XLink</label>
<labelfor="xpointer">
<inputname="c2"id="xpointer"type="checkbox"value=""/>XPointer</label>
<labelfor="schema">
<inputname="c2"id="schema"type="checkbox"value=""/>Schema</label>
<labelfor="xforms">
<inputname="c2"id="xforms"type="checkbox"value=""/>XForms</label>
</div>
<divclass="c2"style="display:none;">
<labelfor="js">
<inputname="c3"id="js"type="checkbox"value=""/>JavaScript</label>
<labelfor="hd">
<inputname="c3"id="hd"type="checkbox"value=""/>HTMLDOM</label>
<labelfor="dhtml">
<inputname="c3"id="dhtml"type="checkbox"value=""/>DHTML</label>
<labelfor="vbs">
<inputname="c3"id="vbs"type="checkbox"value=""/>VBScript</label>
<labelfor="ajax">
<inputname="c3"id="ajax"type="checkbox"value=""/>AJAX</label>
<labelfor="e4x">
<inputname="c3"id="e4x"type="checkbox"value=""/>E4X</label>
<labelfor="wml">
<inputname="c3"id="wml"type="checkbox"value=""/>WMLScript</label>
</div>
</div>
</fieldset>
</form>
</body>
</html>
❺ xquery和jquery的區別
myeclipse或eclipse,安裝有SVN插件檔宏,右鍵項目,選擇Team,選擇顯示資源歷史記錄,可以看到修訂版本號,日期,作者,注迅蠢和釋。然後憑借自己的判斷,找到起始的版畝盯本號。
❻ JSLT:JSON查詢和轉換處理語言
JSLT 是一種面歲臘向JSON的查詢轉換語言。作者是基於 jq , XPath , and XQuery 啟發設計JSLT語言。
JSLT能被用來:
這里有簡基一個示例:
(提供輸入&JSLT表達式,計算輸出)
鏈接乎咐滑
在你的項目中,引入依賴
在運行時,JSLT只依賴於Jackson。
為了轉換一個「JsonNode」到另一個鍾,需要:
其他更多可選方式, 參考 the
javadoc .
To run transforms on the command-line, first build with ./gradlew clean shadowJar . Then you can run with:
The result is written to standard out.
❼ FileUpload怎麼獲取文件的類型
if (FileUp.PostedFile.ContentType == "image/pjpeg" || FileUp.PostedFile.ContentType == "image/gif" || FileUp.PostedFile.ContentType == "image/bmp") //設置上傳文件類型
加上
FileUp.PostedFile.ContentType=="application/x-shockwave-flash"
----------------------
備注其它類型的ContentType
".*"="application/octet-stream"
".001"="application/x-001"
".301"="application/x-301"
".323"="text/h323"
".906"="application/x-906"
".907"="drawing/907"
".a11"="application/x-a11"
".acp"="audio/x-mei-aac"
".ai"="application/postscript"
".aif"="audio/aiff"
".aifc"="audio/aiff"
".aiff"="audio/aiff"
".anv"="application/x-anv"
".asa"="text/asa"
".asf"="video/x-ms-asf"
".asp"="text/asp"
".asx"="video/x-ms-asf"
".au"="audio/basic"
".avi"="video/avi"
".awf"="application/vnd.adobe.workflow"
".biz"="text/xml"
".bmp"="application/x-bmp"
".bot"="application/x-bot"
".c4t"="application/x-c4t"
".c90"="application/x-c90"
".cal"="application/x-cals"
".cat"="application/vnd.ms-pki.seccat"
".cdf"="application/x-netcdf"
".cdr"="application/x-cdr"
".cel"="application/x-cel"
".cer"="application/x-x509-ca-cert"
".cg4"="application/x-g4"
".cgm"="application/x-cgm"
".cit"="application/x-cit"
".class"="java/*"
".cml"="text/xml"
".cmp"="application/x-cmp"
".cmx"="application/x-cmx"
".cot"="application/x-cot"
".crl"="application/pkix-crl"
".crt"="application/x-x509-ca-cert"
".csi"="application/x-csi"
".css"="text/css"
".cut"="application/x-cut"
".dbf"="application/x-dbf"
".dbm"="application/x-dbm"
".dbx"="application/x-dbx"
".dcd"="text/xml"
".dcx"="application/x-dcx"
".der"="application/x-x509-ca-cert"
".dgn"="application/x-dgn"
".dib"="application/x-dib"
".dll"="application/x-msdownload"
".doc"="application/msword"
".dot"="application/msword"
".drw"="application/x-drw"
".dtd"="text/xml"
".dwf"="Model/vnd.dwf"
".dwf"="application/x-dwf"
".dwg"="application/x-dwg"
".dxb"="application/x-dxb"
".dxf"="application/x-dxf"
".edn"="application/vnd.adobe.edn"
".emf"="application/x-emf"
".eml"="message/rfc822"
".ent"="text/xml"
".epi"="application/x-epi"
".eps"="application/x-ps"
".eps"="application/postscript"
".etd"="application/x-ebx"
".exe"="application/x-msdownload"
".fax"="image/fax"
".fdf"="application/vnd.fdf"
".fif"="application/fractals"
".fo"="text/xml"
".frm"="application/x-frm"
".g4"="application/x-g4"
".gbr"="application/x-gbr"
".gcd"="application/x-gcd"
".gif"="image/gif"
".gl2"="application/x-gl2"
".gp4"="application/x-gp4"
".hgl"="application/x-hgl"
".hmr"="application/x-hmr"
".hpg"="application/x-hpgl"
".hpl"="application/x-hpl"
".hqx"="application/mac-binhex40"
".hrf"="application/x-hrf"
".hta"="application/hta"
".htc"="text/x-component"
".htm"="text/html"
".html"="text/html"
".htt"="text/webviewhtml"
".htx"="text/html"
".icb"="application/x-icb"
".ico"="image/x-icon"
".ico"="application/x-ico"
".iff"="application/x-iff"
".ig4"="application/x-g4"
".igs"="application/x-igs"
".iii"="application/x-iphone"
".img"="application/x-img"
".ins"="application/x-internet-signup"
".isp"="application/x-internet-signup"
".IVF"="video/x-ivf"
".java"="java/*"
".jfif"="image/jpeg"
".jpe"="image/jpeg"
".jpe"="application/x-jpe"
".jpeg"="image/jpeg"
".jpg"="image/jpeg"
".jpg"="application/x-jpg"
".js"="application/x-javascript"
".jsp"="text/html"
".la1"="audio/x-liquid-file"
".lar"="application/x-laplayer-reg"
".latex"="application/x-latex"
".lavs"="audio/x-liquid-secure"
".lbm"="application/x-lbm"
".lmsff"="audio/x-la-lms"
".ls"="application/x-javascript"
".ltr"="application/x-ltr"
".m1v"="video/x-mpeg"
".m2v"="video/x-mpeg"
".m3u"="audio/mpegurl"
".m4e"="video/mpeg4"
".mac"="application/x-mac"
".man"="application/x-troff-man"
".math"="text/xml"
".mdb"="application/msaccess"
".mdb"="application/x-mdb"
".mfp"="application/x-shockwave-flash"
".mht"="message/rfc822"
".mhtml"="message/rfc822"
".mi"="application/x-mi"
".mid"="audio/mid"
".midi"="audio/mid"
".mil"="application/x-mil"
".mml"="text/xml"
".mnd"="audio/x-musicnet-download"
".mns"="audio/x-musicnet-stream"
".mocha"="application/x-javascript"
".movie"="video/x-sgi-movie"
".mp1"="audio/mp1"
".mp2"="audio/mp2"
".mp2v"="video/mpeg"
".mp3"="audio/mp3"
".mp4"="video/mpeg4"
".mpa"="video/x-mpg"
".mpd"="application/vnd.ms-project"
".mpe"="video/x-mpeg"
".mpeg"="video/mpg"
".mpg"="video/mpg"
".mpga"="audio/rn-mpeg"
".mpp"="application/vnd.ms-project"
".mps"="video/x-mpeg"
".mpt"="application/vnd.ms-project"
".mpv"="video/mpg"
".mpv2"="video/mpeg"
".mpw"="application/vnd.ms-project"
".mpx"="application/vnd.ms-project"
".mtx"="text/xml"
".mxp"="application/x-mmxp"
".net"="image/pnetvue"
".nrf"="application/x-nrf"
".nws"="message/rfc822"
".odc"="text/x-ms-odc"
".out"="application/x-out"
".p10"="application/pkcs10"
".p12"="application/x-pkcs12"
".p7b"="application/x-pkcs7-certificates"
".p7c"="application/pkcs7-mime"
".p7m"="application/pkcs7-mime"
".p7r"="application/x-pkcs7-certreqresp"
".p7s"="application/pkcs7-signature"
".pc5"="application/x-pc5"
".pci"="application/x-pci"
".pcl"="application/x-pcl"
".pcx"="application/x-pcx"
".pdf"="application/pdf"
".pdf"="application/pdf"
".pdx"="application/vnd.adobe.pdx"
".pfx"="application/x-pkcs12"
".pgl"="application/x-pgl"
".pic"="application/x-pic"
".pko"="application/vnd.ms-pki.pko"
".pl"="application/x-perl"
".plg"="text/html"
".pls"="audio/scpls"
".plt"="application/x-plt"
".png"="image/png"
".png"="application/x-png"
".pot"="application/vnd.ms-powerpoint"
".ppa"="application/vnd.ms-powerpoint"
".ppm"="application/x-ppm"
".pps"="application/vnd.ms-powerpoint"
".ppt"="application/vnd.ms-powerpoint"
".ppt"="application/x-ppt"
".pr"="application/x-pr"
".prf"="application/pics-rules"
".prn"="application/x-prn"
".prt"="application/x-prt"
".ps"="application/x-ps"
".ps"="application/postscript"
".ptn"="application/x-ptn"
".pwz"="application/vnd.ms-powerpoint"
".r3t"="text/vnd.rn-realtext3d"
".ra"="audio/vnd.rn-realaudio"
".ram"="audio/x-pn-realaudio"
".ras"="application/x-ras"
".rat"="application/rat-file"
".rdf"="text/xml"
".rec"="application/vnd.rn-recording"
".red"="application/x-red"
".rgb"="application/x-rgb"
".rjs"="application/vnd.rn-realsystem-rjs"
".rjt"="application/vnd.rn-realsystem-rjt"
".rlc"="application/x-rlc"
".rle"="application/x-rle"
".rm"="application/vnd.rn-realmedia"
".rmf"="application/vnd.adobe.rmf"
".rmi"="audio/mid"
".rmj"="application/vnd.rn-realsystem-rmj"
".rmm"="audio/x-pn-realaudio"
".rmp"="application/vnd.rn-rn_music_package"
".rms"="application/vnd.rn-realmedia-secure"
".rmvb"="application/vnd.rn-realmedia-vbr"
".rmx"="application/vnd.rn-realsystem-rmx"
".rnx"="application/vnd.rn-realplayer"
".rp"="image/vnd.rn-realpix"
".rpm"="audio/x-pn-realaudio-plugin"
".rsml"="application/vnd.rn-rsml"
".rt"="text/vnd.rn-realtext"
".rtf"="application/msword"
".rtf"="application/x-rtf"
".rv"="video/vnd.rn-realvideo"
".sam"="application/x-sam"
".sat"="application/x-sat"
".sdp"="application/sdp"
".sdw"="application/x-sdw"
".sit"="application/x-stuffit"
".slb"="application/x-slb"
".sld"="application/x-sld"
".slk"="drawing/x-slk"
".smi"="application/smil"
".smil"="application/smil"
".smk"="application/x-smk"
".snd"="audio/basic"
".sol"="text/plain"
".sor"="text/plain"
".spc"="application/x-pkcs7-certificates"
".spl"="application/futuresplash"
".spp"="text/xml"
".ssm"="application/streamingmedia"
".sst"="application/vnd.ms-pki.certstore"
".stl"="application/vnd.ms-pki.stl"
".stm"="text/html"
".sty"="application/x-sty"
".svg"="text/xml"
".swf"="application/x-shockwave-flash"
".tdf"="application/x-tdf"
".tg4"="application/x-tg4"
".tga"="application/x-tga"
".tif"="image/tiff"
".tif"="application/x-tif"
".tiff"="image/tiff"
".tld"="text/xml"
".top"="drawing/x-top"
".torrent"="application/x-bittorrent"
".tsd"="text/xml"
".txt"="text/plain"
".uin"="application/x-icq"
".uls"="text/iuls"
".vcf"="text/x-vcard"
".vda"="application/x-vda"
".vdx"="application/vnd.visio"
".vml"="text/xml"
".vpg"="application/x-vpeg005"
".vsd"="application/vnd.visio"
".vsd"="application/x-vsd"
".vss"="application/vnd.visio"
".vst"="application/vnd.visio"
".vst"="application/x-vst"
".vsw"="application/vnd.visio"
".vsx"="application/vnd.visio"
".vtx"="application/vnd.visio"
".vxml"="text/xml"
".wav"="audio/wav"
".wax"="audio/x-ms-wax"
".wb1"="application/x-wb1"
".wb2"="application/x-wb2"
".wb3"="application/x-wb3"
".wbmp"="image/vnd.wap.wbmp"
".wiz"="application/msword"
".wk3"="application/x-wk3"
".wk4"="application/x-wk4"
".wkq"="application/x-wkq"
".wks"="application/x-wks"
".wm"="video/x-ms-wm"
".wma"="audio/x-ms-wma"
".wmd"="application/x-ms-wmd"
".wmf"="application/x-wmf"
".wml"="text/vnd.wap.wml"
".wmv"="video/x-ms-wmv"
".wmx"="video/x-ms-wmx"
".wmz"="application/x-ms-wmz"
".wp6"="application/x-wp6"
".wpd"="application/x-wpd"
".wpg"="application/x-wpg"
".wpl"="application/vnd.ms-wpl"
".wq1"="application/x-wq1"
".wr1"="application/x-wr1"
".wri"="application/x-wri"
".wrk"="application/x-wrk"
".ws"="application/x-ws"
".ws2"="application/x-ws"
".wsc"="text/scriptlet"
".wsdl"="text/xml"
".wvx"="video/x-ms-wvx"
".xdp"="application/vnd.adobe.xdp"
".xdr"="text/xml"
".xfd"="application/vnd.adobe.xfd"
".xfdf"="application/vnd.adobe.xfdf"
".xhtml"="text/html"
".xls"="application/vnd.ms-excel"
".xls"="application/x-xls"
".xlw"="application/x-xlw"
".xml"="text/xml"
".xpl"="audio/scpls"
".xq"="text/xml"
".xql"="text/xml"
".xquery"="text/xml"
".xsd"="text/xml"
".xsl"="text/xml"
".xslt"="text/xml"
".xwd"="application/x-xwd"
".x_b"="application/x-x_b"
".x_t"="application/x-x_t"
❽ python 新浪微博爬蟲,求助
0x00. 起因
因為參加學校大學生創新競賽,研究有關微博博文表達的情緒,需要大量微博博文,而網上無論是國內的某度、csdn,還是國外谷歌、gayhub、codeproject等都找不到想要的程序,沒辦法只能自己寫一個程序了。
ps.在爬盟找到類似的程序,但是是windows下的,並且閉源,而且最終爬取保存的文件用notepad++打開有很多奇怪的問題,所以放棄了。
0x01. 基礎知識
本程序由Python寫成,所以基本的python知識是必須的。另外,如果你有一定的計算機網路基礎,在前期准備時會有少走很多彎路。
對於爬蟲,需要明確幾點:
1. 對爬取對象分類,可以分為以下幾種:第一種是不需要登錄的,比如博主以前練手時爬的中國天氣網,這種網頁爬取難度較低,建議爬蟲新手爬這類網頁;第二種是需要登錄的,如豆瓣、新浪微博,這些網頁爬取難度較高;第三種獨立於前兩種,你想要的信息一般是動態刷新的,如AJAX或內嵌資源,這種爬蟲難度最大,博主也沒研究過,在此不細舉(據同學說淘寶的商品評論就屬於這類)。
2. 如果同一個數據源有多種形式(比如電腦版、手機版、客戶端等),優先選取較為「純凈的」展現。比如新浪微博,有網頁版,也有手機版,而且手機版可以用電腦瀏覽器訪問,這時我優先選手機版新浪微博。
3. 爬蟲一般是將網頁下載到本地,再通過某些方式提取出感興趣的信息。也就是說,爬取網頁只完成了一半,你還要將你感興趣的信息從下載下來的html文件中提取出來。這時就需要一些xml的知識了,在這個項目中,博主用的是XPath提取信息,另外可以使用XQuery等等其他技術,詳情請訪問w3cschool。
4. 爬蟲應該盡量模仿人類,現在網站反爬機制已經比較發達,從驗證碼到禁IP,爬蟲技術和反爬技術可謂不斷博弈。
0x02. 開始
決定了爬蟲的目標之後,首先應該訪問目標網頁,明確目標網頁屬於上述幾種爬蟲的哪種,另外,記錄為了得到感興趣的信息你需要進行的步驟,如是否需要登錄,如果需要登錄,是否需要驗證碼;你要進行哪些操作才能獲得希望得到的信息,是否需要提交某些表單;你希望得到的信息所在頁面的url有什麼規律等等。
以下博文以博主項目為例,該項目爬取特定新浪微博用戶從注冊至今的所有微博博文和根據關鍵詞爬取100頁微博博文(大約1000條)。
0x03. 收集必要信息
首先訪問目標網頁,發現需要登錄,進入登錄頁面如下新浪微博手機版登錄頁面
注意url後半段有很多形如」%xx」的轉義字元,本文後面將會講到。
從這個頁面可以看到,登錄新浪微博手機版需要填寫賬號、密碼和驗證碼。
這個驗證碼是近期(本文創作於2016.3.11)才需要提供的,如果不需要提供驗證碼的話,將有兩種方法進行登錄。
第一種是填寫賬號密碼之後執行js模擬點擊「登錄」按鈕,博主之前寫過一個Java爬蟲就是利用這個方法,但是現在找不到工程了,在此不再贅述。
第二種需要一定HTTP基礎,提交包含所需信息的HTTP POST請求。我們需要Wireshark 工具來抓取登錄微博時我們發出和接收的數據包。如下圖我抓取了在登錄時發出和接收的數據包Wireshark抓取結果1
在搜索欄提供搜索條件」http」可得到所有http協議數據包,右側info顯示該數據包的縮略信息。圖中藍色一行是POST請求,並且info中有」login」,可以初步判斷這個請求是登錄時發出的第一個數據包,並且這個180.149.153.4應該是新浪微博手機版登錄認證的伺服器IP地址,此時我們並沒有任何的cookie。
在序號為30是數據包中有一個從該IP發出的HTTP數據包,裡面有四個Set-Cookie欄位,這些cookie將是我們爬蟲的基礎。
Wireshark抓取結果2
早在新浪微博伺服器反爬機制升級之前,登錄是不需要驗證碼的,通過提交POST請求,可以拿到這些cookie,在項目源碼中的TestCookie.py中有示例代碼。
ps.如果沒有wireshark或者不想這么麻煩的話,可以用瀏覽器的開發者工具,以chrome為例,在登錄前打開開發者工具,轉到Network,登錄,可以看到發出和接收的數據,登錄完成後可以看到cookies,如下圖chrome開發者工具
接下來訪問所需頁面,查看頁面url是否有某種規律。由於本項目目標之一是獲取某用戶的全部微博,所以直接訪問該用戶的微博頁面,以央視新聞 為例。
央視新聞1
圖為央視新聞微博第一頁,觀察該頁面的url可以發現,新浪微博手機版的微博頁面url組成是 「weibo.cn/(displayID)?page=(pagenum)」 。這將成為我們爬蟲拼接url的依據。
接下來查看網頁源碼,找到我們希望得到的信息的位置。打開瀏覽器開發者工具,直接定位某條微博,可以發現它的位置,如下所示。
xpath
觀察html代碼發現,所有的微博都在<div>標簽里,並且這個標簽里有兩個屬性,其中class屬性為」c」,和一個唯一的id屬性值。得到這個信息有助於將所需信息提取出來。
另外,還有一些需要特別注意的因素
* 微博分為原創微博和轉發微博
* 按照發布時間至當前時間的差距,在頁面上有」MM分鍾前」、」今天HH:MM」、」mm月dd日 HH:MM」、」yyyy-mm-dd HH:MM:SS」等多種顯示時間的方式* 手機版新浪微博一個頁面大約顯示10條微博,所以要注意對總共頁數進行記錄以上幾點都是細節,在爬蟲和提取的時候需要仔細考慮。
0x04. 編碼
1.爬取用戶微博
本項目開發語言是Python 2.7,項目中用了一些第三方庫,第三方庫可以用pip的方法添加。
既然程序自動登錄的想法被驗證碼擋住了,想要訪問特定用戶微博頁面,只能使用者提供cookies了。
首先用到的是Python的request模塊,它提供了帶cookies的url請求。
import request
print request.get(url, cookies=cookies).content使用這段代碼就可以列印帶cookies的url請求頁面結果。
首先取得該用戶微博頁面數,通過檢查網頁源碼,查找到表示頁數的元素,通過XPath等技術提取出頁數。
頁數
項目使用lxml模塊對html進行XPath提取。
首先導入lxml模塊,在項目里只用到了etree,所以from lxml import etree
然後利用下面的方法返回頁數
def getpagenum(self):
url = self.geturl(pagenum=1)
html = requests.get(url, cookies=self.cook).content # Visit the first page to get the page number.
selector = etree.HTML(html)
pagenum = selector.xpath('//input[@name="mp"]/@value')[0]
return int(pagenum)
接下來就是不斷地拼接url->訪問url->下載網頁。
需要注意的是,由於新浪反爬機制的存在,同一cookies訪問頁面過於「頻繁」的話會進入類似於「冷卻期」,即返回一個無用頁面,通過分析該無用頁面發現,這個頁面在特定的地方會出現特定的信息,通過XPath技術來檢查這個特定地方是否出現了特定信息即可判斷該頁面是否對我們有用。
def ispageneeded(html):
selector = etree.HTML(html)
try:
title = selector.xpath('//title')[0]
except:
return False
return title.text != '微博廣場' and title.text != '微博'
如果出現了無用頁面,只需簡單地重新訪問即可,但是通過後期的實驗發現,如果長期處於過頻訪問,返回的頁面將全是無用頁面,程序也將陷入死循環。為了避免程序陷入死循環,博主設置了嘗試次數閾值trycount,超過這個閾值之後方法自動返回。
下面代碼片展示了單線程爬蟲的方法。
def startcrawling(self, startpage=1, trycount=20):
attempt = 0
try:
os.mkdir(sys.path[0] + '/Weibo_raw/' + self.wanted)except Exception, e:
print str(e)
isdone = False
while not isdone and attempt < trycount:
try:
pagenum = self.getpagenum()
isdone = True
except Exception, e:
attempt += 1
if attempt == trycount:
return False
i = startpage
while i <= pagenum:
attempt = 0
isneeded = False
html = ''
while not isneeded and attempt < trycount:
html = self.getpage(self.geturl(i))
isneeded = self.ispageneeded(html)
if not isneeded:
attempt += 1
if attempt == trycount:
return False
self.savehtml(sys.path[0] + '/Weibo_raw/' + self.wanted + '/' + str(i) + '.txt', html)print str(i) + '/' + str(pagenum - 1)
i += 1
return True
考慮到程序的時間效率,在寫好單線程爬蟲之後,博主也寫了多線程爬蟲版本,基本思想是將微博頁數除以線程數,如一個微博用戶有100頁微博,程序開10個線程,那麼每個線程只負責10個頁面的爬取,其他基本思想跟單線程類似,只需仔細處理邊界值即可,在此不再贅述,感興趣的同學可以直接看代碼。另外,由於多線程的效率比較高,並發量特別大,所以伺服器很容易就返回無效頁面,此時trycount的設置就顯得更重要了。博主在寫這篇微博的時候,用一個新的cookies,多線程爬取現場測試了一下爬取北京郵電大學的微博,3976條微博全部爬取成功並提取博文,用時僅15s,實際可能跟cookies的新舊程度和網路環境有關,命令行設置如下,命令行意義在項目網址里有說明python main.py _T_WM=xxx; SUHB=xxx; SUB=xxx; gsid_CTandWM=xxx u bupt m 20 20爬取的工作以上基本介紹結束,接下來就是爬蟲的第二部分,解析了。由於項目中提供了多線程爬取方法,而多線程一般是無序的,但微博博文是依靠時間排序的,所以項目採用了一種折衷的辦法,將下載完成的頁面保存在本地文件系統,每個頁面以其頁號為文件名,待爬取的工作結束後,再遍歷文件夾內所有文件並解析。
通過前面的觀察,我們已經了解到微博博文存在的標簽有什麼特點了,利用XPath技術,將這個頁面里所有有這個特點的標簽全部提取出來已經不是難事了。
在這再次提醒,微博分為轉發微博和原創微博、時間表示方式。另外,由於我們的研究課題僅對微博文本感興趣,所以配圖不考慮。
def startparsing(self, parsingtime=datetime.datetime.now()):
basepath = sys.path[0] + '/Weibo_raw/' + self.uidfor filename in os.listdir(basepath):
if filename.startswith('.'):
continue
path = basepath + '/' + filename
f = open(path, 'r')
html = f.read()
selector = etree.HTML(html)
weiboitems = selector.xpath('//div[@class="c"][@id]')for item in weiboitems:
weibo = Weibo()
weibo.id = item.xpath('./@id')[0]
cmt = item.xpath('./div/span[@class="cmt"]')if len(cmt) != 0:
weibo.isrepost = True
weibo.content = cmt[0].text
else:
weibo.isrepost = False
ctt = item.xpath('./div/span[@class="ctt"]')[0]
if ctt.text is not None:
weibo.content += ctt.text
for a in ctt.xpath('./a'):
if a.text is not None:
weibo.content += a.text
if a.tail is not None:
weibo.content += a.tail
if len(cmt) != 0:
reason = cmt[1].text.split(u'\xa0')
if len(reason) != 1:
weibo.repostreason = reason[0]
ct = item.xpath('./div/span[@class="ct"]')[0]
time = ct.text.split(u'\xa0')[0]
weibo.time = self.gettime(self, time, parsingtime)self.weibos.append(weibo.__dict__)
f.close()
方法傳遞的參數parsingtime的設置初衷是,開發前期爬取和解析可能不是同時進行的(並不是嚴格的「同時」),微博時間顯示是基於訪問時間的,比如爬取時間是10:00,這時爬取到一條微博顯示是5分鍾前發布的,但如果解析時間是10:30,那麼解析時間將錯誤,所以應該講解析時間設置為10:00。到後期爬蟲基本開發完畢,爬取工作和解析工作開始時間差距降低,時間差將是爬取過程時長,基本可以忽略。
解析結果保存在一個列表裡,最後將這個列表以json格式保存到文件系統里,刪除過渡文件夾,完成。
def save(self):
f = open(sys.path[0] + '/Weibo_parsed/' + self.uid + '.txt', 'w')jsonstr = json.mps(self.weibos, indent=4, ensure_ascii=False)f.write(jsonstr)
f.close()
2.爬取關鍵詞
同樣的,收集必要的信息。在微博手機版搜索頁面敲入」python」,觀察url,研究其規律。雖然第一頁並無規律,但是第二頁我們發現了規律,而且這個規律可以返回應用於第一頁第一頁
第二頁
應用後第一頁
觀察url可以發現,對於關鍵詞的搜索,url中的變數只有keyword和page(事實上,hideSearchFrame對我們的搜索結果和爬蟲都沒有影響),所以在代碼中我們就可以對這兩個變數進行控制。
另外,如果關鍵詞是中文,那麼url就需要對中文字元進行轉換,如我們在搜索框敲入」開心」並搜索,發現url如下顯示搜索開心
但復制出來卻為
http://weibo.cn/search/mblog?hideSearchFrame=&keyword=%E5%BC%80%E5%BF%83&page=1幸好,python的urllib庫有qoute方法處理中文轉換的功能(如果是英文則不做轉換),所以在拼接url前使用這個方法處理一下參數。
另外,考慮到關鍵詞搜索屬於數據收集階段使用的方法,所以在此只提供單線程下載網頁,如有多線程需要,大家可以按照多線程爬取用戶微博的方法自己改寫。最後,對下載下來的網頁進行提取並保存(我知道這樣的模塊設計有點奇怪,打算重(xin)構(qing)時(hao)時再改,就先這樣吧)。
def keywordcrawling(self, keyword):
realkeyword = urllib.quote(keyword) # Handle the keyword in Chinese.
try:
os.mkdir(sys.path[0] + '/keywords')
except Exception, e:
print str(e)
weibos = []
try:
highpoints = re.compile(u'[\U00010000-\U0010ffff]') # Handle emoji, but it seems doesn't work.
except re.error:
highpoints = re.compile(u'[\uD800-\uDBFF][\uDC00-\uDFFF]')pagenum = 0
isneeded = False
while not isneeded:
html = self.getpage('http://weibo.cn/search/mblog?keyword=%s&page=1' % realkeyword)isneeded = self.ispageneeded(html)
if isneeded:
selector = etree.HTML(html)
try:
pagenum = int(selector.xpath('//input[@name="mp"]/@value')[0])except:
pagenum = 1
for i in range(1, pagenum + 1):
try:
isneeded = False
while not isneeded:
html = self.getpage('http://weibo.cn/search/mblog?keyword=%s&page=%s' % (realkeyword, str(i)))isneeded = self.ispageneeded(html)
selector = etree.HTML(html)
weiboitems = selector.xpath('//div[@class="c"][@id]')for item in weiboitems:
cmt = item.xpath('./div/span[@class="cmt"]')if (len(cmt)) == 0:
ctt = item.xpath('./div/span[@class="ctt"]')[0]
if ctt.text is not None:
text = etree.tostring(ctt, method='text', encoding="unicode")tail = ctt.tail
if text.endswith(tail):
index = -len(tail)
text = text[1:index]
text = highpoints.sub(u'\u25FD', text) # Emoji handling, seems doesn't work.
weibotext = text
weibos.append(weibotext)
print str(i) + '/' + str(pagenum)
except Exception, e:
print str(e)
f = open(sys.path[0] + '/keywords/' + keyword + '.txt', 'w')try:
f.write(json.mps(weibos,indent=4,ensure_ascii=False))except Exception,ex:
print str(ex)
finally:
f.close()
博主之前從未寫過任何爬蟲程序,為了獲取新浪微博博文,博主先後寫了3個不同的爬蟲程序,有Python,有Java,爬蟲不能用了是很正常的,不要氣餒,爬蟲程序和反爬機制一直都在不斷博弈中,道高一尺魔高一丈。
另. 轉載請告知博主,如果覺得博主帥的話就可以不用告知了
❾ Java學習路線是怎樣的
Java環境搭建、流程式控制制語句-for循環、switch選擇判斷、循環嵌套、數組拷貝、多維數組、final關鍵字、構造函數的調用、類的訪問許可權和路徑、面向對象高級特性、Java異常處理、Set,Map,List介面及介面實現類、Java線程、同步阻塞、JavaIO流、文件的操作,復制,讀寫,刪除等。
MySQL安裝、管理、創建資料庫、MySQLUPDATE
查詢、Mysql高級操作、JDBC、JDBC資料庫連接操作,JDBC動態Sql處理、Servlet3.0 網頁重定向、Servlet3.0
新增的註解支持、AJAX、responseText屬性詳解等。
Struts2異常處理、Struts2+Log4j集成、Struts2和JSON實例、Hibernate5、Hibernate集合映射、Hibernate組件映射、Spring4.0、SpringAOP+
AspectJ框架、Spring 與其它Web框架集成、Spring Hibernate支持等。
SpringMVC、Spring MVC生成JSON數據、MyBatis、MyBatis 環境配置及入門、Mybatis set標簽、Mybatis trim標簽、Shiro、Shiro快速入門教程、Shiro Web應用等。
SpringBoot、全局異常處理、過濾器監聽器、EHCache緩存、SpringBoot Quartz定時任務、Vue、Vue.js 安裝、模板語法、計算屬性、事件處理器、Vue.js 自定義指令、Vue.js 路由等
ActiveM環境搭建、生產者和消費者、消息持久化操作、RSA數字加密演算法、Codebar條形碼生成器、zxing二維碼生成器、HighCharts統計圖、Echarts統計圖、網路播放器ckplayer、嵌入式網路播放器,可以瀏覽器和移動端隨意使用
分布式服務框架的理解,Dubbo架構設計詳解及其核心要點,框架運行原理分析、SpringData數據訪問、Lucene搜索引擎、Lucene的全文搜索伺服器介紹、索引建立方式、Solr海量數據搜索引擎、Socket網路通信、實現RMI遠程對象通訊、使用JMS消息服務、Kafka分布式消息系統、WebService與RestfulWS等
Spring Security安全框架、實現Web應用安全控制、緩存應用與EhCache框架、OSCache與JBossCache框架、MyBatis與Hibernate緩存機制、NoSQL應用與SQL調優、MongoDB
NoSQL資料庫、Redis內存資料庫、實現RedisSession共享、SQL語句的優化、實現資料庫讀寫分離、WEB應用集群及性能優化、Maven項目管理工具、Web伺服器負載均衡、實現Nginx與Tomcat集群、使用LoadRunner測試工具、性能優化之內存調優、代碼優化與重構的方法等。
❿ Java培訓機構哪家好
Java是一門面向對象編程語言,具有功能強大和簡單易用兩大特徵。隨著JSP技術的發展,Java語言版的網路應權用更為實際化、更高效快捷。想要學好Java,一定要從基礎開始、一點一點慢慢深入進階。
Java初學者在開始的時候需要認識什麼是Java標識符、注釋、Java關鍵字和什麼是常量和變數等知識點,還要重點掌握面向對象三大特性、數據類型、關鍵字、抽象類和介面、異常、反射、枚舉、系列化等。
綜合來說,Java的知識點非常多,有些知識點比較難以理解,有時候我們自以為理解了某些內容,其實可能只是停留在表面上,沒有理解其底層實現原理。因此我們一定要多記憶、多練習,有較多的項目練習不僅可以幫你理解和鞏固理論知識,還可以幫你積累較多項目開發經驗。