Today's

길을 나서지 않으면 그 길에서 만날 수 있는 사람을 만날 수 없다

파이썬 스크립트

파이썬 으로 따라하는 자동화 스크립트 : 다음 랭킹 뉴스 수집

Billcorea 2021. 12. 16. 09:45
반응형

다음 메인 화면에 있는 것만 봐서는 내용이 그리 많이 나오지 않는 것 같다.  그래서 이번에는 다음 뉴스중에서 랭킹 뉴스를 스크랩 하는 sciprt 을 구성해 보기로 한다.

#coding=utf-8
#
import json
import urllib.request
import urllib.parse
from bs4 import BeautifulSoup
import ssl
import requests
import datetime

def daumResult():
    print('')
    now = datetime.datetime.now()
    rValue = '''
            <div align="center">자료수집 일시 : {0}</div>
            <div></div>
            <br></br>
        '''.format(now)

    context = ssl._create_unverified_context()
    url = 'https://news.daum.net/ranking/popular'
    html = urllib.request.urlopen(url, context=context).read()
    soup = BeautifulSoup(html, 'html.parser')

    hrefAll = []
    srcAll = []
    altAll = []
    infoAll = []
    descAll = []
    items = soup.find_all(class_="link_thumb") # link_thumb info_news desc_thumb
    for item in items:
        hrefAll.append(item['href'])
        img = BeautifulSoup(item.decode_contents(), 'html.parser')
        imgsrc = img.find('img')
        srcAll.append(imgsrc['src'])
        altAll.append(imgsrc['alt'])

    items = soup.find_all(class_="info_news")  # link_thumb info_news desc_thumb
    for item in items:
        info = BeautifulSoup(item.decode_contents(), 'html.parser')
        infoAll.append(info)

    items = soup.find_all(class_="desc_thumb")  # link_thumb info_news desc_thumb
    for item in items:
        desc = BeautifulSoup(item.decode_contents(), 'html.parser')
        descSrc = desc.find('span')
        descAll.append(descSrc.get_text().strip())

    tr_add = "";
    print(len(hrefAll))
    for idx in range(1, (len(hrefAll))+1):
        try:
            tr_add += '''
             <a href="{0}" target="_blank"><div>{1} -{2}-</div>
             <div><img src="{3}" alt="{4}"/></div>
             <div>{5}</div></a>
             <br></br>
             '''.format(str(hrefAll[idx]), str(altAll[idx]), str(infoAll[idx]), str(srcAll[idx]), str(altAll[idx]), descAll[idx])

            if idx % 10 == 0:
                tr_add += '''
                    <figure class="ad-wp" contenteditable="false" data-ke-type="revenue" data-ad-vendor="adsense" data-ad-id-pc="74706" data-ad-id-mobile="74709"></figure>
                '''

        except:
            pass

    end_tag = '''
            <br></br>
            <div> 이 글은 python script 을 이용하여 다음(www.daum.net) 메인 내용을 수집한 자료 입니다. </div>
        '''
    return rValue + tr_add + end_tag


blog_name = "a......ting"
client_id = "be43b5.........................3286e"
seckey = "be43b5c08..............................983c7915"
callback_url = "http://autoposting.tistory.com"
getUrl = 'https://www.tistory.com/oauth/authorize?client_id={0}&redirect_uri={1}&response_type=code&state=someValue'
getUrl = getUrl.format(client_id, callback_url)
#res = requests.get(getUrl, verify=False)
#print(getUrl)

def sendPost(category):
    url_post = "https://www.tistory.com/apis/post/write"

    visibility = 3; # 0 미발행 3 발행
    #category = 1;
    tag = '자동글쓰기, python, 다음_메인뉴스'
    acceptComment = 1
    title = '이시간 랭킹 뉴스 (다음) (파이썬 자동 글쓰기) '
    content = daumResult()

    headers = {'Content-Type': 'application/json; charset=utf-8'}
    params = {
        'access_token': access_token,
        'output': 'json',
        'blogName': blog_name,
        'title': title,
        'content': content,
        'visibility': visibility,
        'category': category,
        'published':'',
        'slogan':'',
        'tag': tag,
        'acceptComment': acceptComment,
        'password':''
    }
    data = json.dumps(params)

    rw = requests.post(url_post, headers=headers, data=data)
    if rw.status_code == 200:
        print('ok')
    else:
        print('fail')

# 등록시 입력
# 그떄 마다 token 을 변경하면 다시 받아야 함.
def getToken():
    code = "421872a.......................................5b71908"
    token_url="https://www.tistory.com/oauth/access_token?client_id={0}&client_secret={1}&redirect_uri={2}&code={3}&grant_type=authorization_code".format(client_id, seckey, callback_url, code)
    #res = requests.get(token_url, verify=False)
    #access_token = res.text.split("=")[1]
    #print(access_token)

access_token = 'be7c.............................................a0ee119d'

url_getCategory = "https://www.tistory.com/apis/category/list?access_token={0}&output={1}&blogName={2}".format(access_token, 'json', blog_name)
res = requests.get(url_getCategory)
for r in res.json()['tistory']['item']['categories']:
    print(r['id'] + " " + r['name'] + " 갯수=" + r['entries'])

sendPost('504263') # 특정한 카테고리 선택하기 위해서
print('Job END ...')

이전에 게시된 다른 스크립트들 처럼 개인적인 정보는 .... 으로 마킹을 했다.   또한 이 스크립트를 이용해서 매일 아침에 랭킹 뉴스를 스크랩 할 것이다.  하루 한 번... 반복적으로 여러번 하고 싶기도 하지만, 뭐 그럴 필요까지는 

스크랩 되어서 게시되는 모양이 이쁘지 않다면 html 코드을 이용해서 수정하면 될 것 같다.

다만, 주의가 필요해 보이는 것은 내용에 <a> 태크를 달아서 외부 링크를 사용하는 경우 이것이 많으면 광고을 유치(?)하기에는 무리가 따른다.  나의 글 보다 인용글이 많다는 의미로.  그래서 가급적이면 자동화를 하더라도 외부 인용은 자제(?)하는 것이 좋을 것 같다.

이걸루 또 한가지 스크랩 하는 기능을 구현 하였다.

반응형