딴게 게시판에서 어느분이 기존 코드 웹 크라울링 코드를 수정해 달라고 글을 올리셨다.
쪽지와 메일이 오가면서 소스를 받고 필요하신 사항을 정리한 후에 수정을해서 드렸다
예전에 자바에서 html 태그 파싱해서 사용한적이 있는데
확실히 파이썬이 그 보다는 수월하게 구현되는것 같다.(파이썬 만세)
간략히 내용을 정리 하자면
먼저 태그 파싱을 위해서 BeautifulSoup 이라는 라이브러리를 사용한다.
아래와 같은 코드로 특정 url의 내용르 받아서 BeautifulSoup 객체로 받아낸다.
soup = BeautifulSoup(source_code_from_URL, 'html.parser', from_encoding='UTF-8')
특정 사이트의 게시판 같은 곳에서 검색한 결과에 대한 글 전체를 가지고 오도록 하는 내용인데 아래와 같이 구현해서 검색 결과에서 글 링크들을 전부 가져 오도록 하고 있다.
(이 부분은 원 제작자분이 구현해 놓으신 부분이다.)
for title in soup.find_all('div', 'table-row'): title_link = title.select('a') article_URL = title_link[0]['href'] get_text(article_URL, output_file)
저렇게 가지고 온 링크들을 다시 get_text함수에 넘겨서 내용을 가지고 오도록 하고 있다.
아래가 get_text함수이다.(이것도 원 제작자분이 만드신걸 일부 수정했다.)
def get_text(URL, output_file): URL = "http://www.kindernews.net" + URL source_code_from_url = urllib.request.urlopen(URL) soup = BeautifulSoup(source_code_from_url, 'html.parser', from_encoding='UTF-8') title = soup.find('div', "article-head-title") news_date = soup.find("meta", property="article:published_time") content_of_article = soup.find_all('p') output_file.write(str(title)+"\n") output_file.write(str(news_date)+"\n") for item in content_of_article: string_item = str(item) output_file.write(string_item+"\n") output_file.write("\n")
soup.find나 soup.find_all부분이 흥미로웠다.
div tag나 meta tag나 어떤 형태든 가지고 올 수 있었다.
soup.find('p') 부분의 경우 가지고 와야 할 글이 모두 <p> 태그로 감싸져 있어서 저렇게 구현했다.
요즘 관리일 좀 소홀이 하면서 소소히 계속 개발을 들여다 보고 있는데, 역시 난 관리보다 개발이 적성이 더 맞는건가 싶기도 하고...
그런데 왜 C#은 그렇게 눈에 안들어 오는지...ㅠㅠ