ESP32做爬虫服务器
在网上也看到有人说用ESP32来作为一个爬虫的服务器,我就去试了一下。那因为我也不是专门搞单片机的,也不知道是我的板子的问题,还是我设置的问题,反正我得出的结论就是:用这个ESP32来做这个爬虫服务器的话实用性不高,原因有两点:
-
因为这个单片机计算资源有限,无法爬取 HTTPS 的页面
-
电路板发热严重
-
当然,以上两个问题有可能是我用的板子的问题,毕竟市面上那么多 ESP32 的板子,我拿一块板子做的测试不能概括全部。
但用来玩一下还是可以的,下面就教大家怎么用 ESP32 搭建爬虫服务器。
安装工具
通常单片机的程序都是用C语言开发的,但是做一些小爬虫使用C语言的话就太麻烦了。还好在 ESP32 等单片机中也可以使用 Python(严格来说是 Python 的衍生语言),叫做 MicroPython。
先在电脑上安装烧录固件及上传 Python 脚本文件的 Python 工具,使用以下命令安装 esptool 及 ampy 两个基于 Python 的工具。
pip install esptool # 用来刷固件pip install adafruit-ampy # 用来烧录文件到 ESP8266
在 macOS 安装好之后的目录:/Library/Frameworks/Python.framework/Versions/(你实际的Python版本号)/bin,在顺利在终端上运行 esptool 及 ampy 命令,就需要把以上目录加入到环境变量,或者直接通过 cd 命令切换到以上路径。
烧录固件
下载固件
电脑端的环境已经准备好了,接下来就要准备 ESP32 的环境。其实我们现在用的 PCB 板是 ESP8266,因为 ESP8266 有 Wifi 模块,可以很方便地联网。要让 ESP32 运行 Python,就需要在里面安装 Python 解释器,就像在你电脑上安装 Python 一样,只不过单片机的 CPU 等不一样,需要特殊的 Python 版本:MicroPython。
可以通过MicroPython官方进行下载,我下载的是 ESP8266_GENERIC-20250415-v1.25.0.bin 文件。
刷固件
用USB线将ESP8266开发板连接到电脑,检查串口号(Windows:在设备管理器中查看;Linux/Mac:终端运行ls /dev/tty*),终端输出类似 /dev/tty.usbserial-xxxx 的串口号。
ls /dev/tty*# /dev/tty.usbserial-1400
擦除 Flash
为了避免造成环境干扰,要先把 ESP8266 的 Flash 擦除干净。在单片机正常连接电脑的情况下在电脑终端执行以下命令:
./esptool --port 你的板子所有在的串口 erase_flash
类似:
./esptool --port /dev/tty.usbserial-xxxx erase_flash
写固件
这里的固件相当于是一个 Python 的解释器,在电脑终端上执行以下命令就可以把固件写到 ESP8266 里面,注意你实际的串口号跟固件文件的路径。
./esptool --port 你的板子所有在的串口 --baud 460800 write_flash --flash-size=detect 0x0 你的固件文件目录/ESP8266_GENERIC-20250415-v1.25.0.bin
验证
写完固件之后,按一下板子上的 RST 键或者重新插拨USB线重启一下 ESP8266,然后在电脑终端上执行以下命令验证一下固件是否写入成功。如果固件写入成功的话执行以下命令后会显示 boot.py 这个文件名,这是 MicroPython 的启动文件。
./ampy --port 你的板子所有在的串口 ls# boot.py
以上所有步骤都成功的话,那么恭喜你,你已经完成了 ESP8266 运行 Python 代码的必要条件,接下来只需要上传 Python 代码文件到 ESP8266 里面即可。
上传脚本
可以通过 ampy 命令把 Python 代码文件上传到 ESP8266 里面,要注意的是,如果需要在板子通电就执行代码,代码文件名必须是 main.py
也可以在电脑安装一个叫做 Thonny 的工具软件,这个软件可以直接选择 ESP8266 的 MicroPython 解释器,避免了调试代码时频繁执行 ampy 命令进行上传的麻烦。
./ampy --port 你的板子所有在的串口 put main.py
在 ESP8266 上运行 Python 爬虫
可以先测试一下 ESP8266 的运行环境,把以下代码保存为 main.py 文件,并上传到 ESP8266 里面,然后按一下板子上的 RST 键,这时候板子上的 LED 应该变为闪烁的状态。
import machineimport time# NodeMCU内置LED通常在GPIO2led = machine.Pin(2, machine.Pin.OUT)while True:led.on() # 点亮LEDtime.sleep(1)led.off() # 熄灭LEDtime.sleep(1)
然后就可以使用同样的方法,把下面爬虫的代码保存为 main.py 文件并上传到 ESP8266 运行。
import networkimport urequestsimport ureimport timeimport ossta_if = network.WLAN(network.STA_IF)sta_if.active(True)sta_if.connect("Your WIFI SSID", "Your WIFI Password")while not sta_if.isconnected():time.sleep(1)print("Wi-Fi已连接,IP地址:", sta_if.ifconfig())# HTTP GET请求response = urequests.get("http://example.com")html = response.textprint(html)response.close()