一、爬虫基本原理
实操案例:获取页面
a、使用 socket 下载一个页面
##案例一:爬取整个页面
import socket
# website
url = "www.baidu.com"
# port
port = 80
def blocking():
sock = socket.socket() # 建立对象
sock.connect((url, port)) # 连接网站,发出一个HTTP请求
request_url = 'GET / HTTP/1.0\r\nHost: www.baidu.com\r\n\r\n' # HTTP协议的基本请求格式
sock.send(request_url.encode()) # 使用了Python的socket模块来发送一个编码后的请求URL
response = b'' # 建立一个二进制对象来存储我们得到的数据
chunk = sock.recv(1024) # 每次获得的数据不超过1024个字节
while chunk: # 循环接收数据,因为一次接收不完整
response += chunk
chunk = sock.recv(1024)
header, html = response.split(b'\r\n\r\n', 1)
'''
将完整的HTTP响应分成头部和HTML内容两部分。
HTTP头部和内容之间有一个空行(\r\n\r\n),这行将其作为分隔符。
'''
f = open('index.html', 'wb')
f.write(html)
f.close()
blocking()
b、提取信息
获取网页源代码,进行网页源代码分析,提取我们想要的数据
c、保存数据
提取信息,我们一般将提取到的数据保存到某处,以便后续使用
d、自动化程序
爬虫就是替代我们来完成爬取工作的自动化程序,他可以在抓取过程中进行异常处理、错误重试等操作,确保爬取 持续高效的运行
二、httpx模块
httpx是Python新一代的网络请求库,包含以下特点:
- 基于Python3的功能齐全的http请求模块
- 既能发送同步请求,也能发送异步请求
- 支持HTTP/1.1和HTTP/2
- 能够直接向WSG应用程序或者ASGI应用程序发送请求
获取页面
import httpx
url = 'https://www.baidu.com'
# 固定请求格式
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36"
}
# 发起 GET 请求,处理重定向并设置超时时间
response = httpx.get(url, headers=headers, follow_redirects=True, timeout=10.0)
content = response.content
# 将响应内容写入文件
with open('index.html', 'wb') as f:
f.write(content)