2018-08-21

爬虫简介

什么是爬虫?

是一种按照一定的规则,自动地抓取互联网信息的程序或者脚本。

所谓网页抓取,就是把URL地址中指定的网络资源从网络流中读取出来,保存到本地。 在

Python中有很多库可以用来抓取网页

分类

通用爬虫(General Purpose Web Crawler)、 聚焦爬虫(Focused Web Crawler)、增量

式爬虫(Incremental Web Crawler)、深层爬虫(Deep Web Crawler)

通用网络爬虫

捜索引擎抓取系统(Baidu、Google、Yahoo 等)的重要组成部分。主要目的是将互联

网上的网页下载到本地,形成一个互联网内容的镜像备份。

聚焦爬虫

是"面向特定主题需求"的一种网络爬虫程序,它与通用搜索引擎爬虫的区别在于: 聚焦

爬虫在实施网页抓取时会对内容进行处理筛选,尽量保证只抓取与需求相关的网页信息。

增量式抓取

是指在具有一定量规模的网络页面集合的基础上,采用更新数据的方式选取已有集合中的过

时网页进行抓取,以保证所抓取到的数据与真实网络数据足够接近。进行增量式抓取的前提

是,系统已经抓取了足够数量的网络页面,并具有这些页面被抓取的时间信息。

深度爬虫

针对起始url地址进行数据采集,在响应数据中进行数据筛选得到需要进行数据采集的下一

波url地址,并将url地址添加到数据采集队列中进行二次爬取..以此类推,一致到所有页面

的数据全部采集完成即可完成深度数据采集,这里的深度指的就是url地址的检索深度。

爬虫步骤

网页抓取,数据提取,数据存储

HTTP协议

HTTP,HyperText Transfer Protocol,是互联网上应用最为广泛的一种网络协议。

是一个基于TCP/IP通信协议来传递数据,一个属于应用层的协议

浏览器作为HTTP客户端通过URL向HTTP服务端即WEB服务器发送所有请求。Web服

务器根据接收到的请求后,向客户端发送响应信息。

HTTPS(Hypertext Transfer Protocol over Secure Socket Layer)HTTP的安全版,在

HTTP下加入SSL层。

SSL(Secure Sockets Layer 安全套接层)主要用于Web的安全传输协议,在传输层对网

络连接进行加密,保障在Internet上数据传输的安全。

 HTTP 的端口号为 80,

 HTTPS 的端口号为 443

urlib的使用

在Python3.x中,我们可以使用urlib这个组件抓取网页,urllib是一个URL处理包,这个

包中集合了一些处理URL的模块

1.urllib.request模块是用来打开和读取URLs的;

2.urllib.error模块包含一些有urllib.request产生的错误,可以使用try进行捕捉处理;

3.urllib.parse模块包含了一些解析URLs的方法;

4.urllib.robotparser模块用来解析robots.txt文本文件.它提供了一个单独的RobotFileP

arser类,通过该类提供的can_fetch()方法测试爬虫是否可以下载一个页面。

urllib.request.urlopen()

这个接口函数就可以很轻松的打开一个网站,读取并打印信息。

from urllib import request

if __name__ == "__main__":

    response = request.urlopen("http://fanyi.baidu.com")

    html = response.read()

print(html)

说明

request.urlopen()打开和读取URLs信息,返回对象response

可以调用read(),进行读取。

print(),将读到的信息打印出来。

其实这就是浏览器接收到的信息,只不过我们在使用浏览器的时候,浏览器已经将这些信息

转化成了界面信息供我们浏览。

网页编码

虽然我们已经成功获取了信息,但是显然他们都是二进制的乱码

可以通过简单的decode()命令将网页的信息进行解码

from urllib import request

if __name__ == "__main__":

    response = request.urlopen("http://fanyi.baidu.com/")

    html = response.read()

    html = html.decode("utf-8")

print(html)

自动获取网页编码

chardet

第三方库,用来判断编码的模块

使用chardet.detect()方法,判断网页的编码方式

安装方法:

pip install chardet

代码:

from urllib import request

import chardet

if __name__ == "__main__":

    response = request.urlopen("http://fanyi.baidu.com/")

    html = response.read()

    charset = chardet.detect(html)

    print(charset)

Request对象

反爬虫机制:

1、 封杀爬虫程序

2、 封杀指定IP

3、 封杀非人操作的程序

如果需要执行更复杂的操作,比如增加 HTTP 报头,必须创建一个 Request 实例来作为

urlopen()的参数;而需要访问的 url 地址则作为 Request 实例的参数。

from urllib import request

if __name__ == "__main__":     

req = request.Request("http://fanyi.baidu.com/")    

 response = request.urlopen(req)

html = response.read() html = html.decode("utf-8") print(html)

User Agent

浏览器就是互联网世界上公认被允许的身份,如果我们希望我们的爬虫程序更像一个真

实用户,那我们第一步,就是需要伪装成一个被公认的浏览器。用不同的浏览器在发送

请求的时候,会有不同的 User-Agent 头。中文名为用户代理,简称UA

User Agent存放于Headers中

服务器就是通过查看Headers中的User Agent来判断是谁在访问。

urllib中默认的User Agent,会有Python的字样,如果服务器检查User Agent,可以拒

绝Python程序访问网站。

常见浏览器User-Agent:

https://blog.csdn.net/Kwoky/article/details/80381246

设置User Agent

方法 1:在创建 Request 对象的时候,填入 headers 参数(包含 User Agent 信息),这个

Headers参数要求为字典;

方法2:在创建Request对象的时候不添加headers参数,在创建完成之后,使用add_h

eader()的方法,添加headers。

代理分类

代理可以分为三种,即高度匿名代理、普通匿名代理和透明代理。

高度匿名代理 隐藏客户的真实IP,但是不改变客户机的请求,就像有个真正的客户浏览器

在访问服务器。

普通匿名代理 能隐藏客户机的真实 IP,会改变客户的请求信息,服务器端不知道你的 ip

地址但有可能认为我们使用了代理。

透明代理 不但改变了我们的请求信息,还会传送真实的IP地址。

爬虫程序运行速度是很快,在网站爬取数据时,一个固定IP的访问频率就会很高,这不符合

人为操作的标准。所以一些网站会设置一个IP访问频率的阈值,如果一个IP访问频率超过

这个阈值,说明这个不是人在访问,而是一个爬虫程序。

解决办法一:设置延时

解决办法二:使用 IP 代理。可以设置一些代理服务器,每隔一段时间换一个代理,就算 IP

被禁止,依然可以换个IP继续爬取。

免费短期代理网站举例:

西刺免费代理IP  http://www.xicidaili.com/

快代理免费代理  http://www.kuaidaili.com/free/inha/

聚合数据 https://www.juhe.cn/docs/api/id/62

代理IP选取

西刺网站为例,选出信号好的IP

使用代理的步骤:

(1)调用urlib.request.ProxyHandler(),构建处理器对象,proxies参数为一个字典。

  (2)创建Opener对象

(3)安装Opener

使用 install_opener 方法之后,会将程序默认的 urlopen 方法替换掉。也就是说,如果使

用install_opener之后,在该文件中,再次调用urlopen会使用自己创建好的opener。

代码:

if __name__ == "__main__":    

 #访问网址   

 #url = 'http://www.baidu.com/' 

url='http://ip.27399.com/’    

 #这是代理 IP    proxy = {'http':'113.92.156.185:808'}    

#创建 ProxyHandler    

 proxy_support = request.ProxyHandler(proxy)    

 #创建 Opener    

 opener = request.build_opener(proxy_support)   

 #添加 User Angent    

 opener.addheaders = [('User-Agent','Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36')]

你可能感兴趣的:(2018-08-21)