# python-spider **Repository Path**: wuyikui555/python-spider ## Basic Information - **Project Name**: python-spider - **Description**: 爬虫代码,相关文件说明,请关注CSDN博客:wuyk555 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: main - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-10-21 - **Last Updated**: 2026-10-21 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # Python 网络爬虫入门到实战 · 配套工程 这是同名付费专栏的配套代码:**20 个案例 + 一个本地离线靶场**,全部离线可跑、一键验证。 不需要准备任何真实网站——`demosite/` 会用标准库在你本机起一个假网站(48 本书、5 页分页、登录、表单、JS 渲染、限流、robots.txt 全都有)。 ## 快速开始 ```bash # 1. 安装依赖(建议 Python 3.10+) pip install -r requirements.txt # 2. 一键验证:跑完 20 个案例,退出码 0 即环境正确 python run_all.py # 3. 只跑某一个案例 python run_all.py s05 # 或直接:python spiders/s05_bs4_basics.py # 4. 单独起靶场(想用浏览器逛逛这个假网站时) python run_site.py # 会打印 http://127.0.0.1:端口 ``` > 用 PyCharm 打开本目录后,把 `python-spider` 设为 Sources Root(右键目录 → Mark Directory as)。 ## 目录结构 ``` python-spider/ ├── demosite/ 本地离线靶场(假网站,纯标准库实现) │ ├── fake_data.py 48 本书的假数据(书名/作者/分类/价格/评分/库存) │ ├── pages.py 各路由的 HTML/JSON 渲染 │ └── server.py ThreadingHTTPServer + 全部路由 ├── utils/ 公共模块 │ ├── http.py HttpClient:UA 池/超时/重试/限速/流式下载/统计 │ ├── parse.py BS4/XPath/JSON 解析函数 │ ├── store.py SqliteStore + CSV/Excel/JSON 落盘 │ ├── log.py 双通道日志(控制台按级别、文件全量) │ ├── browser.py Selenium Edge 无头封装 │ └── paths.py 路径与输出目录约定 ├── spiders/ 20 个案例(s01 ~ s20,与讲义一一对应) ├── data/ 运行产物(CSV/Excel/图片/数据库/状态文件) ├── run_all.py 一键批量验证 ├── run_site.py 单独起靶场 └── requirements.txt ``` ## 20 个案例 | 案例 | 主题 | 对应讲义 | | --- | --- | --- | | s01_first_request | 第一个请求 + 合规底线 | 第 01 讲 | | s02_demosite_tour | 靶场巡览与站点侦察 | 第 02 讲 | | s03_http_basics | HTTP 响应解剖 | 第 03 讲 | | s04_requests_drill | requests 六件事 | 第 04 讲 | | s05_bs4_basics | BeautifulSoup 与 CSS 选择器 | 第 05 讲 | | s06_xpath_basics | XPath 与 lxml | 第 06 讲 | | s07_json_regex | JSON 接口与正则 | 第 07 讲 | | s08_list_detail | 列表页 + 详情页完整爬虫(免费试读) | 第 08 讲 | | s09_save_formats | CSV / Excel / JSON 落盘 | 第 09 讲 | | s10_sqlite_store | SQLite 持久化与去重 | 第 10 讲 | | s11_engineering | 工程化四件套 | 第 11 讲 | | s12_async_scrape | asyncio 异步并发 | 第 12 讲 | | s13_login_session | 登录与会话 Cookie | 第 13 讲 | | s14_form_submit | 表单提交与 CSRF | 第 14 讲 | | s15_selenium | Selenium 动态渲染 | 第 15 讲 | | s16_thread_pool | 线程池与竞态问题 | 第 16 讲 | | s17_image_download | 图片批量下载 | 第 17 讲 | | s18_pandas_report | pandas 分析出报表 | 第 18 讲 | | s19_anti_scraping | 反爬识别与应对 | 第 19 讲 | | s20_capstone | 综合实战(可配置/可增量/可恢复/可交付) | 第 20 讲 | ## 靶场路由速查 | 路由 | 说明 | | --- | --- | | `/` | 图书列表(分页,每页 10 本,共 5 页) | | `/book/{id}` | 详情页(含试读段落、库存) | | `/search?q=` | 搜索(中文参数编码练习) | | `/api/books?page=&size=` | JSON 接口(含 `total_pages`) | | `/login` + `/profile` | POST 登录 + 会员页(Cookie 会话) | | `/submit` | 表单投递(带 CSRF token) | | `/dynamic` | JS 渲染页(requests 抓不到,Selenium 用) | | `/images/{name}` | PNG 图片下载 | | `/robots.txt` `/strict` | 合规与 UA/Referer 校验 | | `/api/limit` | 限流演示(10 秒内最多 3 次) | | `/api/slow?ms=` | 可配置延迟(并发对比用) | ## 常见问题 - **pandas/numpy 报 OpenBLAS 相关崩溃**:某些环境下多线程 BLAS 分配内存失败,工程已在 `utils/paths.py` 顶部强制 `OPENBLAS_NUM_THREADS=1`,请确保案例经由工程入口运行。 - **Selenium 起不来 / 每个命令都报 `unhandled request`**:案例使用本机 Edge(`msedgedriver` 由 Selenium Manager 自动下载)。首次运行需联网下载驱动,之后离线可跑;也可改用 Chrome,改 `utils/browser.py` 即可。 ⚠️ 若报错是 `WebDriverException: Message: unhandled request`(浏览器能启动但所有 driver 命令都失败),**先查 `env | grep -i proxy`**:本机只要设了 `HTTP_PROXY`,Selenium 会把发往 `127.0.0.1:` 的请求也送进代理,代理不认识 WebDriver 端点就回这句。工程已在 `utils/browser.py` 的 `bypass_env_proxy()` 里建会话时自动摘掉代理变量,无需手动处理。 - **lxml 未安装**:`pip install lxml`。不装的话 BS4 会退回 `html.parser`,解析容错差、速度慢。 - **端口被占/防火墙**:靶场每次随机取空闲端口,案例内部自动传递 `base_url`,无需配置。 - **中文乱码**:Windows 控制台建议先 `chcp 65001`;工程已对子进程强制 `PYTHONIOENCODING=utf-8`。 ## 合规提醒 本工程的所有请求都打向 `127.0.0.1` 的本地靶场。把 `base_url` 换成真实站点之前,请先读第 01 讲和第 19 讲:看 robots.txt、控制频率、不碰个人信息与版权内容。