爬虫相关介绍
# 爬虫相关介绍
# 爬虫介绍
Python爬虫是一种自动化从互联网获取数据的技术,它通过编写程序实现自动访问网站并抓取所需的数据。主要通过代码模拟浏览器,向目标服务器发送请求,得到我们想要的数据。
# 应用场景
爬虫可以用于数据采集与挖掘、搜索引擎、价格比较与竞品分析、舆情监控与声誉管理、公共数据监测与分析、金融市场分析、学术研究和文献检索等。
# 工作流程
发送请求:
- 爬虫首先向目标网站发送HTTP请求,请求特定的网页内容。
- 通常使用GET或POST方法来获取网页数据。请求可能包含一些额外的参数,如请求头、Cookie等,以便模拟真实的浏览器行为。
获取响应:
- 响应通常包含网页的HTML代码和其他相关信息,如状态码、响应头等。
- 通过使用Python模块(如requests、selenium)可以获取到完整的响应内容。
解析内容:
- 爬虫对获取到的网页内容进行解析,提取出需要的信息,如链接、文本、图片等。
- 通过使用解析库(如BeautifulSoup、lxml)或者正则表达式等方式,对获取到的HTML代码进行解析。
存储数据:
- 爬虫将提取到的数据存储到本地文件、数据库或者内存中,以备后续处理或展示。
- 存储的方式可以依据具体需求和数据结构来进行选择,常用的存储方式包括文件、关系型数据库、非关系型数据库等。
跟踪链接:
- 爬虫根据规则或算法,跟踪网页中的链接,继续获取更多的页面内容,形成一个网页抓取的链条。
# 爬虫分类
- 通用爬虫和定向爬虫:
- 通用爬虫就是对整个互联网进行爬取。
- 定向爬虫就是只针对特定的网站进行爬取。
- 基于规则的爬虫和基于机器学习的爬虫:
- 基于规则的爬虫根据人工事先定义的规则提取数据。
- 基于机器学习的爬虫通过机器学习算法自动提取数据。
- 单机爬虫和分布式爬虫:
- 单机爬虫在单个计算机上进行爬取。
- 分布式爬虫通过多台计算机进行爬取。
# 常见反爬虫措施
频率限制
- 网站会针对某个IP地址或用户账号设置请求频率限制,如单位时间内只允许发送一定数量的请求。
- 一旦超出限制,网站会对该IP或账号进行处罚,如暂时封禁或限制访问。
封IP和封账号
- 网站可以通过监测异常行为,如频繁请求、高并发等来判断是否有恶意爬取行为,并对相关IP地址或账号进行封禁。
- 为了规避封禁,爬虫可以使用代理池来随机切换IP地址,或使用大量小号(账号池)轮流发送请求。
请求头中带加密信息
- 网站可能要求请求头中包含特定的加密信息,如Referer(来源页面地址)和User-Agent(浏览器标识),用于验证请求的合法性。
- 爬虫需要模拟真实浏览器的请求头信息,以避免被检测为非法爬虫。
响应回来的数据是加密
- 为了防止直接获取数据,网站可能会对返回的数据进行加密或编码,爬虫需要解密或解码才能获取到有效信息。
- 这种情况下,爬虫可能需要分析加密算法或从其他渠道获取解密密钥。
验证码反扒
- 网站为了防止机器自动注册、恶意爬取等行为,可能会在关键操作前设置验证码。
- 爬虫需要通过第三方平台或自己破解验证码来进行自动化操作。
JS加密
- 网站可能使用JavaScript对核心代码进行了压缩和混淆,并添加了一些晦涩的加密方法。爬虫需要逆向工程来还原和理解这些加密算法,并编写相应的代码进行解密。
手机设备唯一ID号
- 网站可能会根据爬虫请求的设备唯一标识符(例如IMEI、Android ID、iOS设备ID等)进行识别和限制。
- 爬虫可能需要模拟不同设备的请求,或者通过修改设备信息达到绕过检测的效果。
# 爬虫常用库
requests库
用于发送HTTP请求,方便地发送GET、POST等请求,并获取响应。
BeautifulSoup库
用于解析HTML和XML文档,方便地提取其中的数据。
Selenium库
用于模拟浏览器行为,模拟用户在浏览器中的操作,如点击、输入等。
Scrapy框架
提供了一套完整的爬虫开发流程,包括发送请求、获取响应、解析响应、存储数据等步骤。
# 前端简介
# 介绍
任何与用户直接打交道的操作界面,都可以称之为前端。而前端框架是提前封装好了很多操作,只需要按固定的语法调用即可。
比如:电脑界面、手机界面、平板界面等。
# 前端基础
html:页面的内容、骨架
css:页面的样式、外观
JavaScript:页面的动态效果
# 软件开发架构
客户端/服务端 (C/S)
客户端和服务端通过Socket进行交互。
浏览器/服务端 (B/S)
1. 浏览器向服务端发送HTTP请求。
2. 服务端接收HTTP请求,并返回相关响应。
3. 浏览器接收响应,并根据特定的规则解析渲染成页面展示给用户。
# 浏览器与前端报错
即便前端代码错误发生报错,浏览器也不会轻易地就将其展示出来,因为浏览器是面向用户的。
所以报错只能通过开发者工具(F12) 进行查看。
# HTTP协议
# 介绍
超文本传输协议,用来规定服务端和浏览器之间数据交互的格式。
# 四大特性
基于请求/响应。
基于TCP/IP的应用层协议。
无状态。
不保存任何一次请求响应的状态。
所以有时需要借助一些专门用来记录状态的技术,cookie、session、token等。
无/短连接。
请求一次响应一次,然后断开TCP连接。
# 请求数据格式 (请求报文)
请求首行
标识HTTP协议版本、当前请求方式(Get/Post)。
常用请求方式:
Get:一般用于向服务器要数据,也可以携带参数请求,参数放在url后面。
Post:一般用于向服务器提交数据。
请求头
一堆k,v键值对。
\r\n
用于标识分隔请求头和请求体。
请求体
向服务器提交数据时才会用到。
# 响应数据格式 (响应报文)
响应首行
标识HTTP协议版本、响应状态码。
响应头
一堆k,v键值对。
\r\n
用于标识分隔响应头和响应体。
响应体
服务端返回给浏览器的数据。
# 常见状态码
2xx
表示服务端接受到请求并成功响应了数据。
200:表示请求响应成功。
3xx
表示让客户端重定向。
301:永久重定向,浏览器会记录重定向URL,下次直接由浏览器去进行跳转,不再经过服务器
302:临时重定向,浏览器不会记录重定向的URL,每一次重定向都会经过服务器请求
4xx
表示请求错误。
403:当前请求不合法、或者没有访问权限。
404:请求资源不存在。
5xx
表示服务器内部错误。
# Socket实现Http服务端
# 实现例子
import socket
server = socket.socket()
server.bind(('127.0.0.1', 80))
server.listen(5)
while 1:
conn, addr = server.accept()
# 接受HTTP请求
data = conn.recv(1024)
print(data)
# 返回HTTP响应
up = b'HTTP/1.1 200 OK\r\nName: test\r\n\r\nHELLO WORLD!'
with open('index.html', 'rb') as f:
content = f.read()
conn.send(up + content)
conn.close()
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 注意
我们通常是读取文件的数据来作为响应体的数据。
由于HTTP是无连接的协议,所以客户端接收到响应后,会立即关闭连接。所以服务端应该一次性将响应报文进行返回,然后关闭连接以释放系统资源。