爬虫基础
1 爬虫概念
1.1 爬虫的概念
网络爬虫也叫网络蜘蛛,它特指一类自动批量下载网络资源的程序,这是一个比较口语化的定义。
更加专业和全面对的定义是:网络爬虫是伪装成客户端与服务端进行数据交互的程序。
1.2 爬虫的应用
- 数据采集
大数据时代来临,数据就是核心,数据就是生产力,越来越多的企业开始注重收集用户数据,而爬虫技术是收集数据的一种重要手段。 - 搜索引擎
百度,谷歌等搜索引擎都是基于爬虫技术。 - 模拟操作
爬虫也被广泛用于模拟用户操作,测试机器人,灌水机器人等
1.3 爬虫开发的难重点
- 数据的获取
网络公共资源都是为用户准备的,为了避免被爬虫采集,服务端会设置非常多的图灵测试,阻止爬虫的恶意爬取,也即是反爬措施。爬虫开发工程师在开发爬虫时,需要解决这些反爬措施。我们在开发爬虫的过程中,有很大一部分的工作就是处理这些反爬措施。 - 采集的速度
大数据时代,需要巨大的数据量,动辄千万条的级别,甚至上亿条。如果采集速度跟不上,耗时过长,那么就达不到商业要求。一般我们会采取并发以及分布式来解决速度上的问题。这也是爬虫开发过程中的另外一个重心
2 会话技术
2.1 Cookie
http是无状态的,那服务端怎么区分同一个用户的连续请求呢,这就用到了会话技术:cookie和session。
Cookie有时也用其复数形式 Cookies,英文是饼干的意思。指某些网站为了辨别用户身份、进行 session 跟踪而储存在用户本地终端上的数据(通常经过加密)。最新的规范是 RFC6265 。
Cookie其实就是由服务器发给客户端的特殊信息,而这些信息以文本文件的方式存放在客户端,然后客户端每次向服务器发送请求的时候都会带上这些特殊的信息。 服务器在接收到Cookie以后,会验证Cookie的信息,以此来辨别用户的身份。
Cookie可以理解为一个凭证
2.2 Session
Session,中文经常翻译为会话,其本来的含义是指有始有终的一系列动作/消息,比如打电话时从拿起电话拨号到挂断电话这中间的一系列过程可以称之为一个session。这个词在各个领域都有在使用。
而我们web领域,一般使用的是其本义,一个浏览器窗口从打开到关闭这个期间。
Session的目的则是,在一个客户从打开浏览器到关闭浏览器这个期间内,发起的所有请求都可以被识别为同一个用户。而实现的方式则是,在一个客户打开浏览器开始访问网站的时候,会生成一个cookie,SessionID,这个ID每次的访问都会带上,而服务器会识别这个SessionID并且将与这个SessionID有关的数据保存在服务器上。由此来实现客户端的状态识别。因此session是基于cookie的
Session与Cookie相反,Session是存储在服务器上的数据,只由客户端传上来的SessionId来进行判定,所以相对于Cookie,Session的安全性更高。
一般SessionID会在浏览器被关闭时丢弃,或者服务器会验证Session的活跃程度,例如30分钟某一个SessionID都没有活跃,那么也会被识别为失效
3 socket
socket基本实现步骤:
- 创建客户端
- 连接服务端
- 客户端向服务端发送请求报文
- 服务端向客户端返回响应报文
- 断开链接
import socket
client = socket.socket() # 创建客户端
client.connect((domain, port_num)) # 连接服务端
request_url = 'GET /index?id=1&name=aa HTTP/1.0\r\nHost: baidu.com\r\n\r\n' # 请求报文
client.send(request_url.encode()) # 发送请求数据
client.recv(1024) # 接收1024字节的数据 返回的数据类似于放置于管道中,需要一点一点取,再取数据的这个过程就是阻塞状态
client.close() # 断开链接
4 urllib库
urllib 是一个用来处理网络请求的python标准库,它包含4个模块:
urllib.requests >> 请求模块,用于发起网络请求
urllib.parse >> 解析模块,用于解析URL
urllib.error >> 异常处理模块,用于处理request引起的异常
urllib.robotparse >> 用于解析robots.tex文件
4.1 urllib.request
request模块主要负责构造和发起网络请求,并在其中添加Headers,Proxy等。
利用它可以模拟浏览器的请求发起过程。
4.11 发起网络请求
urllib.request.urlopen(url, data=None, [timeout, ]*, cafile=None, capath=None, cadefault=False, context=None)
# urlopen是一个简单发送网络请求的方法。它接收一个字符串格式的url,它会向传入的url发送网络请求,然后返回结果,只能进行最基本的请求,不能带headers,proxy等参数
from urllib import request
response = request.urlopen(url='www.baidu.com/get')
#urlopen默认会发送get请求,当传入data参数时,则会发起POST请求。data参数是字节类型、者类文件对象或可迭代对象。
from urllib import request
response = request.urlopen(url='www.baidu.com/post',
data=b'username=aa&password=bb'
)
# 还才可以设置超时,如果请求超过设置时间,则抛出异常。timeout没有指定则用系统默认设置,timeout只对,http,https以及ftp连接起作用。它以秒为单位,比如可以设置timeout=0.1 超时时间为0.1秒。
response = request.urlopen(url='www.baidu.com', timeout=1)
4.12 添加添加headers
添加headers需要使用Request方法来进行
from urllib import request
headers = {
'User-Agant':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36'
} # 谷歌浏览器的User-Agant
response = request.Request('http://www.baidu.com', headers=headers)
4.13 操作cookie
操作cookie也需要使用Request方法来进行