STM32开发环境配置记录——关于PlatformIO + VSCode + CubeMX的集成环境配置
前言
为什么配置这样的一个环境呢?鄙人受够了Keil5那个简陋的工作环境了,实在是用不下去,调试上很容易跟CubeMX的代码产生不协调导致调试——发布代码不一致造成的一系列问题。CubeIDE虽说不错,但是它的代码辅助功能和构建系统实在不敢恭维,经常出现Makefile未同步导致符号定义冲突,亦或者是埋下了潜在的程序bug。
也有人尝试使用Keil Assistance + VSCode + Keil分工写代码与烧录,这听起来不错,但是调试并不方便,常常要来回奔波,实在是有些麻烦。这里我们尝试新兴的PlatformIO来辅助我们进行嵌入式的开发。
介绍
PlatformIO
Your Gateway to Embedded Software Development Excellence — PlatformIO latest documentation
Platform是基于VScode文本编辑器,使用了vscode强大的扩展extension功能,使得开发者可以在vscode中直接调用gcc、jlink、gdb等进行开发、调试。PlatformIO只是一个集成开发环境,其本身几乎不包括任何实质性功能,但是其集成了很多了例如编译器、调试器等,主要包括以下:
- vscode
- gcc编译器,版本:arm-none-eabi-gcc (针对arm内核嵌入式设备的专属c语言编译器)
- arm-none-eabi-gdb调试器
- jlink 驱动
- Scons构建工具、
也就是说,PlatformIO就是一个类似于Keil, STMCudeIDE那样的工作环境,它本身不负责进行编译,上传,调试测试等,但是它封装了我们常见的arm-noeabi-系列工具,省去我们学习纷繁复杂的配置语法,统一成PlatformIO的配置语言,这样我们就可以通过写PlatformIO的配置语言来辅助构建我们的嵌入式程序。
STM32CubeMX
STM32CubeMX - STM32Cube initialization code generator - STMicroelectronics
STM32CubeMX 是用于 32 位 ARM Cortex STM32 微控制器的图形工具。它允许对 STM32 微控制器和微处理器进行非常简单的配置,生成初始化 C 代码,还可以通过一步一步的操作为 Arm Cortex-M 内核或 Arm Cortex-A core 生成部分 Linux 设备树。它是 STMCube 生态系统的一部分,且可以作为独立应用程序或作为 Eclipse 插件集成在开发环境(STM32CubeIDE)中。
它能做到的事情很简单了:那就是将我们配置嵌入式设备的流程从代码配置走向GUI配置,点点摁扭,就可以生成一系列初始化的代码辅助我们完成繁琐的初始化任务
Visual Studio Code
Visual Studio Code 是一个轻量级功能强大的源代码编辑器,支持语法高亮、代码自动补全(又称 IntelliSense)、代码重构、查看定义功能,并且内置了命令行工具和 Git 版本控制系统。适用于 Windows、macOS 和 Linux。它内置了对 JavaScript、TypeScript 和 Node.js 的支持,并为其他语言和运行时(如 C++、C#、Java、Python、PHP、Go、.NET)提供了丰富的扩展生态系统。为了不影响读者的沉浸式阅读学习,如需使用目录请在左侧使用即可。
正文
我们下面来以STM32F103ZET6为目标单片机,实现一个简单的点灯任务!来看看我们如何进行工程配置。
使用STM32CubeMX生成PlatformIO可以支持的Makefile文件
我们的初始化代码是由STM32CubeMX生成的,这里我们完成这些配置:
关于如何下载安装STM32CubeMX不是本文的重点,请看官另行百度
点击画圈的地方选择目标嵌入式设备
锁定目标板子(↓)
这里我收藏了常用的板子,所以可以很快找到,没有的看官搜索板子的型号就好
点击目标板子的栏目,就看到我们熟悉的界面了。
1. 选择目标引脚并配置
我们需要选择目标引脚然后完成相关的配置,笔者这里选择了我这块开发板上的PE5引脚来驱动连接上的单片机,引脚的配置需要结合硬件电路进行选择
在这里,本人设置了:上拉输出,高速模式
2. 配置时钟树
我选择了使用外部晶振时钟,配置为72MHz
3. [关键!调试则需要:]选择调试器类型
Serial Wire是笔者选择的,我的手头只有STLink可以使用,如果看官有的是JLink调试器,请根据
做出相关的选择!这一步相当关键!
4. 选择对应的目标IDE配置代码与文件
看官自行设置好项目名称和项目存储的文件夹,两者将会在后面的PIO配置中使用到!请高度关注!
TIPS: 如果看官不想拷贝所有的库文件,可以在Code Generator那一栏中选择相应的配置:
下面我们生成代码
可以看到所有的必要底层库文件都得到了拷贝,下面我们转战VSCode + PIO
使用PlatformIO搭建我们的STM32开发环境
打开VSCode,PlatformIO在Plugin Market里下载。
看官先点击下载之,泡上一杯咖啡吧,下载很慢的!(笔者这里下载过了)安装结束之后,你的左侧工具栏会出现这个
点击一下:
这就是PlatformIO!我们下面可以将我们的STM32生成的代码跟PIO对接。点击新建工程:
里面需要填写的项目我一个个说:
- 工程名称:跟CubeMx你填写的项目名称要完全一致
- 目标板子:跟CubeMx型号一致
- 框架:这个是说的是如何进行读取行为,我们使用的是CubeMX的生成代码,所以目标框架我们采用的是STM32Cube
- 位置Location:先把Default Location给删掉,我们需要选择在刚刚在CubeMx下选择的文件夹,可以看到我们在刚刚笔者选择在了
D:\MDK5 Project\CubeMx Trainingg\demo_
下,所有的代码都继续生成在了D:\MDK5 Project\CubeMx Trainingg\demo_\${ProjectName}\
下方,我们在PIO下的目录就选择到D:\MDK5 Project\CubeMx Trainingg\demo_
这个位置,这是因为他也会生成${ProjectName}\...
文件夹,我们这样做是为了让PIO生成的文件和CubeMx的文件生成在用以项目根目录下,方便我们的书写和文件读取
点击Finish到这里之后,第一次下载的朋友将会下载相关的工具链,笔者当时下载了长达小半个小时,请各位看官稍有耐心,可以出去散散步!之后等到工具链配置结束之后,生成工程就是一刹那的事情。
现在生成结束了!
我们下面来看看platformio.ini文件。
; PlatformIO Project Configuration File
;
; Build options: build flags, source filter
; Upload options: custom upload port, speed and extra flags
; Library options: dependencies, extra library storages
; Advanced options: extra scripting
;
; Please visit documentation for the other options and examples
; https://docs.platformio.org/page/projectconf.html
[env:genericSTM32F103ZE]
platform = ststm32
board = genericSTM32F103ZE
framework = stm32cube
这是PlatformIO为我们默认生成好的模板,但是仅靠这个完全没有办法编译我们的项目,我们需要自行修改。
经过笔者的简单探索,笔者整合出了如下的配置:
使用笔者的配置
; PlatformIO Project Configuration File
;
; Build options: build flags, source filter
; Upload options: custom upload port, speed and extra flags
; Library options: dependencies, extra library storages
; Advanced options: extra scripting
;
; Please visit documentation for the other options and examples
; https://docs.platformio.org/page/projectconf.html
; src_dir就是告知我们的项目的大源文件地址在何处,它隶属于platformio模块的匹配
; https://docs.platformio.org/en/latest/projectconf/sections/platformio/options/directory/src_dir.html
[platformio]
src_dir = ./Core/
;目标板子: STM32F103ZE
[env:genericSTM32F103ZE]
platform = ststm32
board = genericSTM32F103ZE
framework = stm32cube
; -Idir是include文件目录, 这里随了GCC的语法
; build_flag本质上就是给arm-noeabi-gcc加上了编译参数,直接添加的,所以直接随的是GCC的语法
build_flags =
-ICore/Inc
;选择链接文件,我们的STM32上电后要执行一段启动脚本
board_build.ldscript = ./STM32F103ZETx_FLASH.ld
; 下面是上传工具的配置
; PlatformIO默认使用的上传协议就是stlink,默认的调试协议还是stlink, 这是笔者并没有写出的原因
; 如果看官手头有的调试器是JLink的话,则需要显示的指定: [看官自行注释]
; upload_protocol=jlink
; debug_tool=jlink
; 手头只有USB < - > TTL的话, 则是
; upload_protocol=serial
; 值得注意的是: 一些板子是不支持某一些协议的,这跟PlatformIO使用到的开源库有关系,请前往
; https://docs.platformio.org/en/latest/boards/index.html#boards
; 搜索自己使用的板子查看支持的上传,调试协议
还有另一份是广为传播的一种配置:
; PlatformIO Project Configuration File
;
; Build options: build flags, source filter
; Upload options: custom upload port, speed and extra flags
; Library options: dependencies, extra library storages
; Advanced options: extra scripting
;
; Please visit documentation for the other options and examples
; https://docs.platformio.org/page/projectconf.html
; 在配置文件中分号开头为注释
[platformio]
; 将源代码的编译目录移到项目目录下,否则默认src下
src_dir = ./
[env:genericSTM32F103ZE]
platform = ststm32
board = genericSTM32F103ZE
; framework = stm32cube(不用framework了)
; 编译配置-D是宏定义,-Idir是include文件目录,读者可按自己项目结构更改
; 这里笔者锐评一下: 这种方式就是会十分繁琐!必须依次指定所有的包含目录!
; 在已经存在支持的框架下,请优先使用platformIO已经支持的框架!
build_flags =
-D STM32F103xE ; 预定义宏, 看官可以理解为在一切源文件的开头加上了#define STM32F103xE
-ICore/Inc ; 包含了源文件的路径
-IDrivers/CMSIS/Include
-IDrivers/CMSIS/Device/ST/STM32F1xx/Include
-IDrivers/STM32F1xx_HAL_Driver/Inc
-IDrivers/STM32F1xx_HAL_Driver/Inc/Legacy
;选择编译文件的所在路径,这里包含了源文件路径,启动文件,驱动库和rtos路径。如果+<*>便是路径下的所以文件,-<.git/>便是忽略.git路径下的文件
build_src_filter = +<Core/Src> +<startup_stm32f103xe.s> +<Drivers/> +<Middlewares/>
;选择链接文件
board_build.ldscript = ./STM32F103ZETx_FLASH.ld
下面我们直接点灯就好,在Core/Src/main.c下:
// 笔者选择的是上拉模式,亮灯要拉低GPIO电平
HAL_GPIO_WritePin(LED1_GPIO_Port, LED1_Pin, GPIO_PIN_RESET);
HAL_GPIO_WritePin(LED0_GPIO_Port, LED0_Pin, GPIO_PIN_RESET);
我们下面编译运行,您既可以Ctrl + Shift + P输入PlatformIO:Build开始构建,也可以的点击VSCode下方工具栏上的:
从小房子的图标开始,依次是:
- PlatformIO主页面
- 构建
- 上传
- 清理
- 测试(单元测试)
- 串口监视器
- 终端
- 项目
- 上传的端口设置(默认不动就好)
余下的是笔者写其他语言的插件,请不予理会。
笔者下面演示的是构建工程,点击√
号
Processing genericSTM32F103ZE (platform: ststm32; board: genericSTM32F103ZE; framework: stm32cube)
----------------------------------------------------------------------------------------------------------------------------------------------------------------
Verbose mode can be enabled via `-v, --verbose` option
CONFIGURATION: https://docs.platformio.org/page/boards/ststm32/genericSTM32F103ZE.html
PLATFORM: ST STM32 (17.4.0) > STM32F103ZE (64k RAM. 512k Flash)
HARDWARE: STM32F103ZET6 72MHz, 64KB RAM, 512KB Flash
DEBUG: Current (blackmagic) External (blackmagic, cmsis-dap, jlink, stlink)
PACKAGES:
- framework-stm32cubef1 @ 1.8.4
- tool-ldscripts-ststm32 @ 0.2.0
- toolchain-gccarmnoneeabi @ 1.70201.0 (7.2.1)
LDF: Library Dependency Finder -> https://bit.ly/configure-pio-ldf
LDF Modes: Finder ~ chain, Compatibility ~ soft
Found 29 compatible libraries
Scanning dependencies...
No dependencies
Building in release mode
Compiling .pio\build\genericSTM32F103ZE\FrameworkHALDriver\Src\stm32f1xx_hal.o
...
Compiling .pio\build\genericSTM32F103ZE\FrameworkCMSISDevice\gcc\startup_stm32f103xe.o
Compiling .pio\build\genericSTM32F103ZE\FrameworkCMSISDevice\system_stm32f1xx.o
Archiving .pio\build\genericSTM32F103ZE\libFrameworkCMSISDevice.a
Indexing .pio\build\genericSTM32F103ZE\libFrameworkCMSISDevice.a
Linking .pio\build\genericSTM32F103ZE\firmware.elf
Checking size .pio\build\genericSTM32F103ZE\firmware.elf
Advanced Memory Usage is available via "PlatformIO Home > Project Inspect"
RAM: [ ] 0.1% (used 44 bytes from 65536 bytes)
Flash: [ ] 0.5% (used 2724 bytes from 524288 bytes)
Building .pio\build\genericSTM32F103ZE\firmware.bin
================================================================= [SUCCESS] Took 4.93 seconds =================================================================
出现[SUCCESS]
字样,说明我们的项目构建顺利,否则,请依次查看自己的项目配置问题。常见的是重定义,请保证自己不要重复包含源文件导致符号重定义!
下面我们点击->
上传项目到板子上!
请在上传之前,确保您已经连接好调试器(我的是STLink),同时板子已经上好电了!
Processing genericSTM32F103ZE (platform: ststm32; board: genericSTM32F103ZE; framework: stm32cube)
----------------------------------------------------------------------------------------------------------------------------------------------------------------
Verbose mode can be enabled via `-v, --verbose` option
CONFIGURATION: https://docs.platformio.org/page/boards/ststm32/genericSTM32F103ZE.html
PLATFORM: ST STM32 (17.4.0) > STM32F103ZE (64k RAM. 512k Flash)
HARDWARE: STM32F103ZET6 72MHz, 64KB RAM, 512KB Flash
DEBUG: Current (blackmagic) External (blackmagic, cmsis-dap, jlink, stlink)
PACKAGES:
- framework-stm32cubef1 @ 1.8.4
- tool-dfuutil @ 1.11.0
- tool-dfuutil-arduino @ 1.11.0
- tool-ldscripts-ststm32 @ 0.2.0
- tool-openocd @ 3.1200.0 (12.0)
- tool-stm32duino @ 1.0.2
- toolchain-gccarmnoneeabi @ 1.70201.0 (7.2.1)
LDF: Library Dependency Finder -> https://bit.ly/configure-pio-ldf
LDF Modes: Finder ~ chain, Compatibility ~ soft
Found 29 compatible libraries
Scanning dependencies...
No dependencies
Building in release mode
Checking size .pio\build\genericSTM32F103ZE\firmware.elf
Advanced Memory Usage is available via "PlatformIO Home > Project Inspect"
RAM: [ ] 0.1% (used 44 bytes from 65536 bytes)
Flash: [ ] 0.5% (used 2724 bytes from 524288 bytes)
Configuring upload protocol...
AVAILABLE: blackmagic, cmsis-dap, dfu, jlink, serial, stlink
CURRENT: upload_protocol = stlink
Uploading .pio\build\genericSTM32F103ZE\firmware.elf
xPack Open On-Chip Debugger 0.12.0-01004-g9ea7f3d64-dirty (2023-01-30-15:04)
Licensed under GNU GPL v2
For bug reports, read
http://openocd.org/doc/doxygen/bugs.html
debug_level: 1
hla_swd
[stm32f1x.cpu] halted due to debug-request, current mode: Thread
xPSR: 0x01000000 pc: 0x08000bf8 msp: 0x20010000
** Programming Started **
Warn : Adding extra erase range, 0x08000c90 .. 0x08000fff
** Programming Finished **
** Verify Started **
** Verified OK **
** Resetting Target **
shutdown command invoked
================================================================= [SUCCESS] Took 2.75 seconds =================================================================
如愿,小灯亮起,到这里,我们的教程结束!
一些在上传中可能出现的问题
- 板子没上电↓
- STLink没插好!或者STLink异常,导致OpenOCD无法初始化,请检查端口
- 使用USB转TTL接口上传程序出现的问题
感谢SourceForge大佬的解答,我随后马上意识到自己犯了一件很蠢的事情,我忘记改板子为bootloader烧录模式了,导致板子根本不接受usb烧录。
stm32flash / Tickets / #134 STM32L462 "Failed to init device" problem (sourceforge.net)
请各位看官参考自己的手册关于BOOT引脚的配置!
所以,我需要改BOOT0引脚接到3.3V上去,上载好程序后,恢复BOOT引脚全部接地运行程序,果然:
Processing genericSTM32F103ZE (platform: ststm32; board: genericSTM32F103ZE; framework: stm32cube)
----------------------------------------------------------------------------------------------------------------------------------------------------------------
Verbose mode can be enabled via `-v, --verbose` option
CONFIGURATION: https://docs.platformio.org/page/boards/ststm32/genericSTM32F103ZE.html
PLATFORM: ST STM32 (17.4.0) > STM32F103ZE (64k RAM. 512k Flash)
HARDWARE: STM32F103ZET6 72MHz, 64KB RAM, 512KB Flash
DEBUG: Current (blackmagic) External (blackmagic, cmsis-dap, jlink, stlink)
PACKAGES:
- framework-stm32cubef1 @ 1.8.4
- tool-dfuutil @ 1.11.0
- tool-dfuutil-arduino @ 1.11.0
- tool-ldscripts-ststm32 @ 0.2.0
- tool-openocd @ 3.1200.0 (12.0)
- tool-stm32duino @ 1.0.2
- toolchain-gccarmnoneeabi @ 1.70201.0 (7.2.1)
LDF: Library Dependency Finder -> https://bit.ly/configure-pio-ldf
LDF Modes: Finder ~ chain, Compatibility ~ soft
Found 29 compatible libraries
Scanning dependencies...
No dependencies
Building in release mode
Checking size .pio\build\genericSTM32F103ZE\firmware.elf
Advanced Memory Usage is available via "PlatformIO Home > Project Inspect"
RAM: [ ] 0.1% (used 44 bytes from 65536 bytes)
Flash: [ ] 0.5% (used 2716 bytes from 524288 bytes)
Configuring upload protocol...
AVAILABLE: blackmagic, cmsis-dap, dfu, jlink, serial, stlink
CURRENT: upload_protocol = serial
Looking for upload port...
Auto-detected: COM8
Uploading .pio\build\genericSTM32F103ZE\firmware.bin
stm32flash 0.4
http://stm32flash.googlecode.com/
Using Parser : Raw BINARY
Interface serial_w32: 115200 8E1
Version : 0x22
Option 1 : 0x00
Option 2 : 0x00
Device ID : 0x0414 (High-density)
- RAM : 64KiB (512b reserved by bootloader)
- Flash : 512KiB (sector size: 2x2048)
- Option RAM : 16b
- System RAM : 2KiB
Write to memory
Erasing memory
Wrote address 0x08000100 (7.98%)
Wrote address 0x08000200 (15.96%)
...
Wrote address 0x08000b00 (87.78%)
Wrote address 0x08000c00 (95.76%)
Wrote address 0x08000c88 (100.00%) Done.
Starting execution at address 0x08000000... done.
调试
这里请只有串口烧录的朋友止步了。
调试极其容易,我们只需要按照经典的点击:
确保自己的板子和调试器都上好电之后,就可以愉快调试了!
STM32开发环境配置记录——关于PlatformIO + VSCode + CubeMX的集成环境配置的更多相关文章
- Jekens 配置多项目SCM GitLab+Jenkins持续集成环境
参考: 搭建GitLab+Jenkins持续集成环境图文教程 https://blog.csdn.net/ruangong1203/article/details/73065410 Jenkins中配 ...
- MySQL高可用架构-MMM环境部署记录
MMM介绍MMM(Master-Master replication manager for MySQL)是一套支持双主故障切换和双主日常管理的脚本程序.MMM使用Perl语言开发,主要用来监控和管理 ...
- stm32开发笔记(二):stm32系列使用V3.5固件库的帮助文件以及GPIO基本功能(一)
前言 stm32系列是最常用的单片机之一,不同的版本对应除了引脚.外设.频率.容量等'不同之外,其开发的方法是一样的. 本章讲解使用库函数使用GPIO引脚功能. 补充 本文章为多年前学习 ...
- [Jenkins]持续集成环境下fingbug插件的安装使用与配置
参考:https://wiki.jenkins.io/display/JENKINS/FindBugs+Plugin 突然,天降杂事.我是想安安静静的做个美丽的测试...但是事与愿违,项目经理叫我帮忙 ...
- php集成环境和自己配置的区别,php集成环境、php绿色集成环境、php独立安装版环境这三者的区别
最近有学生问我,直接使用PHP集成环境和我们自己独立安装的php环境有什么不一样吗? 答:PHP集成环境,和自己安装的php环境实际上没啥区别的,只不过大部分的集成环境进行了一些绿化操作,本质上没啥区 ...
- MAC MAMP集成环境安装 PHP 扩展
MAC MAMP集成环境安装 PHP扩展 开发环境中,对于需要维护很多 WEB 站点,以及可能会使用到很多不同的 PHP 版本,集成环境比较好用,在MAC 上 MAMP 集成环境是比较好用的,但是在安 ...
- Mac下搭建基于PlatformIO的嵌入式开发环境(STM32开发)
PlatformIO简介 PlatformIO是开源的物联网开发生态系统.提供跨平台的代码构建器.集成开发环境(IDE),兼容 Arduino,ESP8266和mbed等 支持在Windows.Lin ...
- 【转】android 最新 NDK r8 在window下开发环境搭建 安装配置与使用 详细图文讲解,完整实际配置过程记录(原创)
原文网址:http://www.cnblogs.com/zdz8207/archive/2012/11/27/android-ndk-install.html android 最新 NDK r8 在w ...
- android 最新 NDK r8 在window下开发环境搭建 安装配置与使用 详细图文讲解,完整实际配置过程记录(原创)
android 最新 NDK r8 在window下开发环境搭建 安装配置与使用 详细图文讲解,完整实际配置过程记录(原创) 一直想搞NDK开发却一直给其他事情耽搁了,参考了些网上的资料今天终于把 ...
- VS Code 搭建stm32开发环境
MCU免费开发环境 一般芯片厂家会提供各种开发IDE方案,通常其中就包括其自家的集成IDE,如: 意法半导体 STM32CubeIDE NXP Codewarrior TI CCS 另外也可以用ecl ...
随机推荐
- nginx学习记录【一】在windows上的安装nginx的教程
1.下载地址 http://nginx.org/en/download.html 2.选择windows版本 如下图: 3.解压并运行 解压到指定目录,如下图 打开cmd,然后cd到那个目录,如下图: ...
- 如何在Windows上一键部署PaddleOCR的WebAPI服务
PaddleOCR旨在打造一套丰富.领先.且实用的OCR工具库,助力开发者训练出更好的模型,并应用落地. 官方开源项目地址:PaddlePaddle/PaddleOCR: Awesome multi ...
- 夜莺项目发布 v6.1.0 版本,增强可观测性数据串联
大家好,夜莺项目发布 v6.1.0 版本,这是一个中版本迭代,不止是 bugfix 了,而是引入了既有功能的增强.具体增强了什么功能,下面一一介绍. 1. 增强可观测性数据串联 从 v6.1.0 开始 ...
- Flarum 安装和使用教程
随着开源社区的日益繁荣,人们对社区品质的要求也越来越高.传统的 BBS 论坛模式已经难以满足现代用户对美观.便捷.互动性的需求.搭建一个现代化的高品质社区,成为许多网站管理者的迫切需求和共同挑战. 今 ...
- ps top命令查看内存空间
[root@VM-4-3-centos local]# ps aux --sort -rss | head USER PID %CPU %MEM VSZ RSS TTY STAT START TIME ...
- Android查看apk安装包的AndroidManifest.xml文件
Tips:当你看到这个提示的时候,说明当前的文章是由原emlog博客系统搬迁至此的,文章发布时间已过于久远,编排和内容不一定完整,还请谅解` Android查看apk安装包的AndroidManife ...
- UniTask入门指南:简化Unity中的异步编程
UniTask入门指南:简化Unity中的异步编程 介绍: UniTask是一个轻量级.高性能的异步编程库,专门针对Unity开发进行了优化.与Unity标准的Task系统相比,UniTask提供了更 ...
- Operational Property Graphs到底是个啥?
Operational Property Graphs,中文通常译为"操作属性图". 作为23ai中被官方highlight出的新特性之一,我们先看下官方的原文描述: Operat ...
- SpringBoot快速插入Mysql 1000万条数据
导读 有时候为了验证系统瓶颈,需要往数据库表中插入大量数据,可以写sheel脚本插入,前几天为了插入100万条数据,走的sheel脚本(点我直达),插入速度简直无法直视,花了3小时,才插入了10万条, ...
- 《探索Python Requests中的代理应用与实践》
requests加代理 高匿API代理 此处使用的小象代理:1元100个,便宜,可以购买尝试加下代理 存活期1到2分钟 import time import requests from lxml im ...