인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

인프런 커뮤니티 질문&답변

leo41572님의 프로필 이미지
leo41572

작성한 질문수

[리뉴얼] 파이썬입문과 크롤링기초 부트캠프 [파이썬, 웹, 데이터 이해 기본까지] (업데이트)

실전 크롤링과 강력한 크롤링 기술 팁3: 게시판 크롤링

작성

·

404

0

seek 사이트 게시판중 1~5페이지의 내용을 크롤링 하는 내용인데 수업의 내용과 markup 내용이 바뀌어 크롤링이 안되는것 같습니다. 

제가 작성한 코드는 위와 같은데 크롤링을 위해서 어떻게 수정하면 좋을까요? ㅠㅠ

답변 2

1

안녕하세요. 실제 데이터의 크롤링 예를 보여드리기 위해, 강의 내에서 여러 사이트의 크롤링 예제를 보여드렸는데요.

그러다보니, 부득이 해당 사이트가 업데이트되면서, 크롤링 코드가 정상적으로 동작하지 않는 경우가 발생할 수 있어서요.

이런 부분들은 이해를 우선 부탁드리구요. 가능한 강의의 설명을 기반으로 제공해드린 코드를 참고하셔서, 직접 수정해보신다면 좀더 크롤링 기술을 이해하고, 좋은 연습이 될 수도 있는데요.

우선 다른 수강생분께서 작성하신 코드에, 제가 일부 수정을 한 코드를 공유드립니다. 그리고 추후에 공지로도 송부드리겠습니다. 감사합니다.

--------------------

import requests

from bs4 import BeautifulSoup

from urllib.request import urlopen

res = requests.get('https://seeko.earlyadopter.co.kr/bbs/board.php?bo_table=mainnews')

soup = BeautifulSoup(res.content, 'html.parser')

data = soup.findAll('a', 'item-subject')

data

for item in data:

    print(item.get_text().replace('\t', '').replace('\n', ''))

0

안녕하세요. 추가로 보다 개선된 코드를 작성하였으며, 새공지로도 공유드렸으니 참고하시면 좋을 것 같습니다. 감사합니다.

최근에 seeko 사이트 페이지가 변경되어, 크롤링 코드를 궁금해하시는 수강생분이 계셔서 간략히 공유드립니다.

강좌에서 가능한 실제 크롤링 예제를 보여드리기 위해, 다양한 실제 사이트를 크롤링하는 코드를 설명드렸는데요. 그러다보니, 실제 사이트의 페이지가 변경이 되어, 크롤링 코드가 정상 동작하지 않는 경우가 있을 수 있습니다.

본 강좌의 목적은 특정 실제 사이트를 크롤링하는 것이 아니라, 크롤링 기술을 익히며, 파이썬과 데이터 수집 기술, 더 나이가 업무 자동화 기술을 익히시는 것이라서요. 만약, 특정 사이트 페이지가 변경되었을 경우에는 강좌에서 익힌 기술을 기반으로 직접 코드를 바꿔보려 노력해보시면 훨씬 도움이 되실 것인데요. 다만, 그래도 실제 변경된 페이지에 대해, 수정된 크롤링 코드를 궁금해하실 수 있어서요. 변경된 seeko 사이트 페이지 크롤링 코드에 대해 참고로 공유드립니다.

우선, 해당 페이지를 크롤링 예제로 보여드린 것은, 크롤링 기술을 선명하게 이해할 수 있기 때문이었는데요. 아쉽게도 변경된 페이지는 크롤링 난이도가 급격히 올라갔습니다. 고급 정규표현식을 잘 이해해야 깔끔하게 크롤링이 가능해서요. 정규표현식도 난이도가 높은 항목을 이해하고 있어야 해서, 해당 부분은 중급단계 강좌인 몽고DB 데이터베이스 강좌 (NoSQL/DB(몽고DB)기초와 파이썬활용 [최신 풀스택/데이터과학 첫걸음]) 에서 설명을 드렸는데요. 해당 표현식은 많이 쓰이지는 않는데, 부득이 변경된 seeko 페이지에서는 사용이 되어서, 다음과 같이 해당 사항을 활용하여 작성을 하였습니다. 

1. 타이틀을 포함하고 있는 a 태그 내에 span, b 태그로 묶여서 타이틀 외의 부가적인 정보가 나오는 부분이 있어서, 해당 부분을 삭제하기 위해

    1.1 추출된 정보를 문자열로 변환한 후, 우선 \n 를 제거

    1.2 span과 b 태그로 묶여진 타이틀 외 부가적 정보를 삭제하기 위해  <span.*?>.*?</span> 와 <b>.*?</b> 정규표현식으로 해당 정보 삭제

    1.3 남겨진 일부 태그를 <.*?> 정규표현식으로 삭제

    1.4 남은 문자열에 있는 탭(\t)을 모두 제거

위와 같은 전략으로, 다음과 같이 작성을 하였습니다. 이 때, .*? 표현식이 바로 중급강좌에서 설명한 Non-Greedy 라고 하는 정규표현식인데요. 해당 부분은 공지로 설명하기는 무리가 있고, 입문 단계에는 필요한 내용은 아니라서, 가이드해드린 강좌를 참고하시거나, Non-Greedy 정규표현식으로 검색을 통해 참고하셔도 좋을 것 같으며, 이 부분은 양해를 부탁드립니다.

다음과 같이 최종 코드를 작성하였고, 아무쪼록 다음 코드가 도움이 되셨으면 좋겠습니다. 감사합니다.

import requests
from bs4 import BeautifulSoup
import re

res = requests.get('https://seeko.earlyadopter.co.kr/bbs/board.php?bo_table=mainnews')
soup = BeautifulSoup(res.content, 'html.parser')
data = soup.findAll('a', 'item-subject')
for item in data:
    item_extract = str(item).replace('\n', '')
    item_extract = re.sub('<span.*?>.*?</span>', '', item_extract)
    item_extract = re.sub('<b>.*?</b>', '', item_extract)    
    item_extract = re.sub('<.*?>', '', item_extract)        
    item_extract = item_extract.replace('\t', '')
    print (item_extract)
leo41572님의 프로필 이미지
leo41572

작성한 질문수

질문하기