티스토리 뷰
저번 포스팅에서는 크롬 개발자 도구를 활용해 우리가 스크랩핑 할 부분의 태그를 확인했고, 필요한 모듈을 불러오기까지 했습니다.
지난 포스팅들을 보려면 위의 링크를 확인해주세요.
의사 코드(pseudo code) 작성하기
의사 코드(수도 코드)는 실제 프로그래밍언어로 구성된 것이 아니라 일반적인 언어로 코드를 흉내내서 알고리즘을 써 넣은 코드입니다. 일단 코드가 어떻게 구성될지 미리 생각해보고 작성하는 것이 더 효율적이겠죠? 항상 미리 의사코드를 작성한 후에 그에 맞게 코드를 작성해보시는 것을 추천드립니다.
일단 rss를 통해 링크를 가져온 후 다시 링크에 접속해서 기사의 내용을 가져오는 것이 우리의 목표입니다. 그래서 크롤러 함수를 한 개 만들어서 rss에서 링크도 가져오고, 기사에서 본문도 가져와보도록 하겠습니다.
#의사 코드 예시
크롤러 함수
리퀘스트를 통해 페이지를 가져온다
가져온 페이지를 뷰티풀소프 & 파서로 페이지를 코드내에서 활용가능하게 만듬
태그 or css셀렉터를 통해서 필요한 부분 추출(rss는 링크주소, 기사는 본문)
함수는 이런식으로 구성됩니다. 함수로 만들려는 이유는 url, 태그 or css 셀렉터, 파서 빼고는 나머지 과정이 다 동일하다고 느껴서입니다.
의사코드에 맞게 코드 작성하기
우선 모듈들 밑에 rsss라는 리스트를 만들도록 하겠습니다.
# 기사의 링크들이 담기는 리스트입니다. rsss = []
주석에 적힌대로 크롤러 함수에서 링크를 뽑아서 저 리스트에 모두 담게됩니다. 그리고 함수의 이름은 crawler라 짓고, 파라미터는 url과 파서, 셀렉터를 받도록 하겠습니다.
def crawler(url, parser, css_selector): ...
이제 함수 안을 채워보도록 하겠습니다.
r = requests.get(url) soup = BeautifulSoup(r.content, parser)
파라미터를 통해 받은 url을 활용해서 페이지를 가져옵니다. 파서부분은 xml을 가져올땐 'xml'이 되고, html 부분을 가져올 땐 'lxml'이 됩니다.
datas = soup.select(css_selector) if parser == "lxml": print(datas[0].text) else: for data in datas: rsss.append(data.text)
셀렉터를 통해 필요한 부분을 추출해내고, 만약 파서를 'lxml'을 사용했다면(기사링크일 경우 'lxml 사용') 본문의 텍스트를 보여주게 되고, 다른 파서를 사용(rss는 'xml'파서 사용)할 경우 rsss에 해당 부분을 담습니다.
실행코드 작성하기
crawler('http://rss.joins.com/joins_news_list.xml', 'xml', 'item link') #rsss에 기사 링크들이 담기게 됩니다.
우선은 링크들을 추출했습니다. 추출한 링크들을 반복문을 통해서 기사 본문을 추출하면 끝이겠죠?
for link in rsss: try: crawler(link, 'lxml', '#article_body') print("="*20) except Exception as e: print(e) print('Continuing ...') continue
기사링크들이 많을 경우 크롤러가 돌아다니다가 예상치 못한 오류가 발생할 수도 있다고 생각해서, 예외처리를 해주었습니다. 스크래핑 생각보다 어렵지 않죠?
공감은 제작자에게 큰 힘이 됩니다.
'Backend-dev > python' 카테고리의 다른 글
장고의 MVT 패턴 (0) | 2018.10.07 |
---|---|
장고를 배울 때 좋은 튜토리얼들 (0) | 2018.10.04 |
파이썬을 활용한 뉴스 스크래핑 2 (0) | 2018.04.26 |
파이썬을 활용한 뉴스 스크래핑 (0) | 2018.04.23 |
파이썬 인터프리터를 활용한 단어 테스트기 만들기 2 (1) | 2018.04.21 |