概念

爬虫就是对网页的获取。

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

爬虫的工作原理和浏览器浏览网页的原理类似,是请求/返回模式,就是说客户端向服务器提出访问某个页面的请求(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是不是它自己,如果不是,有的服务器不会响应。

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

爬虫基本知识之C/S交互的更多相关文章

  1. Python静态网页爬虫相关知识

    想要开发一个简单的Python爬虫案例,并在Python3以上的环境下运行,那么需要掌握哪些知识才能完成一个简单的Python爬虫呢? 爬虫的架构实现 爬虫包括调度器,管理器,解析器,下载器和输出器. ...

  2. python网络爬虫,知识储备,简单爬虫的必知必会,【核心】

    知识储备,简单爬虫的必知必会,[核心] 一.实验说明 1. 环境登录 无需密码自动登录,系统用户名shiyanlou 2. 环境介绍 本实验环境采用带桌面的Ubuntu Linux环境,实验中会用到桌 ...

  3. python 爬虫基础知识一

    网络爬虫(又被称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动的抓取万维网信息的程序或者脚本. 网络爬虫必备知识点 1. Python基础知识2. P ...

  4. python 爬虫基础知识(继续补充)

    学了这么久爬虫,今天整理一下相关知识点,还会继续更新 HTTP和HTTPS HTTP协议(HyperText Transfer Protocol,超文本传输协议):是一种发布和接收 HTML页面的方法 ...

  5. 网络爬虫必备知识之urllib库

    就库的范围,个人认为网络爬虫必备库知识包括urllib.requests.re.BeautifulSoup.concurrent.futures,接下来将结合爬虫示例分别对urllib库的使用方法进行 ...

  6. 网络爬虫必备知识之requests库

    就库的范围,个人认为网络爬虫必备库知识包括urllib.requests.re.BeautifulSoup.concurrent.futures,接下来将结对requests库的使用方法进行总结 1. ...

  7. 网络爬虫必备知识之concurrent.futures库

    就库的范围,个人认为网络爬虫必备库知识包括urllib.requests.re.BeautifulSoup.concurrent.futures,接下来将结对concurrent.futures库的使 ...

  8. 自学Python四 爬虫基础知识储备

    首先,推荐两个关于python爬虫不错的博客:Python爬虫入门教程专栏   和 Python爬虫学习系列教程 .写的都非常不错,我学习到了很多东西!在此,我就我看到的学到的进行总结一下! 爬虫就是 ...

  9. 【VB6】使用VB6创建和访问Dom树【爬虫基础知识 】

    使用VB6创建和访问Dom树 关键字:VB,DOM,HTML,爬虫,IHTMLDocument 我们知道,在VB中一般大家会用WebBrowser来获取和操作dom对象. 但是,有这样一种情形,却让我 ...

随机推荐

  1. Tomcat源码分析 (二)----- Tomcat整体架构及组件

    前言 Tomcat的前身为Catalina,而Catalina又是一个轻量级的Servlet容器.在美国,catalina是一个很美的小岛.所以Tomcat作者的寓意可能是想把Tomcat设计成一个优 ...

  2. 11、增强型for循环对二维数组的输出(test8.java)

    由于笔者原因,这部分知识,尚不能整理出代码,笔者会好好学习增强型for循环中迭代起的相关知识,在笔者有能力,书写好这段代码后,将对本篇文章,进行二次修改,也同时欢迎大家与笔者交流,共同学习,共同进步. ...

  3. 【POJ - 2236】Wireless Network (并查集)

    Wireless Network 这接翻译了 Descriptions 地震发生在东南亚.ACM(亚洲合作医疗团队)已经与膝上电脑建立了无线网络,但是一次意外的余震袭击,网络中的所有计算机都被打破了. ...

  4. eclipse插件——maven

    项目开发中遇到的问题 都是同样的代码,为什么在我的机器上可以编译执行,而在他的机器上就不行? 为什么在我的机器上可以正常打包,而配置管理员却打不出来? 项目组加入了新的人员,我要给他说明编译环境如何设 ...

  5. 手写Struts,带你深入源码中心解析

    个人剖析,不喜勿喷 扫码关注公众号,不定期更新干活 在此申明本博文并非原创,原文:http://blog.csdn.net/lenotang/article/details/3336623,本文章是在 ...

  6. java秒杀系列(2)- 页面静态化技术

    前言 通过代码片段分别介绍服务端渲染.客户端渲染.对象缓存三种方式的写法. 代码片段仅供参考,具体实现需要根据业务场景自行适配,但思想都是一样. 一.服务端渲染方式 1.接口返回html页面的设置 @ ...

  7. 通过livy向CDH集群的spark提交任务

    场景 产品中需要通过前端界面选择执行某种任务(spark任务),然后通过livy 的restful api 提交集群的spark任务 简单介绍下livy,翻译自官网: Livy是基于Apache许可的 ...

  8. web 前端开发学习路线

    初级 HTML 5 HTML 5 与 HTML 4 的区别 HTML 5 新增的主体结构元素 HTML 5 新增的非主体结构元素 HTML 5 表单新增元素与属性 HTML 5 表单新增元素与属性(续 ...

  9. Linux内核DTB文件启动的几种方式

      版权:  凌云物网智科实验室< www.iot-yun.com > 声明:  本文档由凌云物网智科实验室郭工编著! 作者:  郭文学< QQ: 281143292  guowen ...

  10. springboot 整合shiro

    参考:        https://blog.csdn.net/fuweilian1/article/details/80309192(推荐)       https://blog.csdn.net ...