티스토리 뷰

저번 포스팅에서는 크롬 개발자 도구를 활용해 우리가 스크랩핑 할 부분의 태그를 확인했고, 필요한 모듈을 불러오기까지 했습니다.



지난 포스팅들을 보려면 위의 링크를 확인해주세요.

의사 코드(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


기사링크들이 많을 경우 크롤러가 돌아다니다가 예상치 못한 오류가 발생할 수도 있다고 생각해서, 예외처리를 해주었습니다. 스크래핑 생각보다 어렵지 않죠?




공감은 제작자에게 큰 힘이 됩니다.


댓글