Notice
Recent Posts
Recent Comments
Link
«   2025/03   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31
Tags
more
Archives
Today
Total
관리 메뉴

archive

웹크롤링 라이브러리 대강 정리하기 본문

Data/파이썬 데이터 처리

웹크롤링 라이브러리 대강 정리하기

안정민 2023. 7. 15. 14:57

1. request 라이브러리

-http 요청을 보낼 수 있는 기능을 제공하는 라이브러리

-서버로부터 응답을 요청하고 html 코드를 받을 수 있음

 

**html은 뭐고 url은 뭔데?

url은 주소 같은 거고

html은 그 주소의 콘텐츠를 결정짓는 태그로 이루어진 웹 텍스트파일

 

-request 모듈의 get() 함수는 응답 객체를 돌려줌

 이 안에 status_code도 있고 text, url, header 등 다양하게 존재하게 된다.

-request 모듈의 get() 함수를 통해 정보를 불러와 저장한 변수에 .(도트) 연산자를 이용해 요소를 불러올 수 있음

-page.text -> text 요소를 불러올 수 있음

import requests

page=requests.get("https://fhaktj8-18.tistory.com/")
type(page)

>>>
requests.models.Response
>>>

page.text

>>>
'<!DOCTYPE html>\n<html lang="ko">\n  <head>\n<link rel="stylesheet" type="text/css" href="https://t1.daumcdn.net/tistory_admin/lib/lightbox/css/lightbox.min.css" /><link rel="stylesheet" type="text/css" href="https://t1.daumcdn.net/tistory_admin/assets/blog/tistory-36f15cbcc77ea9489633a58757c4bb5d194ab57e/blogs/style/content/font.css?_version_=tistory-36f15cbcc77ea9489633a58757c4bb5d194ab57e" /><link rel="stylesheet" type="text/css" href="https://t1.daumcdn.net/tistory_admin/assets/blog/tistory-36f15cbcc77ea9489633a58757c4bb5d194ab57e/blogs/style/content/content.css?_version_=tistory-36f15cbcc77ea9489633a58757c4bb5d194ab57e" /><!--[if lt IE 9]><script src="https://t1.daumcdn.net/tistory_admin/lib/jquery/jquery-1.12.4.min.js">
...
>>>

 

2. BeautifulSoup

- 웹페이지의 정보를 알아볼 수 있도록 파이썬 용어로 바꿔줘서 쉽게 스크랩을 할 수 있는 기능을 제공하는 라이브러리

-html.parser을 이용해서 파싱을 하게 되면, 파이썬인터프리터가 해석할 수 있는 구조로 html을 만들어줌

# 모든 <li> 태그 선택하기, 괄호 안에 CSS 선택자를 넣으면 특정 HTML 태그만 선택
li_tags = soup.select('li')

# 결과 출력, 리스트로 출력됨
print(li_tags)
>>>
[<li>web crawling</li>, <li>requests</li>, <li>BeautifulSoup</li>]
>>>

# 첫 번째 <li> 태그의 텍스트 출력하기, 해당 태그 안에 있는 텍스트만 추출
print(li_tags[0].text)
>>>
web crawling
>>>

-select 함수를 활용해서 태그 안에 있는 텍스트를 추출하는 코드는 데이터 분석할 때 유용하게 활용된다

-특정 태그의 텍스트를 모두 가져온 리스트를 만들고 싶다면 for 반복문을 활용하면 간단히 해결된다

# 빈 리스트 만들기
study_names = []

# 텍스트 추출해서 리스트에 담기
for li in li_tags:
    study_names.append(li.text)

# 결과 출력
print(study_names)

>>>
['web crawling', 'requests', 'BeautifulSoup']

예제

-영화 제목을 가지고 오려면

import requests
from bs4 import BeautifulSoup

movie_name = []
response4=requests.get("https://www.imdb.com/chart/top/?ref_=nv_mv_250")
soup4=BeautifulSoup(response4.text, "html.parser")

movie_tags=soup4.select('div.lister>table.chart.full-width>tbody.lister-list>tr>td.titleColumn>a')

for i in range(len(movie_tags)):
    movie_name.append(movie_tags[i].text)
print(movie_name)

# for index, element in enumerate(movie_tags, 1):
    # print("{} 위 영화: {}".format(index, element.text))

 

 


 

위에까지는 예제였고

 

드디어 나도 내 연구를 위한 파싱과 크롤링의 첫 단추를 끼워봄

import requests
from bs4 import BeautifulSoup


url = "https://www.donga.com/news/search?query=IMF&sorting=1&check_news=91&search_date=5&v1=19971201&v2=19980131&more=1"
response = requests.get(url)

# HTML 파싱
soup = BeautifulSoup(response.text, 'html.parser')

# URL 추출
urls = []
cards = soup.select('div#dongawrap>div.search_wrap>div#container>div#content>div.sch_cont>div.schcont_wrap>div.result_cont>div.articleList.article_list>div.rightList>span.tit>a')
for card in cards:
    url = card['href']
    urls.append(url)

for url in urls:
    print(url)

그리고 감격스럽게 추출된 url들

여기에 힘입어서 이 url들을 다시 받아서 기사 본문까지 추출해봤음

url = "https://www.donga.com/news/search?query=IMF&sorting=1&check_news=91&search_date=5&v1=19971201&v2=19980131&more=1"
response = requests.get(url)

# HTML 파싱
soup = BeautifulSoup(response.text, 'html.parser')

# URL 추출
urls = []
cards = soup.select('div#dongawrap>div.search_wrap>div#container>div#content>div.sch_cont>div.schcont_wrap>div.result_cont>div.articleList.article_list>div.rightList>span.tit>a')
for card in cards:
    url = card['href']
    urls.append(url)

for url in urls:
    print(url)
    
#####################
# 전체 단어 빈도를 저장할 Counter 객체
total_word_counts = Counter()

for i in urls:
    this_url = urls[i]
    response = requests.get(this_url)

    # HTML 파싱
    soup = BeautifulSoup(response.text, 'html.parser')

    article_body = soup.select_one('div#dongawrap div#view.open_view div#content div.scroll_start01 div.scroll_start01_in div.article_view div#article_txt.article_txt').get_text(strip=True)

    print(article_body)

근데 동아일보 html 특성인지는 모르겠는데 (일단 중앙일보는 안 그랬음) 본문이 들어간 html 구조 끝 부분이 

이래가지고 도대체 저 (text)만 출력하려면 어떻게 해야되는지 도당체 모르겠음 일단 이건 미해결로 남긴 채 크롤링 코드 만들기 99프로 성공...!