파이썬 for문 안에 있는 데이터 프레임값을 for문 밖에서 불러올 수 있을...
-
게시물 수정 , 삭제는 로그인 필요
안녕하세요 네이버 카페 자동글쓰기를 짜고 있는데,
여기서 며칠 헤매고 있습니다.
다름아니라, 뉴스를 크롤링해서 얻은 값을
데이터 프레임화하였는데,
이것을 글쓰기 본문값으로 불러오지를 못하고 있습니다.
#####뉴스크롤링 시작#####
#검색어 입력
search = input("검색할 키워드를 입력해주세요:")
#검색 시작할 페이지 입력
page = int(input("\n크롤링할 시작 페이지를 입력해주세요. ex)1(숫자만입력):")) # ex)1 =1페이지,2=2페이지...
print("\n크롤링할 시작 페이지: ",page,"페이지")
#검색 종료할 페이지 입력
page2 = int(input("\n크롤링할 종료 페이지를 입력해주세요. ex)1(숫자만입력):")) # ex)1 =1페이지,2=2페이지...
print("\n크롤링할 종료 페이지: ",page2,"페이지")
# naver url 생성
url = makeUrl(search,page,page2)
#뉴스 크롤러 실행
news_titles = []
news_url =[]
news_contents =[]
news_dates = []
for i in url:
url = articles_crawler(url)
news_url.append(url)
#제목, 링크, 내용 1차원 리스트로 꺼내는 함수 생성
def makeList(newlist, content):
for i in content:
for j in i:
newlist.append(j)
return newlist
#제목, 링크, 내용 담을 리스트 생성
news_url_1 = []
#1차원 리스트로 만들기(내용 제외)
makeList(news_url_1,news_url)
#NAVER 뉴스만 남기기
final_urls = []
for i in tqdm(range(len(news_url_1))):
if "news.naver.com" in news_url_1[i]:
final_urls.append(news_url_1[i])
else:
pass
# 뉴스 내용 크롤링
for i in tqdm(final_urls):
#각 기사 html get하기
news = requests.get(i,headers=headers)
news_html = BeautifulSoup(news.text,"html.parser")
# 뉴스 제목 가져오기
title = news_html.select_one("#ct > div.media_end_head.go_trans > div.media_end_head_title > h2")
if title == None:
title = news_html.select_one("#content > div.end_ct > div > h2")
# 뉴스 본문 가져오기
content = news_html.select("div#dic_area")
if content == []:
content = news_html.select("#articeBody")
# 기사 텍스트만 가져오기
# list합치기
content = ''.join(str(content))
# html태그제거 및 텍스트 다듬기
pattern1 = '<[^>]*>'
title = re.sub(pattern=pattern1, repl='', string=str(title))
content = re.sub(pattern=pattern1, repl='', string=content)
pattern2 = """[\n\n\n\n\n// flash 오류를 우회하기 위한 함수 추가\nfunction _flash_removeCallback() {}"""
content = content.replace(pattern2, '')
news_titles.append(title)
# final_urls.append(final_urls)
news_contents.append(content)
try:
html_date = news_html.select_one("div#ct> div.media_end_head.go_trans > div.media_end_head_info.nv_notrans > div.media_end_head_info_datestamp > div > span")
news_date = html_date.attrs['data-date-time']
except AttributeError:
news_date = news_html.select_one("#content > div.end_ct > div > div.article_info > span > em")
news_date = re.sub(pattern=pattern1,repl='',string=str(news_date))
# 날짜 가져오기
news_dates.append(news_date)
# print(news_titles,news_dates,final_urls)
# print(news_titles)
# print(final_urls)
# print(news_dates)
# print(news_titles + news_dates + final_urls)
'''
print("검색된 기사 갯수: 총 ",(page2+1-page)*10,'개')
print("\n[뉴스 제목]")
print(news_titles)
print("\n[뉴스 링크]")
print(final_urls)
#print("\n[뉴스 내용]")
# print(news_contents)
print(news_dates)
'''
print('news_title: ',len(news_titles))
print('news_url: ',len(final_urls))
print('news_contents: ',len(news_contents))
print('news_dates: ',len(news_dates))
###데이터 프레임으로 만들기###
import pandas as pd
#데이터 프레임 만들기
news_df = pd.DataFrame({'date':news_dates,'title':news_titles,'link':final_urls})
#중복 행 지우기
news_df = news_df.drop_duplicates(keep='first',ignore_index=True)
print("중복 제거 후 행 개수: ",len(news_df))
#데이터 프레임 저장
# now = datetime.datetime.now()
# new_data.to_csv('{}_{}.csv'.format(search),encoding='utf-8-sig',index=False)
access_token = "토큰" #access_token 입력
header = "Bearer " + access_token # Bearer 다음에 공백 추가
clubid = "카페아이디" # 카페의 고유 ID값 http://cafe.naver.com/apiexam
menuid = "메뉴아이디" #메뉴 ID 값
url = "https://openapi.naver.com/v1/cafe/" + clubid + "/menu/" + menuid + "/articles"
title = '테스트입니다.333' #제목
subject = urllib.parse.quote(title) #제목
content = news_df #본문
description = urllib.parse.quote(content) #본문
data = {'subject': subject, 'content': description, 'openyn' : True } #데이터 입력 (공개 데이터 기준)
#이미지 경로
imagePath = r'C:\RPA\sign.jpg'
files = [('image', ('테스트.jpg', open(imagePath, 'rb'), 'image/jpeg', {'Expires': '0'}))]
headers = {'Authorization': header }
try :
response = requests.post(url, headers=headers, data=data, files=files)
#rescode = response.status_code
#if(rescode==200):
# print (response.text)
#else:
# print(rescode)
print("포스팅완료")
except :
print("포스팅실패")
이것을 실행하면
Traceback (most recent call last):
File "auto_post5-1.py", line 216, in <module>
description = urllib.parse.quote(content) #본문
File "C:\python38-64\lib\urllib\parse.py", line 850, in quote
return quote_from_bytes(string, safe)
File "C:\python38-64\lib\urllib\parse.py", line 875, in quote_from_bytes
raise TypeError("quote_from_bytes() expected bytes")
TypeError: quote_from_bytes() expected bytes
이런 메세지가 나옵니다.
for 문 안에 있는 news_df 값을
for 문 밖에서 카페 자동글쓰기 내용으로 불러올 수는 없을까요.
#파이썬 for문 #파이썬 for문 range #파이썬 for문 거꾸로 #파이썬 for문 예제 #파이썬 for문 변수 2개 #파이썬 for문 탈출 #파이썬 for문 리스트 #파이썬 for문 한줄 #파이썬 for문 리스트 만들기 #파이썬 for문 종료