본문 바로가기
인공지능/PYTHON

크롤링 (2)

by bibibig_data 2021. 6. 25.

1. 프렌즈 드라마 분석

# 드라마 텍스트 가공  (Do it 파이썬 생활프로그래밍) 초판 2020: 52페이지
# friends.txt를 다운받아서 같은 폴더에 넣은 다음 프로그램을 실행합니다. 
import os, re, codecs
#자신의 저장경로를 입력해야 합니다. 
os.chdir(r'D:/pythonclass')
f = open('friends101.txt', 'r', encoding = 'utf-8')
script101 = f.read()

# 문자열 객체 슬라이싱

print(script101[:100])

Line = re.findall(r'Monica:.+', script101)
#리스트 요소 중 앞에서 3개까지만 출력
print(Line[:3])
# 모니카의 대사만 모으기 
Line = re.findall(r'Monica:.+', script101)

# monica.txt 파일 만들기
f = open('monica.txt', 'w', encoding = 'utf-8')
monica = ''
for i in Line:
	monica += i +'\n'
f.write(monica)
# 파일 닫기 
f.close()	

# 모니카의 대사만 출력해보기
for item in Line[:3]:
    print(item)

# 등장인물 이름 모으기 
print(re.findall(r'[A-Z][a-z]+: ', script101) )

# 중복 지우기
print(set(re.findall(r'[A-Z][a-z]+: ', script101)))

# 캐릭터 이름 한 줄로 출력하기
character = [x[:-2] for x in list(set(re.findall(r'[A-Z][a-z]+: ',script101)))]
character

# 캐릭터 이름 각각 출력하기 
for i in character:
    print(i)

# 지문만 출력하기
re.findall(r'\([A-Za-z].+[a-z|\.]\)', script101, re.VERBOSE) [:6]
f = open('friends101.txt','r')
sentences = f.readlines()
# 20개만 출력해보기
for i in sentences[:20]:			## 먼저 문장 20개만 가져와 실험해 보겠습니다
    if re.match(r'[A-Z][a-z]+:', i): 	## match 문으로 문장 맨 앞에서 패턴을 찾습니다 
        print(i)

# would가 나오는 문장만 추출하기 
would = [ i for i in sentences if re.match(r'[A-Z][a-z]+:', i) and re.search('would', i)]
# take가 들어간 문장만 추출하기 
take = [ i for i in sentences if re.match(r'[A-Z][a-z]+:', i) and re.search(' take',i)]
# take가 들어간 문장 출력하기
for i in take:
	print(i)
 
# would가 들어간 문장 파일로 만들기 
newf = open('would.txt','w')	
newf.writelines(would)		

 


 

2. 크롤링 실습 2

http://quotes.toscrape.com/

import requests
from bs4 import BeautifulSoup
from pprint import pprint as pp

resp = requests.get('http://quotes.toscrape.com/')
resp.headers['Server']
pp(resp.text)

soup = BeautifulSoup(resp.text, 'html.parser')  # 적절한 parser 설정

type(soup)
help(soup)
dir(soup)

#
# Navigating the tree
#

soup
soup.name

type(soup.title)
help(soup.title)
dir(soup.title)

soup.title
soup.title.string
soup.title.text

type(soup.title.string)
help(soup.title.string)
dir(soup.title.string)
type(soup.title.text)

type(soup.title.parent.name)
soup.title.parent.name

soup.div              # 처음 만나는 div 태그
soup.div['class']     # class 속성의 값
soup.div.span.string  # NavigableString 타입
soup.div.span.text    # str 타입

soup.span
soup.span.text

soup.find('div')
soup.find('div').find('span')
soup.find('div').find('span').text
# soup.select_one('div')
# soup.select_one('div > span')
# soup.select_one('div > span').text

soup.find('span')
soup.find('span').text
# soup.select_one('span')
# soup.select_one('span').text

soup.find_all('div', class_='quote')
# soup.select('div.quote')

ret = soup.find_all('div', class_='quote')

# type(ret)
# len(ret)
# 
# ret[0]
# 
# for i in range(len(ret)):
#     pp(ret[i])
# 
# ret[0].find_all('span')
# ret[0].find_all('span')[0]
# ret[0].find_all('span')[1]
# ret[0].find_all('span')[1].find('small')
# ret[0].find_all('span')[1].find('small').text
# 
# ret[0].find_all('a')
# ret[0].find_all('a')[0]
# ret[0].find_all('a')[0]['href']
# 
# for i in range(len(ret)):
#     pp(ret[i].find_all('span')[0].text)
#     pp(ret[i].find_all('span')[1].find('small').text)
#     pp('http://quotes.toscrape.com/' + ret[i].find_all('a')[0]['href'])

list_ = []

for i in range(len(ret)):
    inner_list = []
    quote_ = (ret[i].find_all('span')[0].text)
    by_ = (ret[i].find_all('span')[1].find('small').text)
    link_ = 'http://quotes.toscrape.com/' + ret[i].find_all('a')[0]['href']
    inner_list.append(quote_)
    inner_list.append(by_)
    inner_list.append(link_)
    list_.append(inner_list)

list_

 


 

3. 크롤링 실습 3

https://book.coalastudy.com/data-crawling/week-1

 

https://www.crummy.com/software/BeautifulSoup/bs4/doc/

from bs4 import BeautifulSoup
soup = BeautifulSoup(open(r"C:\dev\atomworkspace\shopping\shopping.html",'r',encoding="utf-8"), 'html.parser')

# 1. 품명에 해당하는 HTML 요소의 선택자를 찾아보세요.
soup.select('.title')
# + 품명만 출력해보세요.
for title in soup.select('.title'):
    print(title.string)

[title.string for title in soup.select('.title')]

# 2. 물품 이미지에 해당하는 HTML 요소의 선택자를 찾아보세요.
soup.select('img')

# 3. 물품 HTML 요소의 자식들 중 상품평에 도달하는 선택자 경로를 만들어 보세요.
soup.select('div.metadata > span.comments')

# 4. 전체 물품 리스트 HTML 요소의 자손들 중 품명, 가격, 상품평 등 모든 정보를 
#    하나하나 가져올 수 있도록 선택자 경로를 만들어 보세요.
soup.select("#items-section span")

# 물품 이미지에 해당하는 HTML 요소
# 물품 정보 HTML 요소의 자식들 중 상품평에 해당하는 HTML요소
# 전체 물품 리스트 HTML 요소의 자손들 중 품명, 가격, 상품평 등의 데이터를 

html 파일은 shopping.html

 


 

4. 크롤링 실습 4 - 확인학습

# https://www.w3schools.com/cssref/css_selectors.asp

from bs4 import BeautifulSoup
soup = BeautifulSoup(open(r"C:\dev\atomworkspace\shopping\shopping.html",'r',encoding="utf-8"), 'html.parser')
html_doc = """
<html><head><title>The Dormouse's story</title></head>
<body>
<p class="title"><b>The Dormouse's story</b></p>

<a href="http://www.naver.com" class="portal" id="naver">Elsie</a>,
  
<p class="story">Once upon a time there were three little sisters; and their names were
  <a href="http://example.com/elsie" class="sister" id="link1">Elsie</a>,
  <a href="http://example.com/lacie" class="sister" id="link2">Lacie</a> and
  <a href="http://example.com/tillie" class="sister" id="link3">Tillie</a>;
  and they lived at the bottom of a well.
</p>

<p class="story sister">...</p>
"""

soup = BeautifulSoup(html_doc, 'html.parser')

soup.select('.title')
soup.select('.story.sister')
soup.select('.story .sister')
soup.select('#link2')
soup.select('*')
soup.select('p')
soup.select('p.story')
soup.select('title, a')
soup.select('body a')
soup.select('body > a')


html_doc = """
<!DOCTYPE html>
<html>
<head>
</head>
<body>

<h1>Welcome to My Homepage</h1>

<div>
  <h2>My name is Donald</h2>
  <p>I live in Duckburg.</p>
</div>

<p nemam='stmt'>My best friend is Mickey.</p>
<p nemam='stmt'>I will not be styled.</p>

<a href="https://www.w3schools.com" target="_blank">w3schools.com</a>

<div>
  <p lang="en">Hello!</p>
  <p lang="enus">Hi!</p>
  <p lang="en-gb">Ello!</p>
  <p lang="us">Hi!</p>
  <p lang="no">Hei!</p>
</div>
 
<p>비켜주세요</p>
  
</body>
</html>
"""

soup = BeautifulSoup(html_doc, 'html.parser')

soup.select("div + p")
soup.select("div ~ p")
soup.select('a[target]')
soup.select('a[target="_blank"]')
soup.select('[nemam~=stmt]')
soup.select('[lang|=en]')
soup.select('[lang^=en]')
soup.select('[lang$=us]')
soup.select('[lang*=us]')

soup.select('p:nth-of-type(2)')

 


 

 

5. 크롤링 실습 5 - 네이버 크롤링

---------------------------------
> 네이버 실시간 검색어 크롤링   <
---------------------------------

* 다음 실시간 검색어 서비스는 2020년 2월 서비스 중지됨

* 변경된 네이버 실검 방식에 맞는 크롤링
  - 네이버 JSON 주소 찾기 : https://wikidocs.net/68005

 

import requests
from bs4 import BeautifulSoup

json = requests.get('https://www.naver.com/srchrank?frm=main').json()
json

# json 데이터에서 "data" 항목의 값을 추출
ranks = json.get("data")
ranks

# 해당 값은 리스트 형태로 제공되기에 리스트만큼 반복
for r in ranks:
    # 각 데이터는 rank, keyword, keyword_synomyms
    rank = r.get("rank")
    keyword = r.get("keyword")
    print(rank, keyword)

 


---------------------
> 네이트판 크롤링   <
---------------------

import requests
from bs4 import BeautifulSoup

resp = requests.get('https://pann.nate.com/')
soup = BeautifulSoup(resp.text, 'html.parser')

# result = soup.select("#container > div.content.main > div.post-wrap > div.bestTalkBox > div:nth-child(2) > ol")
result = soup.select('div.bestTalkBox > div:nth-child(2) > ol')
                       
type(result)

for i in result:
    print(i.text)

'인공지능 > PYTHON' 카테고리의 다른 글

크롤링  (0) 2021.06.25
Do it ! - Python (1)  (0) 2021.06.25
Crawling and Flask (2)  (0) 2021.06.25
셀레늄  (0) 2021.06.25
Crawling and Flask  (0) 2021.06.24