파이썬 for문 안에 있는 데이터 프레임값을 for문 밖에서 불러올 수 있을...

파이썬 for문 안에 있는 데이터 프레임값을 for문 밖에서 불러올 수 있을...

작성일 2022.10.31댓글 1건
    게시물 수정 , 삭제는 로그인 필요

안녕하세요 네이버 카페 자동글쓰기를 짜고 있는데,

여기서 며칠 헤매고 있습니다.

다름아니라, 뉴스를 크롤링해서 얻은 값을

데이터 프레임화하였는데,

이것을 글쓰기 본문값으로 불러오지를 못하고 있습니다.



#####뉴스크롤링 시작#####

#검색어 입력
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문 종료

profile_image 익명 작성일 -

for문 안의 new_df를 for문 밖에 리스트를 하나 만들어줘서 append해주면 될 것 같습니다.

리스트에 데이터 수만큼 for문을...

파이썬에서 코드를 작성하는데요, 리스트에 데이터 수만큼 for문을 돌리고 싶은데 어떻게 해야할까요? 먼저 리스트에 있는 데이터의 갯수를 알아야...

파이썬 for문 질문

for x in list_a: list_b[x] += 1 라는 코드가 있을 때, 리스트 a 안에 있는 중 리스트 b와 겹치는 인덱스값에 1을 더해서 저장하는 것인가요? list b에서 list...

for 문에서 rand 함수..

... (0))가 for 문 안에있을때는 숫자 랜덤이 안되죠????... 뿌려줄 있는 방법은 없습니다. 따라서 C에서는 rand... for 문 밖에서 srand를 호출하면 srand는 프로그램이 시작된...