IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 网络协议 -> 如何从0开始编写一个网络爬虫? -> 正文阅读

[网络协议]如何从0开始编写一个网络爬虫?

导读

在开始之前,望读者提前了解过计算机网络的相关知识(尤其是HTTP协议与SSL/TLS加密)与基础的代码编写(不限于语言类型)。
以下代码均以Python3为例(因其代码简易,故使用其进行演示)
未安装Python3的请通过此连接下载安装,并配置相关的环境变量。
Download Python | Python.org

特别声明: 在正式开始编写之前,你应该明白什么资源不能爬取,如果网站有robots.txt(爬虫规则)请遵守它,否则很可能会有牢狱之灾!

正文

估计一开始接触网络爬虫的人都会听说几个爬虫库,如requestsscrapyurllib等等。
一开始我会使用requests库进行演示。

后面会教各位如何从0开始编写属于自己的爬虫库。
使用以下命令安装requests库
# Linux
pip3 install requests
# 报错的话请执行对应的安装命令安装此程序 python3-pip,或pip3
# 如果只用Python3的话请使用pip install requests

# Windows
pip install requests
# 报错请检查是否安装Python与pip,并检查环境变量是否正确配置
在安装完成之后就可以使用了,先新建一个.py文件,然后编写它。
import requests # 导入库(模块)

url = "https://cn.bing.com" # 设置网址的变量,必须是http://或https://开头
res = requests.get(url).text # 将爬取的内容保存到一个变量里面
print(res) # 显示变量的值
然后在终端使用Python执行此代码文件,你便会看到对应的输出值

此处讲解一下刚才的代码都做了什么事情。
在第一行Python导入了名为requests的模块。
第二行将网址也就是域名保存为变量。
第三行Python使用requests模块对你设定的这个域名发起了一个GET请求,并将服务器返回的HTML数据保存在了名为res的变量中。
第四行是将这个变量保存的值输出到屏幕上让你查看。
其中此代码向服务器发送的HTTP请求内容如下

GET / HTTP/1.1\r\n # 使用1.1版本HTTP协议中的GET请求访问网址的根目录
Host: cn.bing.com\r\n # 域名的值
User-Agent: python-requests/2.25.1\r\n # 客户端的设备信息
Accept-Encoding: gzip, deflate\r\n # 编码规则
Accept: */*\r\n # 客户端希望收到的数据类型,此处为不限制类型
Connection: keep-alive\r\n # 保持这个TCP连接
\r\n\r\n # 两个CRLF符结束请求(此处仅限于GET,HEAD请求等无数据请求)

requests模块为程序员提供了所有的HTTP请求方式,GET,POST,HEAD,OPTIONS,PUT,PATCH,DELETE。
也提供了非常便捷的HTTP Headers编写方式,即使用字典类型保存。
总之,requests模块是一个非常强大的库,基于urllib3模块编写。

关于requests模块的使用事项就讲到这里

接下来你该编写属于自己的爬虫库了,此处使用套接字与SSL模块
此处只会讲解最基础的形式
import socket, ssl # 导入这两个模块

host = "cn.bing.com" # 设置域名或IP地址,此处不需要加http://或https://
port = 443 # 设置端口为443,SSL/TLS专用端口,如果未配置HTTPS的服务器,请使用80端口
# 并注意端口变量类型必须为int,也就是整型

# 此处不展开讲解,你只需要理解是将TCP连接的socket赋值给了变量s
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM, 0)
s = ssl.SSLContext().wrap_socket(sock, server_hostname = host)

s.settimeout(3) # 设置超时时间,当然你也可以不设置
s.connect((host, port)) # 连接对应的服务器与端口,此处是一个元组类型变量

# 编写HTTP请求头,此处只演示最基础能用的HTTP头
headers = bytes(
	"GET / HTTP/1.1\r\n" # 头部为GET请求,POST请求需要在下面加上了对应的请求数据
	"Host: " + host + "\r\n"
	"User-Agent: 123456\r\n\r\n" # 此处设备信息可以按你实际需求修改
, encoding="UTF-8")

s.sendall(headers) # 向服务器发送这个HTTP请求
res = s.recv(4096) # 接收服务器返回的数据包

print(res) # 显示返回的内容
s.close() # 关闭套接字

当你执行这个代码之后你会发现和requests模块看到的内容不一样,那是因为在requests模块中,各种信息都是经过筛选和清洗的。
在原始数据中,你看到的内容是HTTP响应头与正文内容合在一起的样子。
HTTP响应头与正文之间使用两个CRLF符进行分隔。
同时你还会注意到res变量的数据很短,这是因为你只接收了服务器发送的4096字节大小的数据,其他数据直接丢弃了。

好的,讲解完毕,有不懂的请发在评论区。

  网络协议 最新文章
使用Easyswoole 搭建简单的Websoket服务
常见的数据通信方式有哪些?
Openssl 1024bit RSA算法---公私钥获取和处
HTTPS协议的密钥交换流程
《小白WEB安全入门》03. 漏洞篇
HttpRunner4.x 安装与使用
2021-07-04
手写RPC学习笔记
K8S高可用版本部署
mySQL计算IP地址范围
上一篇文章      下一篇文章      查看所有文章
加:2022-03-03 16:49:22  更:2022-03-03 16:50:52 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 8:27:52-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码