第一次接触到python是一个很偶然的因素,由于经常在网上看连载小说,很多小说都是上几百的连载。因此想到能不能自己做一个工具自动下载这些小说,然后copy到电脑或者手机上,这样在没有网络或者网络信号不好的时候都可以看。当时还不知道网络爬虫的概念。工作学习中用得最多的是C编程,但是对于网络世界而言,C确实不是一个好的语音,C更多面向硬件和内核。基于想自己下载网络小说的念头,认识到了python. 使用过后真是觉得是一门适合网络的语言,加上数不清的第三方库可以使用。适合快速开发。当然python也在数据分析,自然语义方面也有很多优势。这里主要介绍在网络方面的应用。

说到网络,和我们最接近的就是网页了。网页主要技术是http,当然还有javascript,XML,JSON,TCP连接等一大堆前端,后端的东东,关于http的知识这里不做多的描述,推荐看下http权威指南。

网页都是用html语言写的,关于HTML语言W3CSCHOOL上面有大量的介绍。而网络爬虫就是主要针对HTML语言而言。不如下面的百度的界面,用google浏览器点击F12,IE右击鼠标,然后选择查看网页源代码。左边是我们上网看到的百度页面,右边就是html源代码。被script包含的部分就是javascript。 这个页面主要是动态加载的页面,显示的内容主要是用javascript来驱动。看上去还不太直观。下面我们看一个更简单的

在百度一下上右击鼠标,然后选择审查元素,对于的HMTL代码就显示出来

具体的代码:可以看到百度一下的这几个字在input元素里面,代表的是这是一个输入框

也许有人问,这和网络爬虫以及下载小说有啥关系,别急,前面的只是个网页的入门介绍。下面我们来看个小说的界面:下面是迅读网的小说,左边是小说正文,右边是相关的网页代码。大家看到没有,所有的小说正文都包含在标签是<div>并且id=”content_1”的的元素里面

如果我们能有工具能自动将HTML代码对应元素内容自动下载下来。不就可以自动下载小说了。这就是网络爬虫的功能,说白了网络爬虫就是解析HMTL代码并保存下来然后进行后处理的。简单来说就三个步骤:1 解析网页得到数据,2 保存数据 3 数据的后处理。下面我们就首先从第一步解析网页得到数据开始。

访问网页首先要请求URL,也就是网址链接。Python提供了urllib2函数进行链接。具体如下:

import urllib2
req=urllib2.Request('http://www.baidu.com.cn')
fd=urllib2.urlopen(req)

Request里面的第一个参数为网址的链接,里面还可以携带头信息以及具体要传递给网址的信息。这样说比较抽象。我们用wireshark抓取一个上网的报文。在google浏览器中输入www.sina.com.cn.可以看到如下信息。这就是从电脑上发出去的请求。其中有几个关键信息:Request Method: Get. 这里有两种方式,Get和Post,Get主要是用于请求数据,Post可以用来提交数据。

User-Agent指的是用户代码,什么意思呢。通过这些消息,服务器就能够识别客户使用的操作系统以及浏览器。一般服务器可以通过来识别是否是爬虫。这个后面讲

Referer可以认为是你需要从服务器上请求什么网址,这里可以看到就是sina

Accet-Encoding: 这是告诉电脑可以接受的数据压缩方式。

上图是浏览器上输入网址得到的抓包结果。如果我们运行程序结果会如何呢。下图是刚才python代码的截图结果。访问的网址是百度。从下面可以看到明显的差别。最重要的就是User-Agent变成了Python-urllib2/2.7. 这个字段给服务器一个明确的提示,这是一个程序发起的网页链接,也就是爬虫,而不是坐在电脑前的人在访问。由于爬虫进行链接一样会进行TCP等底层链接,因此为了防止大规模爬虫同时进行网页爬取。服务器会根据User-Agent来判断,如果是爬虫,则直接拒绝。

那么为了防止服务器禁掉我们的申请,该如何应对呢。我们自程序中自己构造一个和真实浏览器一样的User_Agent不就一样了。

user_agent="Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.80 Safari/537.36"
headers={'User-Agent':user_agent}
req=urllib2.Request('http://www.baidu.com.cn','',headers)
fd=urllib2.urlopen(req)

添加了headers的描述。Request的第一个参数是网址,第二个参数是提交的数据,第三个参数是头信息。这里第二个参数暂时为空。第三个参数添加头信息,以字典的形式。可以看到抓包信息如下。这里就变成了我们和浏览器一样的形式,这样服务器就不会认为是爬虫了。下一步就是放心的抓取网页数据了。

有同学可能会问,如果我不小心输错了网址,该怎么办呢。这就要用到python的异常保护机制了。代码可以修改如下:

try:
        user_agent="Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.80 Safari/537.36"
       
headers={'User-Agent':user_agent}
        req=urllib2.Request('http://www.baidu.com.cn','',headers)
        fd=urllib2.urlopen(req)
        print fd.read().decode('utf-8').encode('GB18030')
        html=BeautifulSoup(fd.read(),"lxml")
#        print html.encode('gbk')     except urllib2.URLError,e:
        print e.reason

增加了保护机制,其中URLError在没有网络连接或者服务器不存在的情况下产生,这种情况下,异常通常会带有reason属性.HTTP的错误码如下,具体参考HTTP权威指南

200:请求成功      处理方式:获得响应的内容,进行处理

201:请求完成,结果是创建了新资源。新创建资源的URI可在响应的实体中得到    处理方式:爬虫中不会遇到

202:请求被接受,但处理尚未完成    处理方式:阻塞等待

204:服务器端已经实现了请求,但是没有返回新的信 息。如果客户是用户代理,则无须为此更新自身的文档视图。    处理方式:丢弃

300:该状态码不被HTTP/1.0的应用程序直接使用, 只是作为3XX类型回应的默认解释。存在多个可用的被请求资源。    处理方式:若程序中能够处理,则进行进一步处理,如果程序中不能处理,则丢弃
301:请求到的资源都会分配一个永久的URL,这样就可以在将来通过该URL来访问此资源    处理方式:重定向到分配的URL
302:请求到的资源在一个不同的URL处临时保存   
 处理方式:重定向到临时的URL

304 请求的资源未更新     处理方式:丢弃

400 非法请求     处理方式:丢弃

401 未授权     处理方式:丢弃

403 禁止     处理方式:丢弃

404 没有找到     处理方式:丢弃

5XX 回应代码以“5”开头的状态码表示服务器端发现自己出现错误,不能继续执行请求  
 处理方式:丢弃

下面就是要打印出获取到的网页信息了。Request返回一个获取网页的实体,urlopen则是实现打开网页fd.read()则可以打印出网页的具体信息

代码里面有这个decode和encode的消息。这个是干嘛用的呢。这个主要是针对网页中的中文。Python3之前的中文输出是一个很忧伤的事情。

print fd.read().decode('utf-8').encode('GB18030')

网页上的数据也有自己的编码方式,从下面的截图的网页代码看到编码方式是utf-8.而在windows中中文的编码方式是GBK。

因此如果不进行编码转换的话,网页中的中文就会是乱码形式:

那么是否可以提前获取网页的编码方式呢,这也是可以的。如下代码就可以得到网页返回的编码方式

fd1=urllib2.urlopen(req).info()
print fd1.getparam('charset')
到此,我们已经成功的进行网页链接,并获取到了网页内容。下一步就是进行网页解析了。后面讲介绍beautifulSoup,lxml,HTMLParser,scrapy,selenium等常用的爬虫工具用法

python网络爬虫之初识网络爬虫的更多相关文章

  1. 使用Python爬虫爬取网络美女图片

    代码地址如下:http://www.demodashi.com/demo/13500.html 准备工作 安装python3.6 略 安装requests库(用于请求静态页面) pip install ...

  2. Python 网络爬虫 001 (科普) 网络爬虫简介

    Python 网络爬虫 001 (科普) 网络爬虫简介 1. 网络爬虫是干什么的 我举几个生活中的例子: 例子一: 我平时会将 学到的知识 和 积累的经验 写成博客发送到CSDN博客网站上,那么对于我 ...

  3. 【网络爬虫入门03】爬虫解析利器beautifulSoup模块的基本应用

    [网络爬虫入门03]爬虫解析利器beautifulSoup模块的基本应用   1.引言 网络爬虫最终的目的就是过滤选取网络信息,因此最重要的就是解析器了,其性能的优劣直接决定这网络爬虫的速度和效率.B ...

  4. iOS开发——网络实用技术OC篇&网络爬虫-使用青花瓷抓取网络数据

    网络爬虫-使用青花瓷抓取网络数据 由于最近在研究网络爬虫相关技术,刚好看到一篇的的搬了过来! 望谅解..... 写本文的契机主要是前段时间有次用青花瓷抓包有一步忘了,在网上查了半天也没找到写的完整的教 ...

  5. python3编写网络爬虫23-分布式爬虫

    一.分布式爬虫 前面我们了解Scrapy爬虫框架的基本用法 这些框架都是在同一台主机运行的 爬取效率有限 如果多台主机协同爬取 爬取效率必然成倍增长这就是分布式爬虫的优势 1. 分布式爬虫基本原理 1 ...

  6. Python 爬虫3——第一个爬虫脚本的创建

    在进行真正的爬虫工程创建之前,我们先要明确我们所要操作的对象是什么?完成所有操作之后要获取到的数据或信息是什么? 首先是第一个问题:操作对象,爬虫全称是网络爬虫,顾名思义,它所操作的对象当然就是网页, ...

  7. Python爬虫与数据分析之爬虫技能:urlib库、xpath选择器、正则表达式

    专栏目录: Python爬虫与数据分析之python教学视频.python源码分享,python Python爬虫与数据分析之基础教程:Python的语法.字典.元组.列表 Python爬虫与数据分析 ...

  8. python 全栈开发,Day137(爬虫系列之第4章-scrapy框架)

    一.scrapy框架简介 1. 介绍 Scrapy一个开源和协作的框架,其最初是为了页面抓取 (更确切来说, 网络抓取 )所设计的,使用它可以以快速.简单.可扩展的方式从网站中提取所需的数据.但目前S ...

  9. 2.Python爬虫入门二之爬虫基础了解

    1.什么是爬虫 爬虫,即网络爬虫,大家可以理解为在网络上爬行的一直蜘蛛,互联网就比作一张大网,而爬虫便是在这张网上爬来爬去的蜘蛛咯,如果它遇到资源,那么它就会抓取下来.想抓取什么?这个由你来控制它咯. ...

随机推荐

  1. 2016北京集训测试赛(十六)Problem C: ball

    Solution 这是一道好题. 考虑球体的体积是怎么计算的: 我们令\(f_k(r)\)表示\(x\)维单位球的体积, 则 \[ f_k(1) = \int_{-1}^1 f_{k - 1}(\sq ...

  2. 轻量i3wm配置使用笔记 -- 主题切换器(j4-make-config)

    快速切换主题 j4-make-config介绍: j4-make-config脚本可以方便地在几组"主题"之间切换,还可以根据当前工作的环境,轻松地从几个不同的配置部分组合一个完整 ...

  3. 详解Webpack2的那些路径

    Webpack2 中有很多涉及路径参数配置,若不知其所以然,很容易混淆出错.本文尽可能的汇集了 Webpack2 中设计路径的配置,力争深入浅出. context context 是 webpack ...

  4. 某音乐类App评论相关API的分析及SQL注入尝试

    关键字:APIfen.工具使用.sql注入 涉及工具/包:Fiddler.Burpsuite.Js2Py.Closure Compiler.selenium.phantomjs.sqlmap 摘要: ...

  5. Solidworks如何使用Toolbox

    Toolbox不仅仅是智能扣件.事实上,一般常见的轴承,螺栓,齿轮都有了,点击右侧的设计库即可展开Toolbox   配置完成后我只留下一个GB   比如我要选一个圆锥滚子轴承,从右边拖进来即可   ...

  6. Vue 响应式数据说明

    值得注意的是只有当实例被创建时 data 中存在的属性才是响应式的.也就是说如果你添加一个新的属性,比如: vm.b = 'hi' 那么对 b 的改动将不会触发任何视图的更新. 这里唯一的例外是使用  ...

  7. [BLE--Link Layer]物理信道

    简述 有线通信,是用电缆直接连接.然后分距离的长短.有些会须要载入波,信号也可能会经过不同的调制方式调制. 无线通信也是一样,仅仅是信号的传输是通过射频了,通过在某一频段.对无线信道进行调制,将数据发 ...

  8. C语言的空格问题

    对于C语言中,一般的理解是对于空格,我们可以随意输入,因为空格没啥大意义,但是事实上并非如此. 1.'\'空格的问题 '\' 字符可用于一些字符进行转移,当然也包括了 newline(enter),被 ...

  9. iPhone X

    iPhone X前置深度摄像头带来了Animoji和face ID,同时也将3D Face Tracking的接口开放给了开发者.有幸去Cupertino苹果总部参加了iPhone X的封闭开发,本文 ...

  10. VueJS锚定

    锚定函数 指令定义函数提供了几个钩子函数(可选): bind: 只调用一次,指令第一次绑定到元素时调用,用这个钩子函数可以定义一个在绑定时执行一次的初始化动作. inserted: 被绑定元素插入父节 ...