教育行业A股IPO第一股(股票代码 003032)

全国咨询/投诉热线:400-618-4000

零基础学习网络爬虫知识(二)

更新时间:2016年06月20日17时56分 来源:传智播客 浏览次数:

  1、CURL使用


  curl命令可以用来构造http请求。参数有很多,常用的参数如下:


  通用语法:


  curl [option] [URL...]


  2、option


  curl的选项功能:


  ♦ 不带任何参数时 curl 将返回指定url中的数据并打印在屏幕上

  ♦ -u 使用用户名和密码登陆。如curl –u name:passwd URL

  ♦ -b/--cookie 向服务器提交cookie,若无=则name视为文件名,例如:curl -b cookie.txt www.linuxidc.com

  ♦ -o out 将指定curl返回保存为out文件,内容从html/jpg到各种MIME类型文件。如curl -o page.html URL

  ♦ -d 向服务器POST表单数据 例如:curl -d "order=111&count=2" http://www.linuxidc.com/buy

  ♦ -A/--user-agent 指定发送请求的用户代理,例如: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 将服务器的返回的header保存为文件,头部的cookie也可被保存,例如:curl -D header.txt www.linuxidc.com

  o 如果希望从本地文件中获取表单数据,则在文件名前加@ ,例如:curl -d @data.xml http://www.linuxidc.com

  o 若希望从标准输入获取则用 curl -d "name=username&passwd=pwd" http://www.linuxidc.com

  ♦ -L 当页面有跳转的时候,输出跳转到的页面

  ♦ -I header信息 当有跳转时,可以通过 curl -L -I URL|grep Location 来确定跳转到的新url地址

  ♦-c 保存服务器的cookie文件

  ♦ -e url 设置引用头的值

  ♦ -T localfile 向服务器PUT文件 例如:curl -T 1.mp3 www.linuxidc.com/upload.php

  ♦ -F 向服务器POST表单,例如:curl -F "web=@index.html;type=text/html" url.com

  ♦ -E cert.pem 指定本地证书

  ♦ -H 为HTTP请求设置任意header及值。如curl -H "Connection:keep-alive" http://www.linuxidc.com

  ♦ -X/--request method 用户定义的HTTP请求方法名如 curl -X GET www.baidu.com

  ♦ --compressed 采用压缩方式接收返回数据

  ♦--connect-timeout 设置超时时间

  ♦-v 详细输出,包含请求和响应的首部

  ♦ --retry num

  ♦ --retry timeo 指定重试的次数和间隔

  ♦ --tcp-nodelay 打开TCP_NODELAY选项 不进行捎带确认

  ♦ -O 按服务器上的名称保存下载的文件

  ♦ -r/--range from-to 下载指定range内的数据

  ♦ -C 在保存文件时进行续传


  3、使用实例


  Curl是Linux下一个很强大的http命令行工具,其功能十分强大。


  1) 先从这里开始吧!


  $ curl http://www.linuxidc.com

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


  2) 要想把读过来页面存下来,是不是要这样呢?


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

  当然可以,但不用这么麻烦的!

  用curl的内置option就好,存下http的结果,用这个option: -o

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

  这样,你就可以看到屏幕上出现一个下载页面进度指示。等进展到100%,自然就 OK咯


  3) proxy设定。

  使用curl的时候,用这个option可以指定http访问所使用的proxy服务器及其端口: -x

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


  4) 访问有些网站的时候比较讨厌,他使用cookie来记录session信息。


  像IE/NN这样的浏览器,当然可以轻易处理cookie信息,但我们的curl呢?.....

  我们来学习这个option: -D <— 这个是把http的response里面的cookie信息存到一个特别的文件中去

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

  这样,当页面被存到page.html的同时,cookie信息也被存到了cookie0001.txt里面了


  5)那么,下一次访问的时候,如何继续使用上次留下的cookie信息呢?要知道,很多网站都是靠监视你的cookie信息,来判断你是不是不按规矩访问他们的网站的。


  这次我们使用这个option来把上次的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操作,去访问网页了!


  6)浏览器信息


  有些讨厌的网站总要我们使用某些特定的浏览器去访问他们,有时候更过分的是,还要使用某些特定的版本

  curl给我们提供了一个有用的option,可以让我们随意指定自己这次访问所宣称的自己的浏览器信息: -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

  这样,服务器端接到访问的要求,会认为你是一个运行在Windows 2000上的 IE6.0

  而"Mozilla/4.73 [en] (X11; U; Linux 2.2; 15 i686"则可以告诉对方你是一台 PC上跑着的Linux,用的是Netscape 4.73


  7)另外一个服务器端常用的限制方法,就是检查http访问的referer。比如你先访问首页,再访问里面所指定的下载页,这第二次访问的 referer地址就是第一次访问成功后的页面地址。这样,服务器端只要发现对下载页面某次访问的referer地址不是首页的地址,就可以断定那是个盗连了 ~


  curl给我们提供了设定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

  这样,就可以骗对方的服务器,你是从mail.linuxidc.com点击某个链接过来的了。


  8) 利用curl 下载文件


  刚才讲过了,下载页面到一个文件里,可以使用 -o ,下载文件也是一样。比如,

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

  这里教大家一个新的option: -O 大写的O,这么用:

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

  这样,就可以按照服务器上的文件名,自动存在本地了!

  再来一个更好用的。

  如果screen1.JPG以外还有screen2.JPG、screen3.JPG、....、screen10.JPG需要下载,难不成还要让我们写一个script来完成这些操作?

  在curl里面,这么写就可以了:

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


  9)再来,我们继续讲解下载!


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

  这样产生的下载,就是

  ~zzh/001.JPG

  ~zzh/002.JPG

  ...

  ~zzh/201.JPG

  ~nick/001.JPG

  ~nick/002.JPG

  ...

  ~nick/201.JPG

  够方便的了吧

  由于zzh/nick下的文件名都是001,002...,201,下载下来的文件重名,后面的把前面的文件都给覆盖掉了 ~

  没关系,我们还有更狠的!

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

  —这是.....自定义文件名的下载?

  这样,自定义出来下载下来的文件名,就变成了这样:原来: ~zzh/001.JPG —-> 下载后: 001-zzh.JPG 原来: ~nick/001.JPG —-> 下载后: 001-nick.JPG

  这样一来,就不怕文件重名啦。


  9)继续讲下载


  我们平时在windows平台上,flashget这样的工具可以帮我们分块并行下载,还可以断线续传。

  curl在这些方面也不输给谁,嘿嘿

  比如我们下载screen1.JPG中,突然掉线了,我们就可以这样开始续传

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

  当然,你不要拿个flashget下载了一半的文件来糊弄我~~~~别的下载软件的半截文件可不一定能用哦~~~

  分块下载,我们使用这个option就可以了: -r


  举例说明:


  比如我们有一个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

  这样就可以分块下载啦。

  不过你需要自己把这些破碎的文件合并起来

  如果你用UNIX或苹果,用 cat zhao.part* > zhao.mp3就可以

  如果用的是Windows,用copy /b 来解决

  上面讲的都是http协议的下载,其实ftp也一样可以用。

  用法嘛,curl -u name:passwd ftp://ip:port/path/file 或者大家熟悉的curl ftp://name:passwd@ip:port/path/file


  10)上传的option是 -T


  比如我们向ftp传一个文件: curl -T localfile -u name:passwd ftp://upload_site:port/path/

  当然,向http服务器上传文件也可以

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

  注意,这时候,使用的协议是HTTP的PUT method

  刚才说到PUT,其他几种methos还没讲呢!

  GET和POST都不能忘哦。

  http提交一个表单,比较常用的是POST模式和GET模式

  GET模式什么option都不用,只需要把变量写在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

  就相当于向这个站点发出一次登陆申请~~~~~

  到底该用GET模式还是POST模式,要看对面服务器的程序设定。

  一点需要注意的是,POST模式下的文件上的文件上传,比如

  这样一个HTTP表单,我们要用curl进行模拟,就该是这样的语法:

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

  罗罗嗦嗦讲了这么多,其实curl还有很多很多技巧和用法

  比如 https的时候使用本地证书,就可以这样

  curl -E localcert.pem https://remote_server

  再比如,你还可以用curl通过dict协议去查字典~~~~~

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

  今天为了检查所有刺猬主机上所有域名是否有备案.在使用wget不爽的情况下,找到了curl这个命令行流量器命令.发现其对post的调用还是蛮好的.特别有利于对提交信息及变

  更参数进行较验.对于我想将几十万域名到miibeian.gov.cn进行验证是否有备案信息非常有用.发现这篇文章很不错,请支持。


  我的目标:


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

  在出来的信息中进行过滤,提取备案号信息,并设置一个标识位.将域名,备案号及标识位入库

  用curl命令,post提交带空格的数据

  今天偶然遇到一个情况,我想用curl登入一个网页,无意间发现要post的数据里带空格。比如用户名为"abcdef",密码为"abc def",其中有一个空格,按照我以前的方式提交:

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

  于是查看curl手册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/这样就能成功登入了。


0 分享到:
和我们在线交谈!