Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

NaterStrat/learn-python-for-pc

Folders and files

NameName
Last commit message
Last commit date

Latest commit

History

2 Commits

Repository files navigation

🎮 游戏资讯爬虫(可扩展版)

支持从多个游戏媒体网站抓取最新资讯,并提供 两种扩展方式 添加自定义网站。

快速开始

cd game_news_crawler
pip install -r requirements.txt
python crawler.py

使用方法

一、命令行交互模式

运行 python crawler.py 后会显示交互菜单:

============================================================
 🎮 游戏资讯爬虫(可扩展版)
============================================================
可用的资讯来源:
 1. 3DM Game
 2. 游民星空
 3. 游研社
 4. 游戏时光 VGTime
 5. [插件] chuapp
 0. 全部爬取
请选择来源编号(多个用逗号分隔,直接回车爬取全部):
  • 直接回车 — 爬取全部来源
  • 输入 1,2 — 只爬取 3DM Game 和游民星空
  • 输入 0 — 全部爬取

爬取完成后,结果自动保存到 output/ 目录,同时生成:

  • game_news_YYYYMMDD_HHMMSS.json — 结构化 JSON 数据
  • game_news_YYYYMMDD_HHMMSS.md — 可直接阅读的 Markdown 文件

二、在 Python 代码中调用

from crawler import GameNewsCrawler
crawler = GameNewsCrawler(output_dir="output", delay=1.5)
# 爬取全部来源
items = crawler.run()
# 只爬取指定来源
items = crawler.run(sources=["游民星空", "游研社"])
# 保存结果
crawler.save_json(items) # 保存为 JSON
crawler.save_markdown(items) # 保存为 Markdown
# 查看所有可用来源
print(crawler.list_sources())
# 遍历结果
for item in items:
 print(f"[{item.source}] {item.title}")
 print(f" 链接: {item.url}")
 print(f" 摘要: {item.summary}")
 print()

三、输出格式说明

JSON 格式(适合程序处理):

[
 {
 "title": "新闻标题",
 "url": "https://...",
 "source": "来源网站",
 "summary": "摘要内容",
 "author": "作者",
 "publish_time": "2026年04月10日",
 "image_url": "https://...",
 "crawl_time": "2026年04月10日 12:00:00"
 }
]

Markdown 格式(适合直接阅读):按来源分组,每条资讯包含标题(可点击跳转)、时间、作者和摘要。


扩展方式

方式一:零代码 — 编辑 sites.json

打开 sites.json,添加一条新的站点配置即可。只需要填写 网址 + CSS 选择器:

{
 "name": "我的新站点",
 "enabled": true,
 "base_url": "https://example.com",
 "list_url": "https://example.com/news",
 "encoding": null,
 "max_items": 20,
 "selectors": {
 "article_list": ".news-list li",
 "title": "h3 a",
 "link": "a[href]",
 "summary": ".desc",
 "image": "img[src]",
 "time": ".date",
 "author": ".author"
 }
}

字段说明:

字段 说明
name 来源显示名称
enabled true/false,可临时禁用某个站点
base_url 站点根地址,用于拼接相对链接
list_url 新闻列表页 URL
encoding 页面编码,null 表示自动检测
max_items 最多抓取条数
selectors.article_list 新闻列表的 CSS 选择器(选中所有文章条目)
selectors.title 每条文章中标题元素的选择器
selectors.link 链接元素的选择器
selectors.summary 摘要元素的选择器
selectors.image 封面图的选择器
selectors.time 发布时间的选择器
selectors.author 作者的选择器

如何找到正确的选择器?

  1. 用浏览器打开目标网站的新闻列表页
  2. F12 打开开发者工具
  3. 用元素选择器(左上角箭头图标)点击新闻条目
  4. 观察 HTML 结构,找到列表容器和每个条目的 class/tag
  5. 填入对应的 CSS 选择器

方式二:自定义插件 — Python 代码

当网站结构复杂(需要翻页、调 API、处理 JS 渲染等),可以编写插件放到 custom_crawlers/ 目录。

步骤:

  1. custom_crawlers/ 下新建 .py 文件(如 mysite.py)
  2. 定义 crawl(fetcher) 函数
  3. 返回 list[NewsItem]

最小模板:

"""custom_crawlers/mysite.py"""
import sys, os
from urllib.parse import urljoin
sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
from crawler import NewsItem
SOURCE_NAME = "我的站点"
def crawl(fetcher) -> list:
 soup = fetcher.get("https://example.com/news")
 if not soup:
 return []
 items = []
 for tag in soup.select(".news-item")[:20]:
 a = tag.select_one("a[href]")
 if not a:
 continue
 items.append(NewsItem(
 title=a.get_text(strip=True),
 url=urljoin("https://example.com", a["href"]),
 source=SOURCE_NAME,
 ))
 return items

插件中 fetcher 提供的能力:

# 请求页面,返回 BeautifulSoup 对象
soup = fetcher.get(url)
soup = fetcher.get(url, encoding="utf-8") # 指定编码

项目结构

game_news_crawler/
├── crawler.py # 核心引擎
├── sites.json # 站点配置(零代码扩展)
├── custom_crawlers/ # 自定义插件目录
│ ├── __init__.py
│ └── chuapp.py # 示例插件:触乐网
├── requirements.txt
├── output/ # 输出目录
└── README.md

注意事项

  • 请求间隔默认 1.5 秒,请合理设置,勿对目标站点造成压力
  • 网站结构会变化,如果抓取结果为空,需更新选择器
  • 仅供学习交流,请遵守各网站的 robots.txt 和使用条款

About

this is use for learn pythone

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

Contributors

Languages

AltStyle によって変換されたページ (->オリジナル) /