导读
在开始之前,望读者提前了解过计算机网络 的相关知识(尤其是HTTP协议与SSL/TLS加密 )与基础 的代码编写(不限于语言类型)。 以下代码均以Python3 为例(因其代码简易,故使用其进行演示) 未安装Python3的请通过此连接下载安装,并配置相关的环境变量。 Download Python | Python.org
特别声明: 在正式开始编写之前,你应该明白什么资源不能爬取,如果网站有robots.txt(爬虫规则)请遵守它,否则很可能会有牢狱之灾!
正文
估计一开始接触网络爬虫的人都会听说几个爬虫库,如requests ,scrapy ,urllib 等等。 一开始我会使用requests 库进行演示。
后面会教各位如何从0开始编写属于自己的爬虫库。
使用以下命令安装requests库
pip3 install requests
pip install requests
在安装完成之后就可以使用了,先新建一个.py文件,然后编写它。
import requests
url = "https://cn.bing.com"
res = requests.get(url).text
print(res)
然后在终端使用Python执行此代码文件,你便会看到对应的输出值
此处讲解一下刚才的代码都做了什么事情。 在第一行Python导入了名为requests的模块。 第二行将网址也就是域名保存为变量。 第三行Python使用requests模块对你设定的这个域名发起了一个GET请求,并将服务器返回的HTML数据保存在了名为res的变量中。 第四行是将这个变量保存的值输出到屏幕上让你查看。 其中此代码向服务器发送的HTTP请求内容如下
GET / HTTP/1.1\r\n
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
\r\n\r\n
requests模块为程序员提供了所有的HTTP请求方式,GET,POST,HEAD,OPTIONS,PUT,PATCH,DELETE。 也提供了非常便捷的HTTP Headers编写方式,即使用字典类型保存。 总之,requests模块是一个非常强大的库,基于urllib3模块编写。
关于requests模块的使用事项就讲到这里
接下来你该编写属于自己的爬虫库了,此处使用套接字与SSL模块
此处只会讲解最基础的形式
import socket, ssl
host = "cn.bing.com"
port = 443
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))
headers = bytes(
"GET / HTTP/1.1\r\n"
"Host: " + host + "\r\n"
"User-Agent: 123456\r\n\r\n"
, encoding="UTF-8")
s.sendall(headers)
res = s.recv(4096)
print(res)
s.close()
当你执行这个代码之后你会发现和requests模块看到的内容不一样,那是因为在requests模块中,各种信息都是经过筛选和清洗的。 在原始数据中,你看到的内容是HTTP响应头与正文内容合在一起的样子。 HTTP响应头与正文之间使用两个CRLF符进行分隔。 同时你还会注意到res变量的数据很短,这是因为你只接收了服务器发送的4096字节大小的数据,其他数据直接丢弃了。
好的,讲解完毕,有不懂的请发在评论区。
|