/web-crawler

web-crawling (with AngleSharp)

Primary LanguageC#GNU General Public License v3.0GPL-3.0

Website Made with Made with Made with

Publish Docker image

GitHub forks GitHub stars GitHub watchers GitHub followers

GitHub GitHub repo size in bytes GitHub code size in bytes

web-crawler

  • .NET 8, ASP NET CORE 를 기반으로 작성되었습니다.
  • 크롤링 대상은 Source로 등록되어야 합니다. 예시
    • Source로 등록된 게시판들은 테스트를 거쳐 크롤링 됨을 확인한 사이트와 게시판 들이지만, 규격이 달라져 추가적인 예외처리가 필요할 수 있습니다.
  • 알림은 Discord, Slack을 지원합니다. Notification 데이터를, Source와 매핑 시켜서 해당 Source에 새 데이터가 갱신되면 알림이 날라오게 되어있습니다.
  • DB로는 mongoDB를 사용합니다.
  • API는 swagger를 통해 확인하셔도 좋지만, http 폴더 안에 예제가 포함되어있습니다.

사용법

  • MongoDB 설정 (Server 프로젝트)
    • MONGODB_CONNECTION 환경 변수에 MONGODB 커넥션 문자열 입력
  • 선택적 MongoDB 데이터베이스
    • 기본 값은 rss-feed-crawler
    • MONGODB_DATABASE 환경 변수 사용시 override
  • 환경 변수 미사용시, appSettings.[환경].json 파일에 있는 값을 사용합니다. (환경에 맞는 파일 미제공시, appSettings.json 의 값을 그대로 이용)
  • Crawling 처리를 하는 스레드에 제한 기능
    • THREAD_LIMIT 환경 변수에 제한 스레드 수를 입력

현재 지원중인 크롤링 대상 (사이트)

  • Clien
  • FmKorea
  • 웃긴대학 (HumorUniv)
  • Itcm
  • 인벤 뉴스 (InvenNews)
  • Ppomppu
  • Ruliweb
  • Slrclub
  • 오유 (TodayHumor)

각종 API 예시

Notification.http 예시

### VS Code의 RestClient Plugin의 .http 파일용 서식입니다

### Notification Create Multi Discord

POST {{host}}/Notification/Multi
Content-Type: application/json

{
	"Datas": [{
			"Type": "Discord",
			"Name": "핫딜",
			"IconUrl": "https://lh3.googleusercontent.com/OwN24ti7VzhNXGWVw4RQD-dfkGEf-fnFb7yz--knAwPoxR9VSXpGb3UoOYJNyDIKiQ=s180",
			"HookUrl": "",
			"CrawlingType": "Ruliweb",
			"BoardName": "핫딜게시판"
		},
		{
			"Type": "Discord",
			"Name": "콘솔뉴스",
			"IconUrl": "https://lh3.googleusercontent.com/OwN24ti7VzhNXGWVw4RQD-dfkGEf-fnFb7yz--knAwPoxR9VSXpGb3UoOYJNyDIKiQ=s180",
			"HookUrl": "",
			"CrawlingType": "Ruliweb",
			"BoardName": "콘솔뉴스"
		},
		{
			"Type": "Discord",
			"Name": "PC뉴스",
			"IconUrl": "https://lh3.googleusercontent.com/OwN24ti7VzhNXGWVw4RQD-dfkGEf-fnFb7yz--knAwPoxR9VSXpGb3UoOYJNyDIKiQ=s180",
			"HookUrl": "",
			"CrawlingType": "Ruliweb",
			"BoardName": "PC뉴스"
		},
		{
			"Type": "Discord",
			"Name": "많이 본 글",
			"IconUrl": "https://lh3.googleusercontent.com/OwN24ti7VzhNXGWVw4RQD-dfkGEf-fnFb7yz--knAwPoxR9VSXpGb3UoOYJNyDIKiQ=s180",
			"HookUrl": "",
			"CrawlingType": "Ruliweb",
			"BoardName": "많이 본 글",
			"FilterDayOfWeeks": ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday"],
			"FilterStartTime": "09:00:00",
			"FilterEndTime": "19:00:00"
		},
		{
			"Type": "Discord",
			"Name": "베오베",
			"IconUrl": "https://apprecs.org/ios/images/app-icons/256/6f/664550767.jpg",
			"HookUrl": "",
			"CrawlingType": "TodayHumor",
			"BoardName": "베오베",
			"FilterDayOfWeeks": ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday"],
			"FilterStartTime": "09:00:00",
			"FilterEndTime": "19:00:00"
		},
		{
			"Type": "Discord",
			"Name": "축구 뉴스",
			"IconUrl": "https://media.cdnandroid.com/item_images/1047984/imagen-i-i-i-ee-i-i-i-0thumb.jpeg",
			"HookUrl": "",
			"CrawlingType": "FmKorea",
			"BoardName": "축구 뉴스",
			"Keyword": "토트넘"
		},
		{
			"Type": "Discord",
			"Name": "LOL 리포터 뉴스",
			"IconUrl": "https://lh3.googleusercontent.com/Hc4D74YO7FYttrPCm5MuDm91NLblaaunJ6Y38WCg9mABUJfobgU_vXy1tjX668bI6xs=s180-rw",
			"HookUrl": "",
			"CrawlingType": "InvenNews",
			"BoardName": "인벤 LOL 뉴스"
		},
		{
			"Type": "Discord",
			"Name": "펨코핫딜",
			"IconUrl": "https://media.cdnandroid.com/item_images/1047984/imagen-i-i-i-ee-i-i-i-0thumb.jpeg",
			"HookUrl": "",
			"CrawlingType": "FmKorea",
			"BoardName": "핫딜"
		},
		{
			"Type": "Discord",
			"Name": "포텐터짐",
			"IconUrl": "https://media.cdnandroid.com/item_images/1047984/imagen-i-i-i-ee-i-i-i-0thumb.jpeg",
			"HookUrl": "",
			"CrawlingType": "FmKorea",
			"BoardName": "포텐터짐",
			"Keyword": "LOL|LCK|DRX|손흥민",
			"FilterDayOfWeeks": ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday"],
			"FilterStartTime": "09:00:00",
			"FilterEndTime": "19:00:00"
		},
		{
			"Type": "Discord",
			"Name": "인기자료",
			"IconUrl": "http://down.humoruniv.com/hwiparambbs/data/pdswait/a_4883065431_b9afd56add3ad86ccc10cde95a0d8c0cc57ead30.png",
			"HookUrl": "",
			"CrawlingType": "HumorUniv",
			"BoardName": "인기자료",
			"FilterDayOfWeeks": ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday"],
			"FilterStartTime": "09:00:00",
			"FilterEndTime": "19:00:00"
		},
		{
			"Type": "Discord",
			"Name": "알뜰구매",
			"IconUrl": "https://cdn.clien.net/web/api/file/F01/2581830/94f801b57da24373a43.PNG",
			"HookUrl": "",
			"CrawlingType": "Clien",
			"BoardName": "알뜰구매"
		},
		{
			"Type": "Discord",
			"Name": "핫딜",
			"IconUrl": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/avatars/6b/6b9915f60cb45d4df113cd8f36387ba1de8ce601_full.jpg",
			"HookUrl": "",
			"CrawlingType": "Itcm",
			"BoardName": "핫딜"
		}
	]
}

Discord Alert Sample

sample1

Frontend Board Sample

sample2