저번 포스팅에서는 기사 제목과 내용을 스크롤링하는 것을 했는데, 이번에는 스크롤링 하려고 검색어을 입력받아 자동으로 스크롤링하는 것을 짜보겠습니다.

H사 웹 스크롤링

저번에 가져온 암호화 된 주소를 살펴보면 아래와 같은데, 여기서 검색어를 삽입해야합니다.

web6

def han_article():
    # 모듈 임포트
    import urllib.request
    from bs4 import BeautifulSoup
    import re
    import os

    # 검색어 입력
    search_text = input("검색어를 입력하세요 : ").encode("utf-8")
    search_text = str(search_text)[2:-1].replace('\\x', '%')

    ##상세 기사 url   
    url_list = []
    for i in range(30):
        list_url = "http://search.hani.co.kr/Search?command=query&keyword="+search_text+"&media=news&submedia=&sort=d&period=all&datefrom=2020.01.01&dateto=2020.03.22&pageseq="+str(i)

        url = urllib.request.Request(list_url)  # url 요청
        res = urllib.request.urlopen(url).read().decode("utf-8")  # utf 파일로 decoding

        soup = BeautifulSoup(res, "html.parser")  # 전체 html

        ##url_list에 url 전체 담기
        for link in soup.find_all('dt'):  # dt 태그에 해당하는 모든 부분
            for i in link:  # resultset를 태그로 만드는 작업 
                            #dt 태그 밑에 있는 a 태그를 가져오기 위해 for loop
                url_list.append(i.get('href'))  # 태그가 되어야 get, get_text()를 쓸 수 있다.

    ##상세 기사    
    full_article = []

    # url 하나씩 불러오기
    for i in range(len(url_list)):
        url = urllib.request.Request(url_list[i])
        res = urllib.request.urlopen(url).read().decode("utf-8")

        # print(res)  # 위의 두가지 작업을 거치면 
        # 위의 url 의 html 문서를 res 변수에 담을수 있게 된다.
        
        soup = BeautifulSoup(res, "html.parser")

        day = []
        article = []

        for link1, link2 in zip(soup.find_all('p', class_="date-time"), soup.find_all('div', class_="text")):
            day.append(link1.get_text())
            article.append(link2.get_text())

        for i, j in zip(day, article):
            full_article.append(i.strip())
            full_article.append(j.strip())

    f = open('han_article.txt', 'w', encoding='UTF-8')
    f.writelines(full_article)
    f.close()

han_article()

스크롤링이 잘되는 것을 확인 할 수 있는데, 여기서 특정 기간만 선택해서 스크롤링하고 싶다면 위 그림을 참고해서 수정하면 될 것 같네요.