爬虫简介
什么是爬虫?
是一种按照一定的规则,自动地抓取互联网信息的程序或者脚本。
所谓网页抓取,就是把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')]