In [1]:
#네이버 중고나라(모바일)
import requests
from bs4 import BeautifulSoup
In [2]:
# "맥북" 키워드로 검색
url = "http://m.cafe.naver.com/ArticleSearchList.nhn?search.query=맥북&search.menuid=&search.searchBy=0&search.sortBy=sim&search.clubid=10050146"
In [3]:
response = requests.get(url)
In [4]:
response.status_code, response
Out[4]:
In [5]:
dom = BeautifulSoup(response.text, "html.parser")
In [6]:
post_elements = dom.select("ul.list_tit li")
In [7]:
len(post_elements)
Out[7]:
In [8]:
post_element = post_elements[0]
In [9]:
post_element
Out[9]:
In [10]:
# Celery - Task Runner
# http://www.celeryproject.org/
# 파이썬의 일처리를 자동으로 해주는 테스크 언어. 조금 더 모듈화해서
In [11]:
title = post_element.select_one("h3").text
url = post_element.select_one("a").get("href") #href는 속성
nickname = post_element.select_one("span.name").text
created_at = post_element.select_one("span.time").text
count = post_element.select_one("span.no").text.split(" ")[-1]
print((title, url, nickname, created_at, count))
In [12]:
post_element.contents
#어떤 값들이 들어있는지 보여준다.
Out[12]:
In [13]:
for post_element in post_elements:
title = post_element.select_one("h3").text
url = post_element.select_one("a").get("href")
nickname = post_element.select_one("span.name").text
created_at = post_element.select_one("span.time").text
count = post_element.select_one("span.no").text.split(" ")[-1]
print((title, url, nickname, created_at, count))
In [14]:
url
Out[14]:
In [15]:
# "".join(url.split("?")).split("&") => 따로 빼서 사용할 수 있다.
In [32]:
url = "http://m.cafe.naver.com/ArticleRead.nhn?clubid=10050146&menuid=334&articleid=332341835&query=맥북"
In [33]:
# 상세 페이지 크롤링
response = requests.get(url)
dom = BeautifulSoup(response.text, "html.parser")
In [35]:
# 1. 핸드폰 번호 파싱 ( 정규표현식 이용 )
# 2. 첫 이미지의 url 가져오기
# 일단은 content 의 html 코드를 그대로 뽑아 와야 한다.
content_element = dom.select_one("#postContent")
# str(content_element) => 이걸로 html을 뽑아낼 수 있다.
# content_element.text => 이걸로 tag가 제외된 글자만을 뽑아낼 수 있다. (핸드폰 번호)
In [36]:
content_element.text
Out[36]:
In [37]:
import re
In [38]:
# pattern = re.compile("[0-9영공일이삼사오육칠팔구O]{3}[-. ]+[0-9영공일이삼사오육칠팔구O]")
pattern = re.compile("".join([
"[0-9공영일이삼사오육칠팔구O]{3}", # 앞 숫자 3자리 ( 010 )
"[-. ]+", # 앞 3자리와 중간 4자리를 연결하는 애
"[0-9공영일이삼사오육칠팔구O]{4}", # 중간 숫자 4자리
"[-. ]+",
"[0-9공영일이삼사오육칠팔구O]{4}",
]))
pattern.findall(content_element.text)
Out[38]:
In [41]:
def preprocess(phonenumber):
return phonenumber
In [39]:
from IPython.display import Image
In [40]:
content_element = dom.select_one("#postContent")
In [41]:
image_elements = content_element.select("img")
In [42]:
len(image_elements)
Out[42]:
In [46]:
image_elements[1].get('src')
Out[46]:
In [53]:
image_url = image_elements[3].get('src') #인덱스 바꾸면서 url 계속 입력하면서 확인
image_url
Out[53]:
In [58]:
# image_url = "".join(image_url.split("?")[:-1])
print(image_url)
#iPython에서 이렇게 제거하면 할 수 있는 방법은 없다.
In [54]:
image_url
Out[54]:
In [55]:
from IPython.display import IFrame
In [56]:
IFrame(image_url, width=300, height=200)
Out[56]:
In [1]:
#이번에는 각자 주피터 노트북으로. 왜냐하면 selenium으로 할 것임
# coding: utf-8
from selenium import webdriver
In [2]:
driver = webdriver.Firefox()
In [3]:
driver.get("http://cafe.naver.com/joonggonara")
In [4]:
# "맥북" 이라는 키워드로 검색 ( * ) => find_ele.., send_keys, click
# 검색 결과로 나오는 게시글 크롤링
In [5]:
# 1. 검색창 element
# 2. send_keys("맥북")
# 3. 검색 버튼 element
# 4. click()
In [6]:
search_form_element = driver.find_element_by_css_selector("#topLayerQueryInput")
search_form_element.send_keys("맥북")
In [7]:
# 할 수 있는 훨씬 쉬운 방법들이 있습니다. 이따 javascript 통해서 할 예정입니다.
In [8]:
search_button_element = driver.find_element_by_css_selector(".btn-search-green")
search_button_element.click()
In [10]:
post_elements = driver.find_elements_by_css_selector("td.board-list")
In [11]:
len(post_elements)
Out[11]:
In [13]:
#실제로는 있는데, 0이라고 나옴. 눈으로는 보이는데
#왜 그러냐면 특이하게 동작함. 이중 구조. 이중 Frame 형태이기 때문
#네이버는 꽤 많은 IFrame을 쓰고 있음
In [14]:
iframe_element = driver.find_element_by_css_selector("#cafe_main")
In [15]:
driver.switch_to_frame(iframe_element) # 내부적으로는 focus가 옮겨진거.
In [16]:
post_elements = driver.find_elements_by_css_selector("td.board-list")
In [17]:
len(post_elements)
#관공서 사이트가 대부분 이런 형태로 되어 있음
Out[17]:
In [18]:
post_element = post_elements[0]
In [19]:
post_element
Out[19]:
In [20]:
title = post_element.find_element_by_css_selector("a").text
url = post_element.find_element_by_css_selector("a").get_attribute("href")
print(title)
print(url)
In [21]:
for post_element in post_elements:
title = post_element.find_element_by_css_selector("a").text
url = post_element.find_element_by_css_selector("a").get_attribute("href")
print(title)
print(url)
In [22]:
# 정적인 ( HTML )
# 동적인 ( API; json, xml )
# 동적인 ( Selenium )
# + 한국형 웹사이트
# - selenium iFrame
# - selenium javascript
In [23]:
#http://kcia.or.kr/cid/Document/020.Ingredient_shis/INGREDIENT_SHIS_10L.asp
#화장품 성분명 사이트 실습.
In [41]:
driver = webdriver.Firefox()
In [42]:
driver.get("http://kcia.or.kr/cid/Document/020.Ingredient_shis/INGREDIENT_SHIS_10L.asp")
In [43]:
driver.execute_script('fGoPage(1)')
In [44]:
for page in range(1, 100+1):
driver.execute_script("fGoPage({page})".format(page=page))
In [45]:
driver = webdriver.Firefox()
In [46]:
driver.get("http://fastcampus.co.kr")
In [47]:
driver.execute_script("alert('무료 수강권 이벤트에 당첨되었습니다.')")
Out[47]: