Today's

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

파이썬 스크립트

파이썬으로 따라하는 자동화 스크립트 : daum.net 스크랩 해보기

Billcorea 2021. 12. 14. 09:43
반응형

오늘은 다음(daum.net) 의 메인 페이지의 내용중에 일부를 스크래을 해 보기로 했다. 

#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>
            <table style="border-collapse: collapse; width: 100%;" border="1" data-ke-align="alignLeft">
                <tbody>
                <tr>
                    <td width="33%" bgcolor="yellow" align="center"> 뉴스 제목 </td>
                    <td width="33%" bgcolor="yellow" align="center"> 관련 링크 </td>
                    <td width="33%" bgcolor="yellow" align="center"> 참고 이미지 </td>
                </tr>
        '''.format(now)

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

    tr_add = "";
    items = soup.find_all(class_="link_item")
    for item in items:
        try:
            img = item.find_all(class_="img_thumb")
            titles = item.find_all(class_="tit_item")
            tr_add += '''
                    <tr>
                        <td >{0}</td>
                        <td ><a href="{1}">{2}</a></td>
                        <td ><img src="{3}">{4}</td>
                    </tr>'''.format(titles[0].get_text(), item['href'], item['href'], img[0]['src'].split('=')[1], img[0]['src'].split('=')[1])
        except:
            break

    items = soup.find_all(class_="link_txt")
    for item in items:
        tr_add += '''
                <tr>
                    <td >{0}</td>
                    <td colspan="2"><a href="{1}">{2}</a></td>
                </tr>'''.format(item.get_text(), item['href'], item['href'])

    end_tag = '''
            <tr><td colspan='3' align="center"> 이 글은 python script 을 이용하여 다음(www.daum.net) 메인 내용을 수집한 자료 입니다.  
                    <font color="red"><b>게시되는 내용은 python script 의 동작을 확인하는 용도 이외에는 아무 관련이 없습니다.</b></font>  
            </td></tr>
            </tbody>
            </table>
        '''
    return rValue + tr_add + end_tag


blog_name = "autoposting"
client_id = "be............................286e"
seckey = "be43b5c.........................................8983c7915"
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 = '이시간 뉴스 (다음) (feat Python 자동 글쓰기) '
    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 = "421872a45...........................................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 = 'be7ca2....................................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 ...')

이전 글에서도 적었듯이 내용중에 .................. 으로 표기된 부분은 개인적인 정보이기 때문에 본인의 정보를 찾아서 수정해야 한다.  

 

이번에는 다음(www.daum.net) 으로 접속을 하면 나오는 처음 페이지에서 뉴스 링크만 몇개 추출해 보는 기능을 구현했다. 이것으로 매일 아침 다음을 접속하지 않아도 뉴스를 스크래 해 볼 수 있다. 매일 처럼 저장해 두면 아마도 나중에는 필요한 뭔가가 될 까 ? 

그건 알 수 없는 일이지만... 아무튼...  네이버의 최신 영화 검색에서와 다른 건 아무래도 tag을 추출하는 방법이지 않을 까 하는 생각이 든다.

 

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

    tr_add = "";
    items = soup.find_all(class_="link_item")
    for item in items:
        try:
            img = item.find_all(class_="img_thumb")
            titles = item.find_all(class_="tit_item")
            tr_add += '''
                    <tr>
                        <td >{0}</td>
                        <td ><a href="{1}">{2}</a></td>
                        <td ><img src="{3}">{4}</td>
                    </tr>'''.format(titles[0].get_text(), item['href'], item['href'], img[0]['src'].split('=')[1], img[0]['src'].split('=')[1])
        except:
            break

    items = soup.find_all(class_="link_txt")
    for item in items:
        tr_add += '''
                <tr>
                    <td >{0}</td>
                    <td colspan="2"><a href="{1}">{2}</a></td>
                </tr>'''.format(item.get_text(), item['href'], item['href'])

요부분이 daum 에서 뉴스만 뽑아오는 tag 목록인데, 개발자도구로 열어보면 알 수 있는 내용이기는 하지만, 그것 찾는 것이 스크래핑을 하는 데, 가장 중요한 부분이 아닐까 싶다.

 

아직 알지 못하는 것은 daum 의 경우는 페이지에서 frame 으로 뉴스판을 변경하는 데, 그걸 받아오는 것을 아직 찾지 못했다. 언제가는 알 수 있는 날이 올 까 싶기는 하다.

 

그럼. 오늘도 이만~

 

 

반응형