爬虫基本知识之C/S交互

概念

爬虫就是对网页的获取。

一般获取的网页中又有通向其他网页的通路,我们叫做超链接,那么就可以通过这样的通路获取更多其他的网页,就像一只在网路上爬行的蜘蛛,所以俗称爬虫。

爬虫的工作原理和浏览器浏览网页的原理类似,是请求/返回模式,就是说客户端向服务器提出访问某个页面的请求(request),服务器返回客户端请求的内容(response)。URL是表示互联网上每个文件的唯一标志,也就是我们所说的网址,客户端正是通过URL向某个具体网页发出请求的。最简单的过程可以用如下代码表示:

  1. import urllib2
  2. request = urllib2.Request("http://www.baidu.com")# 构造一个request请求
  3. response = urllib2.urlopen(request)#发送请求并获得一个response
  4. print response.read()#read()获取返回的内容并打印出来

Http协议之POST和GET

对于简单的静态网页,这样就已经足够了,能够很顺利的获取到html文本。
但是对于这个千变万化的互联网来说,这点东西是根本不够用的。第一个需要考虑就是动态网页,它需要我们动态的传参数给他,比如在登录的时候就需要提交用户名和密码等表单信息才允许我们进一步的获取信息。这就需要我们在构造request的同时传递更多的信息给服务器了。

说到传递参数,就要谈到HTTP协议与服务器的交互方式了。HTTP协议有六种请求的方法,分别是get,head,put,delete,post,options,其中基本的是GET、POST和PUT、DELET四种。我们知道,一个URL地址用于描述一个网络上的资源,HTTP中的GET, POST, PUT, DELETE就对应着对这个资源的查,改,增,删4个操作。对于爬虫中传递数据而言,用到的就是POST和GET了。下面来看看GET和POST的区别:
1.GET提交的数据会放在URL之后,以?分割URL和传输数据,参数之间以&相连
2.GET提交的数据大小有限制(因为浏览器对URL的长度有限制),而POST方法提交的数据没有限制。
3.GET方式需要使用Request.QueryString来取得变量的值,而POST方式通过Request.Form来获取变量的值。
4.GET方式提交数据,会带来安全问题,比如通过GET方式提交数据时,用户名和密码将出现在URL上,如果页面可以被缓存或者其他人可以访问这台机器,就可以从历史记录获得该用户的账号和密码。下面呈现了两种方式的提交方式。

POST方式

  1. import urllib2
  2. values ={"username":"985575418@qq.com","password":"XXXX"}
  3. data = urllib.urlencode(values)
  4. url ="https://passport.csdn.net/account/login?from=http://my.csdn.net/my/mycsdn"
  5. request = urllib2.Request(url,data)
  6. response = urllib2.urlopen(request)
  7. print response.read()

可以看到,这种方式先把需要提交的信息构造成一个data,然后和URL一同再去构造request对象。

GET方式

  1. import urllib2
  2. import urllib
  3. values ={"username":"985575418@qq.com","password":"XXXX"}
  4. data = urllib.urlencode(values)
  5. url ="http://passport.csdn.net/account/login"
  6. geturl = url +"?"+ data
  7. request = urllib2.Request(geturl)
  8. response = urllib2.urlopen(request)
  9. print response.read()

可以看到GET方式是直接把参数添加到了URL后面

设置Headers

即便如此,有的网站还是不允许访问的,会出现识别问题。这种时候我们为了真正的伪装成浏览器,还需要在构造request的时候设置一些Headers属性。打开浏览器查看网页的headers可以看到如下内容:

我们可以根据需要选择某些属性去构建request,比如下面用到了user-agent和referer。

  1. headers ={'User-Agent':'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)',
  2. 'Referer':'http://www.zhihu.com/articles'}
  3. request = urllib2.Request(url, headers = headers)

其中User-agent叫用户代理,是一种向网站提供所使用浏览器类型及版本、操作系统、浏览器内核等信息的标志,是伪装成浏览器的重要组成。真正的浏览器提供了这个属性也可以方便网站为用户提供更好的显示和体验。Referer显示的是是从哪个页面来到的当前页面,它可以用于防止反盗链,服务器会识别headers中的referer是不是它自己,如果不是,有的服务器不会响应。

有了上面的基础知识,就可以开始理解和实现真正的爬虫了。





posted @ 2016-12-06 21:25  木白的菜园  阅读(1139)  评论(0编辑  收藏  举报