Thanks to visit codestin.com
Credit goes to Github.com

Skip to content
/ fundus Public
forked from flairNLP/fundus

A very simple news crawler with a funny name

License

Notifications You must be signed in to change notification settings

zxxxv/fundus

Β 
Β 

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

Logo

A very simple news crawler in Python. Developed at Humboldt University of Berlin.

PyPi version python Static Badge Publisher Coverage


πŸ”₯Goal

FundusλŠ”

  • A static news crawler. 단 λͺ‡ μ€„μ˜ Python μ½”λ“œλ§ŒμœΌλ‘œ 온라인 λ‰΄μŠ€ 기사λ₯Ό μ†μ‰½κ²Œ 크둀링할 수 μžˆμŠ΅λ‹ˆλ‹€.

  • μ €μ˜ λͺ©ν‘œλŠ” Fundus에 πŸ‡°πŸ‡· 퍼블리셔λ₯Ό μΆ”κ°€ν•˜μ—¬, λŒ€ν‘œ 언둠사 쀑 ν•˜λ‚˜μΈ λ§€μΌκ²½μ œμ‹ λ¬Έμ‚¬μ˜ 기사 λ‚΄μš©μ„ μžλ™μœΌλ‘œ μŠ€ν¬λž©ν•΄μ˜€λŠ” κΈ°λŠ₯을 κ΅¬ν˜„ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€. 이λ₯Ό 톡해 ν•œκ΅­μ–΄ λ‰΄μŠ€ 데이터 μˆ˜μ§‘ λ²”μœ„λ₯Ό ν™•μž₯ν•˜κ³ , μ‚¬μš©μžκ°€ λ§€μΌκ²½μ œμ‹ λ¬Έμ‚¬μ˜ μ΅œμ‹  기사에 λΉ λ₯΄κ²Œ μ ‘κ·Όν•  수 μžˆλ„λ‘ μ§€μ›ν•©λ‹ˆλ‹€.

πŸ”₯Requirements

    python >=3.8
    setuptools>=42.0, wheel  # setuptools>=61.0 μ—μ„œ μ•ˆμ •μ μœΌλ‘œ λ™μž‘ν•¨μ„ 확인
    python-dateutil>=2.8, <3,
    lxml>=4.9, <6,
    more-itertools>=9.1, <10,
    cssselect>=1.1, <2,
    feedparser>=6.0, <7,
    colorama>=0.4, <1,
    typing-extensions>=4.6, <5,
    langdetect>=1.0, <2,
    validators>=0.24, <1,
    requests>=2.28, <3,
    tqdm>=4.66, <5,
    fastwarc>=0.14, <1,
    chardet>=5.2, <6,
    dill>=0.3, <1,
    dict2xml>=1.7.6, <2,
    xmltodict>=0.13.0, <1

πŸ”₯Docker

How to install & Run with Docker

πŸ“’ Dockerfile , 이미지, μ»¨ν…Œμ΄λ„ˆ λ§Œλ“€κΈ°

FROM ubuntu:22.04

RUN apt-get update
RUN apt-get install -y python3 python3-pip vim git

ENTRYPOINT ["/bin/bash"]
#도컀 이미지 λΉŒλ“œ
docker build -t [이름:νƒœκ·Έ] ./

#도컀 이미지 ν™•μΈν•˜κΈ°
docker images
#도컀 μ»¨ν…Œμ΄λ„ˆ λ§Œλ“€κ³  μ‹€ν–‰
docker run -dit [이름:νƒœκ·Έ]

#도컀 μ»¨ν…Œμ΄λ„ˆ ν™•μΈν•˜κΈ°
docker ps -a

#도컀 μ»¨ν…Œμ΄λ„ˆ 접속
docker exec -it <CONTAINER_ID> /bin/bash

πŸ“’ 둜컬둜 ν”„λ‘œμ νŠΈ 클둠 ν•΄μ˜€κΈ°

git clone https://github.com/zxxxv/fundus.git

πŸ“’ ν•„μˆ˜ νŒ¨ν‚€μ§€ μ„€μΉ˜

#Requirements에 λͺ…μ‹œλœ νŒ¨ν‚€μ§€ μžλ™ μ„€μΉ˜

cd ~/fundus       # ν”„λ‘œμ νŠΈ 루트(=pyproject.toml μžˆλŠ” μœ„μΉ˜)둜 이동
pip install --upgrade pip setuptools wheel
pip install .

#개발용 μΆ”κ°€ νŒ¨ν‚€μ§€ μ„€μΉ˜
pip install -e .[dev]

#μ„€μΉ˜ 확인
pip list | grep fundus

#κ²°κ³Όκ°€ μ΄λ ‡κ²Œ λ‚˜μ˜€λ©΄ 성곡!
fundus             0.5.0

⭐ Example 1: ν•œκ΅­ λ‰΄μŠ€ 기사 크둀링 ν•˜κΈ°

Fundusλ₯Ό μ΄μš©ν•˜μ—¬ ν•œκ΅­ 기반 publishersμ—μ„œ 기사 2개 ν¬λ‘€λ§ν•΄μ˜¨λ‹€.

from fundus import PublisherCollection, Crawler

# initialize the crawler for news publishers based in the KR
crawler = Crawler(PublisherCollection.kr)

# crawl 2 articles and print
for article in crawler.crawl(max_articles=2):
    print(article)

That's already it!

이제 μ½”λ“œλ₯Ό 싀행해보면 μ•„λž˜μ™€ 같은 κ²°κ³Όκ°€ λ‚˜μ˜¬κ²ƒμ΄λ‹€:

Fundus-Article including 1 image(s):
- Title: "러 ν‘Έν‹΄, ꡐ황 레였 14세와 첫 톡화 … β€˜κ·Όλ³Έ 원인’ ν•΄κ²° ν•„μš” 재차 κ°•μ‘°"
- Text:  "μ§€λ‚œ 4일(ν˜„μ§€μ‹œκ°) λŸ¬μ‹œμ•„ ν¬λ ˜λ¦°κΆμ— λ”°λ₯΄λ©΄, 블라디미λ₯΄ ν‘Έν‹΄ λŸ¬μ‹œμ•„ λŒ€ν†΅λ Ήκ³Ό 레였 14μ„Έ ꡐ황이 ν†΅ν™”λ‘œ λŸ¬μ‹œμ•„ - μš°ν¬λΌμ΄λ‚˜ μ „μŸμ— λŒ€ν•΄
          λ…Όμ˜ν–ˆλ‹€.  크렘린ꢁ 츑은 μ„±λͺ…을 λ°œν‘œν•΄ ν‘Έν‹΄ λŒ€ν†΅λ Ήμ΄ ν†΅ν™”μ—μ„œ μ •μΉ˜μ Β·μ™Έκ΅μ  μˆ˜λ‹¨μœΌλ‘œ 평화λ₯Ό μ΄λ£©ν•˜λŠ” 것에 관심이 [...]"
- URL:    https://www.mk.co.kr/news/world/11335094
- From:   Maeil Business Newspaper (2025-06-05 10:56)

Fundus-Article including 1 image(s):
- Title: "λ‘μ‚°μ—λ„ˆλΉŒ, 380MWκΈ‰ κ°€μŠ€ν„°λΉˆ μ„±λŠ₯μ‹œν—˜ 성곡"
- Text:  "데이터센터 ν™•λŒ€μ— κ°€μŠ€ν„°λΉˆ μ‹œμž₯ 곡랡 λ°•μ°¨  λ‘μ‚°μ—λ„ˆλΉŒλ¦¬ν‹°κ°€ 자체 기술둜 κ°œλ°œν•œ μ΄ˆλŒ€ν˜• κ°€μŠ€ν„°λΉˆ μ„±λŠ₯μ‹œν—˜μ— μ„±κ³΅ν–ˆλ‹€. μΉœν™˜κ²½ λ°œμ „ μˆ˜μš”μ™€
          데이터센터 ν™•λŒ€λ‘œ 인해 κ°€μŠ€ν„°λΉˆ μˆ˜μš”κ°€ λŠ˜μ–΄λ‚˜λŠ” 상황인 만큼 κ΄€λ ¨ μ‹œμž₯ 곡랡 μ€€λΉ„λ₯Ό 마친 μ…ˆμ΄λ‹€.  λ‘μ‚°μ—λ„ˆλΉŒλ¦¬ν‹°λŠ” [...]"
- URL:    https://www.mk.co.kr/news/business/11335088
- From:   Maeil Business Newspaper (2025-06-05 10:50)

이 좜λ ₯은 두 개의 기사λ₯Ό μ„±κ³΅μ μœΌλ‘œ ν¬λ‘€λ§ν–ˆμŒμ„ μ•Œλ €μ€λ‹ˆλ‹€!

각 기사에 λŒ€ν•΄ 좜λ ₯물은 λ‹€μŒμ„ μƒμ„Ένžˆ λ³΄μ—¬μ€λ‹ˆλ‹€:

  • 기사에 ν¬ν•¨λœ 이미지 수
  • β€œμ œλͺ©β€(Title), 즉 ν—€λ“œλΌμΈ
  • β€œλ³Έλ¬Έβ€(Text), 즉 μ£Όμš” 기사 λ³Έλ¬Έ ν…μŠ€νŠΈ
  • 기사가 크둀링된 β€œURL”
  • λ‰΄μŠ€ 좜처(From)

⭐ Example 2: νŠΉμ • news source 크둀링해보기

νŠΉμ • λ‰΄μŠ€ 좜처만 ν¬λ‘€λ§ν•˜κ³  싢을 μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€. λ§€μΌκ²½μž¬μ‹ λ¬Έ(Maeil Business Newspaper)μ—μ„œλ§Œ λ‰΄μŠ€ 기사λ₯Ό ν¬λ‘€λ§ν•΄λ³΄κ² μŠ΅λ‹ˆλ‹€:

from fundus import PublisherCollection, Crawler

# initialize the crawler for λ§€μΌκ²½μ œμ‹ λ¬Έμ‚¬(MBN)
crawler = Crawler(PublisherCollection.kr.MBN)

# crawl 2 articles and print
for article in crawler.crawl(max_articles=2):
    print(article)

πŸ”₯도컀 μ‹€ν–‰ ν›„ μ’…λ£Œν•˜κΈ°(+μ €μž₯)

#μ»¨ν…Œμ΄λ„ˆ λ°–μœΌλ‘œ λ‚˜μ˜€κΈ°
exit
Ctrl + P 그리고 Ctrl + Q

#도컀 컀밋 (μ»¨ν…Œμ΄λ„ˆ μ΄λ―Έμ§€λ‘œ μ €μž₯ν•˜κΈ°)
docker commit [OPTIONS] <μ»¨ν…Œμ΄λ„ˆ_ID_or_이름> <μƒˆ_이미지이름>:<νƒœκ·Έ>

#μ»¨ν…Œμ΄λ„ˆ λ©ˆμΆ”κΈ°
docker stop <CONTAINER_ID>

#μ»¨ν…Œμ΄λ„ˆ μ‚­μ œ
docker rm <CONTAINER_ID>

#이미지 μ‚­μ œ
docker rmi <Image_ID λ˜λŠ” Image_Name:νƒœκ·Έ>

πŸ”₯디렉토리 ꡬ쑰

fundus/
β”œβ”€β”€ .github/                       # GitHub μ„€μ • 및 μ›Œν¬ν”Œλ‘œμš°
β”‚   └── workflows/                 # CI/CD μ›Œν¬ν”Œλ‘œμš° μ •μ˜ (예: ν…ŒμŠ€νŠΈ, 린트)
β”œβ”€β”€ docs/                          # ν”„λ‘œμ νŠΈ κ΄€λ ¨ λ¬Έμ„œ 및 νŠœν† λ¦¬μ–Ό
β”‚   β”œβ”€β”€ 1_getting_started.md       # κΈ°λ³Έ μ‚¬μš©λ²• μ•ˆλ‚΄
β”‚   β”œβ”€β”€ how_to_add_a_publisher.md  # 퍼블리셔 μΆ”κ°€ κ°€μ΄λ“œ
β”‚   β”œβ”€β”€ supported_publishers.md    # 지원 쀑인 퍼블리셔 λͺ©λ‘
β”‚   └── …                          # 기타 νŠœν† λ¦¬μ–Ό 및 κ³ κΈ‰ 주제 λ¬Έμ„œ
β”œβ”€β”€ resources/                     # 정적 λ¦¬μ†ŒμŠ€  
β”‚   └── logo/                      # 둜고 이미지 λ“±
β”‚       β”œβ”€β”€ fundus-logo.png        # ν”„λ‘œμ νŠΈ 둜고
β”‚       └── …                      # μΆ”κ°€ 둜고 파일
β”œβ”€β”€ scripts/                       # μœ ν‹Έλ¦¬ν‹° 슀크립트
β”‚   β”œβ”€β”€generate_table.py           # 지원 κ°€λŠ₯ν•œ 퍼블리셔 λͺ©λ‘ 생
β”‚   └── …                          # 기타 μžλ™ν™” 슀크립트
β”œβ”€β”€ src/                           # μ†ŒμŠ€ μ½”λ“œ
β”‚   └── fundus/                    # Python νŒ¨ν‚€μ§€ 루트
β”‚       β”œβ”€β”€ __init__.py            # νŒ¨ν‚€μ§€ μ΄ˆκΈ°ν™” 파일
β”‚       β”œβ”€β”€ logging.py             # Fundus μ „λ°˜μ—μ„œ μ‚¬μš©ν•˜λŠ” 둜거(logger) μ„€μ • 및 생성 ν•¨μˆ˜
β”‚       β”œβ”€β”€ py.typed               # PEP 561 νƒ€μž… 힌트 마컀 파일 (νƒ€μž… 검사 도ꡬ μΈμ‹μš©)
β”‚       β”œβ”€β”€ parser/                # μ—¬λŸ¬ 퍼블리셔별 νŒŒμ„œ(parser) κ΄€λ ¨ λͺ¨λ“ˆ
β”‚       β”‚   β”œβ”€β”€ __init__.py        # 퍼블리셔 νŒ¨ν‚€μ§€ μ΄ˆκΈ°ν™”
β”‚       β”‚   β”œβ”€β”€ base_parser.py     # λͺ¨λ“  퍼블리셔 νŒŒμ„œκ°€ μƒμ†ν•˜λŠ” 곡톡 κΈ°λŠ₯(BaseParser) μ •μ˜
β”‚       β”‚   β”œβ”€β”€ data.py            # νŒŒμ‹±λœ 기사 데이터 ꡬ쑰(λͺ¨λΈ) μ •μ˜
β”‚       β”‚   └── …                  # μΆ”κ°€λœ λ‹€λ₯Έ 퍼블리셔별 νŒŒμ„œ λͺ¨λ“ˆλ“€
β”‚       β”œβ”€β”€ scraping/              # μ›Ή 크둀링 및 μŠ€ν¬λž˜ν•‘ 둜직 κ΄€λ ¨ λͺ¨λ“ˆ
β”‚       β”‚   β”œβ”€β”€ __init__.py        # scraping νŒ¨ν‚€μ§€ μ΄ˆκΈ°ν™”
β”‚       β”‚   β”œβ”€β”€ article.py         # 크둀링된 μ›Ή νŽ˜μ΄μ§€(HTML)와 메타정보λ₯Ό λ‹΄λŠ” Article 클래슀 μ •μ˜
β”‚       β”‚   β”œβ”€β”€ crwaler.py         # μ‹€μ œ μ›Ήμ‚¬μ΄νŠΈλ₯Ό μˆœνšŒν•˜λ©° Article 객체λ₯Ό μƒμ„±ν•˜λŠ” Crawler κ΅¬ν˜„
β”‚       β”‚   └── …                  # μš”μ²­, ν•„ν„°, HTML νŒŒμ‹± λ“± 기타 μŠ€ν¬λž˜ν•‘ 지원 λͺ¨λ“ˆ
β”‚       β”œβ”€β”€ publishers/            # 퍼블리셔별 μŠ€νŽ™ 및 νŒŒμ„œ μ •μ˜
β”‚       β”‚   β”œβ”€β”€ __init__.py        # 퍼블리셔 νŒ¨ν‚€μ§€ μ΄ˆκΈ°ν™”
β”‚       β”‚   β”œβ”€β”€ us.py              # λ―Έκ΅­ 기반 퍼블리셔(예: TheNewYorker λ“±)
β”‚       β”‚   β”œβ”€β”€ uk.py              # 영ꡭ 기반 퍼블리셔(예: TheGuardian λ“±)
β”‚       β”‚   β”œβ”€β”€ kr/                # ν•œκ΅­ 퍼블리셔 κ΄€λ ¨ λͺ¨λ“ˆ
β”‚       β”‚   β”‚   β”œβ”€β”€ __init__.py    # KR 퍼블리셔 νŒ¨ν‚€μ§€ μ΄ˆκΈ°ν™”
β”‚       β”‚   β”‚   β”œβ”€β”€ mbn.py         # λ§€μΌκ²½μ œμ‹ λ¬Έμ‚¬(MBN) νŒŒμ„œ κ΅¬ν˜„
β”‚       β”‚   β”‚   └── …              # μΆ”κ°€λœ λ‹€λ₯Έ ν•œκ΅­ 언둠사 νŒŒμ„œ
β”‚       β”‚   └── …                  # 기타 ꡭ가별 퍼블리셔 μ •μ˜
β”‚       └── utils/                 # λ‚΄λΆ€ λ„μš°λ―Έ ν•¨μˆ˜ 및 곡용 μœ ν‹Έλ¦¬ν‹°
β”‚           β”œβ”€β”€ __init__.py        # μœ ν‹Έλ¦¬ν‹° νŒ¨ν‚€μ§€ μ΄ˆκΈ°ν™”
β”‚           β”œβ”€β”€ events.py          # Fundus λ‚΄ 이벀트(예: 크둀링 μ‹œμž‘/μ™„λ£Œ)의 μƒμˆ˜ 및 헬퍼 ν•¨μˆ˜ μ •μ˜
β”‚           └── iteration.py       # 반볡(iteration) κ΄€λ ¨ μœ ν‹Έλ¦¬ν‹° (청크 λΆ„ν• , λ¬΄ν•œ 반볡 λ“±) κ΅¬ν˜„
β”‚           └── …                  # 기타 곡톡 ν•¨μˆ˜ λͺ¨μŒ
β”œβ”€β”€ tests/                         # ν…ŒμŠ€νŠΈ μ½”λ“œ
β”‚   β”œβ”€β”€ test_crawler.py            # 크둀러 λ™μž‘ 검증 ν…ŒμŠ€νŠΈ
β”‚   β”œβ”€β”€ test_publishers.py         # 퍼블리셔 νŒŒμ„œ ν…ŒμŠ€νŠΈ
β”‚   └── …                          # 기타 μœ λ‹›/톡합 ν…ŒμŠ€νŠΈ
β”œβ”€β”€ .gitignore                     # Gitμ—μ„œ λ¬΄μ‹œν•  파일/폴더 λͺ©λ‘
β”œβ”€β”€ CODE_OF_CONDUCT.md             # μ˜€ν”ˆμ†ŒμŠ€ κΈ°μ—¬λ₯Ό μœ„ν•œ 행동 κ°•λ Ή
β”œβ”€β”€ LICENSE                        # MIT λΌμ΄μ„ μŠ€
β”œβ”€β”€ MANIFEST.in                    # νŒ¨ν‚€μ§• μ‹œ 포함할 파일 μ§€μ •
β”œβ”€β”€ README.md                      # ν”„λ‘œμ νŠΈ κ°œμš” 및 μ„€μΉ˜/μ‚¬μš©λ²• μ„€λͺ…
└── pyproject.toml                 # λΉŒλ“œ 및 ν”„λ‘œμ νŠΈ μ„€μ • 파일

πŸ”₯ν˜„μž¬ μ§€μ›λ˜λŠ” News Source

μ—¬κΈ°μ—μ„œ ν˜„μž¬ μ§€μ›λ˜λŠ” 퍼블리셔λ₯Ό 확인할 수 μžˆμŠ΅λ‹ˆλ‹€. here.

πŸ”₯License

MIT

About

A very simple news crawler with a funny name

Resources

License

Code of conduct

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

  • Python 100.0%