首頁(yè)技術(shù)文章正文

零基礎(chǔ)學(xué)習(xí)網(wǎng)絡(luò)爬蟲(chóng)知識(shí)(二)

更新時(shí)間:2017-11-10 來(lái)源:黑馬程序員 瀏覽量:

1、CURL使用


curl命令可以用來(lái)構(gòu)造http請(qǐng)求。參數(shù)有很多,常用的參數(shù)如下:

通用語(yǔ)法:

curl [option] [URL...]


2、option


curl的選項(xiàng)功能:

· 不帶任何參數(shù)時(shí) curl 將返回指定url中的數(shù)據(jù)并打印在屏幕上

· -u 使用用戶名和密碼登陸。如curl –u name:passwd URL

· -b/--cookie 向服務(wù)器提交cookie,若無(wú)=則name視為文件名,例如:curl -b cookie.txt www.linuxidc.com

· -o out 將指定curl返回保存為out文件,內(nèi)容從html/jpg到各種MIME類型文件。如curl -o page.html URL

· -d 向服務(wù)器POST表單數(shù)據(jù) 例如:curl -d "order=111&count=2" http://www.linuxidc.com/buy

· -A/--user-agent 指定發(fā)送請(qǐng)求的用戶代理,例如:curl -A My-Agent/1.0.0 www.linuxidc.com

· -x ip:port 指定使用的http代理,例如:curl -x 192.168.1.1:8080 www.linuxidc.com

· -D head.txt 將服務(wù)器的返回的header保存為文件,頭部的cookie也可被保存,例如:curl -D header.txt www.linuxidc.com

o 如果希望從本地文件中獲取表單數(shù)據(jù),則在文件名前加@ ,例如:curl -d @data.xml http://www.linuxidc.com

o 若希望從標(biāo)準(zhǔn)輸入獲取則用 curl -d "name=username&passwd=pwd" http://www.linuxidc.com

· -L 當(dāng)頁(yè)面有跳轉(zhuǎn)的時(shí)候,輸出跳轉(zhuǎn)到的頁(yè)面

· -I header信息 當(dāng)有跳轉(zhuǎn)時(shí),可以通過(guò) curl -L -I URL|grep Location 來(lái)確定跳轉(zhuǎn)到的新url地址

· -c 保存服務(wù)器的cookie文件

· -e url 設(shè)置引用頭的值

· -T localfile 向服務(wù)器PUT文件 例如:curl -T 1.mp3 www.linuxidc.com/upload.php

· -F 向服務(wù)器POST表單,例如:curl -F "web=@index.html;type=text/html" url.com

· -E cert.pem 指定本地證書(shū)

· -H 為HTTP請(qǐng)求設(shè)置任意header及值。如curl -H "Connection:keep-alive" http://www.linuxidc.com

· -X/--request method 用戶定義的HTTP請(qǐng)求方法名如 curl -X GET www.baidu.com

· --compressed 采用壓縮方式接收返回?cái)?shù)據(jù)

· --connect-timeout 設(shè)置超時(shí)時(shí)間

· -v 詳細(xì)輸出,包含請(qǐng)求和響應(yīng)的首部

· --retry num

· --retry timeo 指定重試的次數(shù)和間隔

· --tcp-nodelay 打開(kāi)TCP_NODELAY選項(xiàng) 不進(jìn)行捎帶確認(rèn)

· -O 按服務(wù)器上的名稱保存下載的文件

· -r/--range from-to 下載指定range內(nèi)的數(shù)據(jù)

· -C 在保存文件時(shí)進(jìn)行續(xù)傳


3、使用實(shí)例


Curl是Linux下一個(gè)很強(qiáng)大的http命令行工具,其功能十分強(qiáng)大。


1) 先從這里開(kāi)始吧!

$ curl http://www.linuxidc.com

回車之后,www.linuxidc.com 的html顯示在屏幕上了 ~


2) 要想把讀過(guò)來(lái)頁(yè)面存下來(lái),是不是要這樣呢?

$ curl http://www.linuxidc.com > page.html

當(dāng)然可以,但不用這么麻煩的!

用curl的內(nèi)置option就好,存下http的結(jié)果,用這個(gè)option: -o

$ curl -o page.html http://www.linuxidc.com

這樣,你就可以看到屏幕上出現(xiàn)一個(gè)下載頁(yè)面進(jìn)度指示。等進(jìn)展到100%,自然就 OK咯


3) proxy設(shè)定。

使用curl的時(shí)候,用這個(gè)option可以指定http訪問(wèn)所使用的proxy服務(wù)器及其端口: -x

$ curl -x 123.45.67.89:1080 -o page.html http://www.linuxidc.com


4) 訪問(wèn)有些網(wǎng)站的時(shí)候比較討厭,他使用cookie來(lái)記錄session信息。

像IE/NN這樣的瀏覽器,當(dāng)然可以輕易處理cookie信息,但我們的curl呢?.....

我們來(lái)學(xué)習(xí)這個(gè)option: -D <— 這個(gè)是把http的response里面的cookie信息存到一個(gè)特別的文件中去

$ curl -x 123.45.67.89:1080 -o page.html -D cookie0001.txt http://www.linuxidc.com

這樣,當(dāng)頁(yè)面被存到page.html的同時(shí),cookie信息也被存到了cookie0001.txt里面了


5)那么,下一次訪問(wèn)的時(shí)候,如何繼續(xù)使用上次留下的cookie信息呢?要知道,很多網(wǎng)站都是靠監(jiān)視你的cookie信息,來(lái)判斷你是不是不按規(guī)矩訪問(wèn)他們的網(wǎng)站的。

這次我們使用這個(gè)option來(lái)把上次的cookie信息追加到http request里面去: -b

$ curl -x 123.45.67.89:1080 -o page1.html -D cookie0002.txt -b cookie0001.txt http://www.linuxidc.com

這樣,我們就可以幾乎模擬所有的IE操作,去訪問(wèn)網(wǎng)頁(yè)了!


6)瀏覽器信息

有些討厭的網(wǎng)站總要我們使用某些特定的瀏覽器去訪問(wèn)他們,有時(shí)候更過(guò)分的是,還要使用某些特定的版本

curl給我們提供了一個(gè)有用的option,可以讓我們隨意指定自己這次訪問(wèn)所宣稱的自己的瀏覽器信息: -A

$ curl -A "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)" -x 123.45.67.89:1080 -o page.html -D cookie0001.txt http://www.linuxidc.com

這樣,服務(wù)器端接到訪問(wèn)的要求,會(huì)認(rèn)為你是一個(gè)運(yùn)行在Windows 2000上的 IE6.0

而"Mozilla/4.73 [en] (X11; U; Linux 2.2; 15 i686"則可以告訴對(duì)方你是一臺(tái) PC上跑著的Linux,用的是Netscape 4.73


7)另外一個(gè)服務(wù)器端常用的限制方法,就是檢查http訪問(wèn)的referer。比如你先訪問(wèn)首頁(yè),再訪問(wèn)里面所指定的下載頁(yè),這第二次訪問(wèn)的 referer地址就是第一次訪問(wèn)成功后的頁(yè)面地址。這樣,服務(wù)器端只要發(fā)現(xiàn)對(duì)下載頁(yè)面某次訪問(wèn)的referer地址不是首頁(yè)的地址,就可以斷定那是個(gè)盜連了 ~

curl給我們提供了設(shè)定referer的option: -e

$ curl -A "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)" -x 123.45.67.89:1080 -e "mail.linuxidc.com" -o page.html -D cookie0001.txt http://www.linuxidc.com

這樣,就可以騙對(duì)方的服務(wù)器,你是從mail.linuxidc.com點(diǎn)擊某個(gè)鏈接過(guò)來(lái)的了。


8) 利用curl 下載文件

剛才講過(guò)了,下載頁(yè)面到一個(gè)文件里,可以使用 -o ,下載文件也是一樣。比如,

$ curl -o 1.jpg http://cgi2.tky.3web.ne.jp/~zzh/screen1.JPG

這里教大家一個(gè)新的option: -O 大寫(xiě)的O,這么用:

$ curl -O http://cgi2.tky.3web.ne.jp/~zzh/screen1.JPG

這樣,就可以按照服務(wù)器上的文件名,自動(dòng)存在本地了!

再來(lái)一個(gè)更好用的。

如果screen1.JPG以外還有screen2.JPG、screen3.JPG、....、screen10.JPG需要下載,難不成還要讓我們寫(xiě)一個(gè)script來(lái)完成這些操作?

在curl里面,這么寫(xiě)就可以了:

$ curl -O http://cgi2.tky.3web.ne.jp/~zzh/screen[1-10].JPG

9)再來(lái),我們繼續(xù)講解下載!

$ curl -O http://cgi2.tky.3web.ne.jp/~{zzh,nick}/[001-201].JPG

這樣產(chǎn)生的下載,就是

~zzh/001.JPG

~zzh/002.JPG

...

~zzh/201.JPG

~nick/001.JPG

~nick/002.JPG

...

~nick/201.JPG

夠方便的了吧

由于zzh/nick下的文件名都是001,002...,201,下載下來(lái)的文件重名,后面的把前面的文件都給覆蓋掉了 ~

沒(méi)關(guān)系,我們還有更狠的!

$ curl -o #2_#1.jpg http://cgi2.tky.3web.ne.jp/~{zzh,nick}/[001-201].JPG

—這是.....自定義文件名的下載?

這樣,自定義出來(lái)下載下來(lái)的文件名,就變成了這樣:原來(lái): ~zzh/001.JPG —-> 下載后: 001-zzh.JPG 原來(lái): ~nick/001.JPG —-> 下載后: 001-nick.JPG

這樣一來(lái),就不怕文件重名啦。


9)繼續(xù)講下載

我們平時(shí)在windows平臺(tái)上,flashget這樣的工具可以幫我們分塊并行下載,還可以斷線續(xù)傳。

curl在這些方面也不輸給誰(shuí),嘿嘿

比如我們下載screen1.JPG中,突然掉線了,我們就可以這樣開(kāi)始續(xù)傳

curl -c -O http://cgi2.tky.3wb.ne.jp/~zzh/screen1.JPG

當(dāng)然,你不要拿個(gè)flashget下載了一半的文件來(lái)糊弄我~~~~別的下載軟件的半截文件可不一定能用哦~~~

分塊下載,我們使用這個(gè)option就可以了: -r

舉例說(shuō)明

比如我們有一個(gè)http://cgi2.tky.3web.ne.jp/~zzh/zhao1.mp3 要下載(趙老師的電話朗誦 :D )

我們就可以用這樣的命令:

curl -r 0-10240 -o "zhao.part1" http:/cgi2.tky.3web.ne.jp/~zzh/zhao1.mp3 &\

curl -r 10241-20480 -o "zhao.part1" http:/cgi2.tky.3web.ne.jp/~zzh/zhao1.mp3 &\

curl -r 20481-40960 -o "zhao.part1" http:/cgi2.tky.3web.ne.jp/~zzh/zhao1.mp3 &\

curl -r 40961- -o "zhao.part1" http:/cgi2.tky.3web.ne.jp/~zzh/zhao1.mp3

這樣就可以分塊下載啦。

不過(guò)你需要自己把這些破碎的文件合并起來(lái)

如果你用UNIX或蘋(píng)果,用 cat zhao.part* > zhao.mp3就可以

如果用的是Windows,用copy /b 來(lái)解決

上面講的都是http協(xié)議的下載,其實(shí)ftp也一樣可以用。

用法嘛,

curl -u name:passwd ftp://ip:port/path/file

或者大家熟悉的

curl ftp://name:passwd@ip:port/path/file


10)上傳的option是 -T

比如我們向ftp傳一個(gè)文件: curl -T localfile -u name:passwd ftp://upload_site:port/path/

當(dāng)然,向http服務(wù)器上傳文件也可以

比如 curl -T localfile http://cgi2.tky.3web.ne.jp/~zzh/abc.cgi

注意,這時(shí)候,使用的協(xié)議是HTTP的PUT method

剛才說(shuō)到PUT,其他幾種methos還沒(méi)講呢!

GET和POST都不能忘哦。

http提交一個(gè)表單,比較常用的是POST模式和GET模式

GET模式什么option都不用,只需要把變量寫(xiě)在url里面就可以了

比如:

curl http://www.yahoo.com/login.cgi?user=nickwolfe&password=12345

而POST模式的option則是 -d

比如,curl -d "user=nickwolfe&password=12345" http://www.yahoo.com/login.cgi

就相當(dāng)于向這個(gè)站點(diǎn)發(fā)出一次登陸申請(qǐng)~~~~~

到底該用GET模式還是POST模式,要看對(duì)面服務(wù)器的程序設(shè)定。

一點(diǎn)需要注意的是,POST模式下的文件上的文件上傳,比如

這樣一個(gè)HTTP表單,我們要用curl進(jìn)行模擬,就該是這樣的語(yǔ)法:

curl -F upload=@localfile -F nick=go http://cgi2.tky.3web.ne.jp/~zzh/up_file.cgi

羅羅嗦嗦講了這么多,其實(shí)curl還有很多很多技巧和用法

比如 https的時(shí)候使用本地證書(shū),就可以這樣

curl -E localcert.pem https://remote_server

再比如,你還可以用curl通過(guò)dict協(xié)議去查字典~~~~~

curl dict://dict.org/d:computer

今天為了檢查所有刺猬主機(jī)上所有域名是否有備案.在使用wget不爽的情況下,找到了curl這個(gè)命令行流量器命令.發(fā)現(xiàn)其對(duì)post的調(diào)用還是蠻好的.特別有利于對(duì)提交信息及變

更參數(shù)進(jìn)行較驗(yàn).對(duì)于我想將幾十萬(wàn)域名到miibeian.gov.cn進(jìn)行驗(yàn)證是否有備案信息非常有用.發(fā)現(xiàn)這篇文章很不錯(cuò),特為轉(zhuǎn)貼.

我的目標(biāo):

curl -d "cxfs=1&ym=xieyy.cn" http://www.miibeian.gov.cn/baxx_cx_servlet

在出來(lái)的信息中進(jìn)行過(guò)濾,提取備案號(hào)信息,并設(shè)置一個(gè)標(biāo)識(shí)位.將域名,備案號(hào)及標(biāo)識(shí)位入庫(kù)

用curl命令,post提交帶空格的數(shù)據(jù)

今天偶然遇到一個(gè)情況,我想用curl登入一個(gè)網(wǎng)頁(yè),無(wú)意間發(fā)現(xiàn)要post的數(shù)據(jù)里帶空格。比如用戶名為"abcdef",密碼為"abc def",其中有一個(gè)空格,按照我以前的方式提交:

curl -D cookie -d "username=abcdef&password=abc def" http://login.xxx.com/提示登入失敗。

于是查看curl手冊(cè)man curl。找到:

d/--data (HTTP) Sends the speci?ed data in a POST request to the HTTP server, in a way that can emulate as if a user has ?lled in a HTML form and pressed the

submit button. Note that the data is sent exactly as speci?ed with no extra processing (with all newlines cut off). The data is expected to be "url-encoded".

This will cause curl to pass the data to the server using the content-type application/x-www-form-urlencoded. Compare to -F/--form. If this option is used

more than once on the same command line, the data pieces speci?ed will be merged together with a separating &-letter. Thus, using ’-d name=daniel -d

skill=lousy’ would generate a post chunk that looks like ’name=daniel&skill=lousy’.

于是改用:

curl -D cookie -d "username=abcdef" -d "password=abc efg" http://login.xxx.com/這樣就能成功登入了。【注:需要更多免費(fèi)學(xué)習(xí)視頻+資料+源碼,請(qǐng)加QQ:2632311208】


本文版權(quán)歸黑馬程序員人工智能+Python學(xué)院所有,歡迎轉(zhuǎn)載,轉(zhuǎn)載請(qǐng)注明作者出處。謝謝!


作者:黑馬程序員人工智能+Python培訓(xùn)學(xué)院


首發(fā):http://python.itheima.com/


分享到:
在線咨詢 我要報(bào)名
和我們?cè)诰€交談!