Python 网络数据采集工具源码及开源项目推荐
一个基于 Selenium 的 Python 网络数据采集脚本,涵盖配置、核心爬取逻辑及文件清理功能。同时整理了 Locust、Jumpserver、PaddlePaddle 等 57 个常用 Python 相关开源项目与工具,为开发者提供技术选型参考。文章详细解析了代码实现细节,包括浏览器自动化控制、文件下载验证及异常处理机制,并强调了网络爬虫的法律合规性与最佳实践。

一个基于 Selenium 的 Python 网络数据采集脚本,涵盖配置、核心爬取逻辑及文件清理功能。同时整理了 Locust、Jumpserver、PaddlePaddle 等 57 个常用 Python 相关开源项目与工具,为开发者提供技术选型参考。文章详细解析了代码实现细节,包括浏览器自动化控制、文件下载验证及异常处理机制,并强调了网络爬虫的法律合规性与最佳实践。

在网络数据获取与分析领域,Python 凭借其丰富的库支持和简洁的语法,成为首选语言。本文分享了一套基于 Selenium 实现的 Python 网络数据采集脚本源码,详细解析了配置、核心爬取逻辑及文件管理功能。同时,整理了一份包含 Locust、Jumpserver、PaddlePaddle 等在内的 57 个常用 Python 相关开源项目与工具清单,旨在为开发者提供技术选型参考和实战素材。
注意:在进行网络数据采集时,请务必遵守目标网站的 robots.txt 协议及相关法律法规,合理设置请求频率,避免对服务器造成压力或侵犯版权。
运行本采集脚本需要以下基础环境:
selenium:用于浏览器自动化控制。webdriver-manager:可选,用于自动管理 ChromeDriver。requests:用于辅助 HTTP 请求(视具体需求而定)。BaseFrame、SeleniumTools、SpriderAccess 等类,这些通常属于项目内部的封装框架,实际使用时需替换为标准的日志记录、工具函数及数据库操作模块。脚本初始化阶段定义了采集目标、存储路径及并发参数。合理的配置能有效提升采集效率并防止资源浪费。
import os
import shutil
import time
from selenium import webdriver
from selenium.webdriver.common.by import By
# 采集的基础网址,可根据实际需求修改
base_url = "https://down.chinaz.com"
# 本地保存路径,建议使用绝对路径或环境变量
save_path = r"D:\Freedom\Sprider\ChinaZ\"
# 计划采集的资源数量
sprider_count = 88
# 起始序号,支持断点续传
sprider_start_count = 0
# 每页最大显示数量
max_pager = 15
# 当前已采集数量计数器
haved_sprider_count = 0
# 当前页码
page_count = 1
sprider 方法是主入口,负责根据分类名称构建 URL,初始化浏览器,并遍历分页列表。代码采用了无头模式(Headless)以减少资源占用。
def sprider(self, title_name="NET"):
"""
采集主流程
:param title_name: 分类名称 (PHP, NET, ASP, Python, Go 等)
:return: None
"""
# 根据分类名设置文件夹名称及二级目录 ID
if title_name == "PHP":
self.folder_name = "PHP 源码"
self.second_column_name = "572_5"
elif title_name == "Go":
self.folder_name = "Go 源码"
self.second_column_name = "606_572"
elif title_name == "NET":
self.folder_name = "NET 源码"
self.second_column_name = "572_4"
elif title_name == "ASP":
self.folder_name = "ASP 源码"
self.second_column_name = "572_3"
elif title_name == "Python":
self.folder_name = "Python 源码"
self.second_column_name = "604_572"
else:
raise ValueError("Unsupported category")
# 构建目录结构
first_column_name = title_name
second_folder_name = str(self.sprider_count) + "个" + self.folder_name
self.file_path = self.save_path + os.sep + "Code" + os.sep + first_column_name + os.sep + second_folder_name
self.save_path = self.save_path + os.sep + "Code" + os.sep + first_column_name + os.sep + second_folder_name + os.sep + self.folder_name
# 清理临时下载目录
down_path = self.save_path + "Temp\\"
if os.path.exists(down_path):
shutil.rmtree(down_path)
os.makedirs(down_path)
# 清理目标存储目录
if os.path.exists(self.save_path):
shutil.rmtree(self.save_path)
os.makedirs(self.save_path)
# 配置 Chrome 选项
chrome_options = webdriver.ChromeOptions()
diy_prefs = {
'profile.default_content_settings.popups': 0,
'download.default_directory': down_path
}
chrome_options.add_experimental_option('prefs', diy_prefs)
chrome_options.add_argument('--headless') # 隐藏浏览器界面
chrome_options.add_argument('--disable-gpu')
# 实例化浏览器
driver = webdriver.Chrome(options=chrome_options)
driver.set_window_size(1280, 800)
# 访问首页
sprider_url = base_url + "/class/{0}_1.htm".format(self.second_column_name)
driver.get(sprider_url)
# 获取分页信息
div_elem = driver.find_element(By.CLASS_NAME, "main")
element_list = div_elem.find_elements(By.CLASS_NAME, 'item')
laster_pager_ul = driver.find_element(By.CLASS_NAME, "el-pager")
laster_pager_li = laster_pager_ul.find_elements(By.CLASS_NAME, 'number')
page_end_number = int(laster_pager_li[len(laster_pager_li) - 1].text)
# 翻页循环
while self.page_count <= int(page_end_number):
try:
if self.haved_sprider_count >= self.sprider_count:
print("采集到达数量,停止...")
break
# 处理第一页或其他页
if self.page_count > 1:
next_url = base_url + "/class/{0}_{1}.htm".format(self.second_column_name, self.page_count)
driver.get(next_url)
div_elem = driver.find_element(By.CLASS_NAME, "main")
element_list = div_elem.find_elements(By.CLASS_NAME, 'item')
self.sprider_detail(driver, element_list, self.page_count, page_end_number, down_path)
self.page_count += 1
except Exception as e:
print(f"页面爬取错误:{e}")
time.sleep(10)
continue
finally:
pass
sprider_detail 方法负责解析列表项,进入详情页点击下载按钮,并验证文件完整性。此部分涉及复杂的元素定位与文件重命名逻辑。
def sprider_detail(self, driver, element_list, page_count, max_page, down_path):
"""
采集明细页面
:param driver: WebDriver 实例
:param element_list: 列表元素集合
:param page_count: 当前页码
:param max_page: 总页数
:param down_path: 临时下载路径
:return: None
"""
index = 0
element_array = []
element_length = len(element_list)
# 提取链接与标题
for element in element_list:
try:
url_A_obj = element.find_element(By.CLASS_NAME, 'name-text')
next_url = url_A_obj.get_attribute("href")
coder_title = url_A_obj.get_attribute("title")
element_array.append({"url": next_url, "title": coder_title})
except:
continue
# 计算起始索引
self.sprider_start_index = int(self.sprider_start_count) % int(self.max_pager)
index = self.sprider_start_index
while index < element_length:
if self.haved_sprider_count >= self.sprider_count:
break
item = element_array[index]
time.sleep(1) # 礼貌性延迟
index += 1
next_url = item["url"]
coder_title = item["title"]
try:
driver.get(next_url)
# 检查是否存在下载按钮
if not driver.find_elements(By.CLASS_NAME, "download-item"):
driver.back()
continue
# 点击下载
driver.find_element(By.CLASS_NAME, "download-item").click()
# 等待文件下载完成并判断
result = False
for _ in range(240): # 最多等待 240 秒
files = os.listdir(down_path)
if files and any(files[0].endswith(ext) for ext in [".zip", ".rar", ".gz", ".tgz"]):
result = True
break
time.sleep(1)
if result:
srcFile = os.path.join(down_path, files[0])
file_ext = os.path.splitext(srcFile)[-1]
dstFile = os.path.join(down_path, f"{coder_title}{file_ext}")
os.rename(srcFile, dstFile)
# 移动至最终目录
final_dst = os.path.join(self.save_path, f"{coder_title}{file_ext}")
shutil.move(dstFile, final_dst)
self.haved_sprider_count += 1
print(f"成功采集第 {self.haved_sprider_count} 个")
else:
print("下载超时或失败")
driver.back()
except Exception as e:
print(f"详情处理错误:{e}")
在批量下载过程中,可能会产生冗余文件或临时链接文件。以下脚本用于递归查找并删除指定目录下的垃圾文件(如快捷方式、说明文档等)。
import os
def search_file(dirPath, fileName):
"""
递归查找并删除指定文件名
:param dirPath: 根目录
:param fileName: 目标文件名
"""
dirs = os.listdir(dirPath)
for currentFile in dirs:
absPath = os.path.join(dirPath, currentFile)
if os.path.isdir(absPath):
search_file(absPath, fileName)
elif currentFile == fileName:
print(f"删除:{absPath}")
os.remove(absPath)
if __name__ == "__main__":
# 请根据实际情况修改路径
dirPath = r'D:\Freedom\Sprider\ChinaZ\Code\Python\57 个 Python 源码\Python 源码'
garbage_files = [
'服务器软件.url',
'Readme-说明.htm',
'jb51.net.txt',
'说明.htm',
'源码之家说明.txt',
'服务器常用软件.html'
]
for f in garbage_files:
search_file(dirPath, f)
除了采集脚本外,以下整理了 57 个常用的 Python 及相关技术栈开源项目,涵盖运维、安全、AI、可视化等领域,供技术选型参考。
本文提供的代码片段与工具清单仅作为技术参考。在实际生产环境中,请根据具体业务需求进行二次开发与优化。特别是涉及数据采集的部分,务必关注法律合规性与数据安全。希望这些资源能帮助开发者提高生产效率,快速构建高质量的应用系统。
注:文中提及的软件版本号均为原文收录版本,使用前请前往官方渠道确认最新稳定性。

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online
生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online
基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online
解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online