forked from kamzzang/WebCrawler
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathBot_UsedItemSearch_Naver.py
More file actions
90 lines (66 loc) · 3.14 KB
/
Bot_UsedItemSearch_Naver.py
File metadata and controls
90 lines (66 loc) · 3.14 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
import requests
from urllib import parse
from bs4 import BeautifulSoup
import pandas as pd
import sqlite3
import telepot
# 텔레그램 셋팅 ************************************************************
token = "XXXXXXXXX:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" # 텔레그램 Bot 토근
bot = telepot.Bot(token)
Bot_ID = 'XXXXXXXXX' # 수신자 ID
# 텔레그램 메시지 전송 함수
def Sendmsg(msg):
bot.sendMessage(Bot_ID, msg)
# ************************************************************************
# 크롤링 결과 저장 변수
# 전역 변수로 사용할 수도 있어 여기에 선언
# 작성자(닉네임), 제목, 링크 URL 저장함
data = {'Name':[],
'Title':[],
'URL':[]}
# 신규 데이터 DB 저장 함수
def DatatoSQL(df):
con = sqlite3.connect("XXXXXX.db") # db 파일명 사용자 임의 선정
df.to_sql('ITEM', con, if_exists='append', index=False)
con.close()
# 이전에 저장한 DB와 비교를 위해 불러옴
def Check():
try:
con = sqlite3.connect("XXXXXX.db") # db 파일명 사용자 임의 선정
df = pd.read_sql("SELECT * from ITEM ", con=con)
con.close()
item_name = df['Name'].tolist() # 동일 매물은 제외시키기 위해서 작성자만 리스트로 받음
return item_name
except Exception as e:
return []
# 입력 매물 검색
def Search(search_word):
# 모바일 URL로 접근(별도로 검색어 입력을 위한 selenium 필요없음)
url = 'https://m.cafe.naver.com/ArticleSearchList.nhn?search.query=%s&search.menuid=0&search.searchBy=0&search.sortBy=date&search.clubid=10050146&search.option=0&search.defaultValue=1'%(parse.quote(search_word))
# 봇으로 접근 시 차단될 수도 있어 유저 정보를 같이 보내기 위함함
headers = {
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.130 Safari/537.36'}
r = requests.get(url, headers=headers)
soup = BeautifulSoup(r.text, 'html.parser')
table = soup.find_all('li')
for i in table[-20:]:
# 링크 주소는 모바일로 만들어서 메시지 발송
link = 'https://m.cafe.naver.com' + i.find('a')['href'] # a 태그의 href
title = i.find('h3') # h3 태그
name = i.find('span', class_='name') # span 태그의 name 클래스
data['Name'].append(name.text.strip())
data['Title'].append(title.text.strip())
data['URL'].append(link)
df = pd.DataFrame(data)
print(df)
check_list = Check() # 기존 저장된 매물 등록자 리스트
for name in data['Name']:
# 크롤링으로 받은 데이터의 작성자가 기존 리스트에 없으면 메시지 전송/데이터 저장
if name not in check_list:
# 메시지 내용 : 게시글 제목 + URL
msg = '중고나라 매물 알림\n{}\n{}'.format(data['Title'][data['Name'].index(name)], data['URL'][data['Name'].index(name)])
print(msg)
Sendmsg(msg) # 메시지 전송
DatatoSQL(df.loc[df['Name']==name]) # 데이터 DB 저장
if __name__ == '__main__':
Search('브롬톤')