<SYSTEM_TASK:>
Given the following text description, write Python code to implement the functionality described below step by step
<END_TASK>
<USER_TASK:>
Description:
 1T_크롤링 수업(중고나라 모바일)
Step1:  이미지 가져오기
Step2:  https
<ASSISTANT_TASK:>
Python Code:
#네이버 중고나라(모바일)
import requests
from bs4 import BeautifulSoup
# "맥북" 키워드로 검색
url = "http://m.cafe.naver.com/ArticleSearchList.nhn?search.query=맥북&search.menuid=&search.searchBy=0&search.sortBy=sim&search.clubid=10050146"
response = requests.get(url)
response.status_code, response
dom = BeautifulSoup(response.text, "html.parser")
post_elements = dom.select("ul.list_tit li")
len(post_elements)
post_element = post_elements[0]
post_element
# Celery - Task Runner
# http://www.celeryproject.org/
# 파이썬의 일처리를 자동으로 해주는 테스크 언어. 조금 더 모듈화해서
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))
post_element.contents
#어떤 값들이 들어있는지 보여준다.
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))
url
# "".join(url.split("?")).split("&")   => 따로 빼서 사용할 수 있다.
url = "http://m.cafe.naver.com/ArticleRead.nhn?clubid=10050146&menuid=334&articleid=332341835&query=맥북"
# 상세 페이지 크롤링
response = requests.get(url)
dom = BeautifulSoup(response.text, "html.parser")
# 1. 핸드폰 번호 파싱 ( 정규표현식 이용 )
# 2. 첫 이미지의 url 가져오기
# 일단은 content 의 html 코드를 그대로 뽑아 와야 한다.
content_element = dom.select_one("#postContent")
# str(content_element) => 이걸로 html을 뽑아낼 수 있다.
# content_element.text => 이걸로 tag가 제외된 글자만을 뽑아낼 수 있다. (핸드폰 번호)
content_element.text
import re
# 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)
def preprocess(phonenumber):
    return phonenumber
Explanation: 1T_크롤링 수업(중고나라 모바일)
End of explanation
from IPython.display import Image
content_element = dom.select_one("#postContent")
image_elements = content_element.select("img")
len(image_elements)
image_elements[1].get('src')
image_url = image_elements[3].get('src')   #인덱스 바꾸면서 url 계속 입력하면서 확인
image_url
# image_url = "".join(image_url.split("?")[:-1])
print(image_url)
#iPython에서 이렇게 제거하면 할 수 있는 방법은 없다.
image_url
from IPython.display import IFrame
IFrame(image_url, width=300, height=200)
Explanation: 이미지 가져오기
End of explanation
#이번에는 각자 주피터 노트북으로. 왜냐하면 selenium으로 할 것임
# coding: utf-8
from selenium import webdriver
driver = webdriver.Firefox()
driver.get("http://cafe.naver.com/joonggonara")
# "맥북" 이라는 키워드로 검색 ( * ) => find_ele.., send_keys, click 
# 검색 결과로 나오는 게시글 크롤링
# 1. 검색창 element
# 2. send_keys("맥북")
# 3. 검색 버튼 element
# 4. click()
search_form_element = driver.find_element_by_css_selector("#topLayerQueryInput")
search_form_element.send_keys("맥북")
# 할 수 있는 훨씬 쉬운 방법들이 있습니다. 이따 javascript 통해서 할 예정입니다.
search_button_element = driver.find_element_by_css_selector(".btn-search-green")
search_button_element.click()
post_elements = driver.find_elements_by_css_selector("td.board-list")
len(post_elements)
#실제로는 있는데, 0이라고 나옴. 눈으로는 보이는데
#왜 그러냐면 특이하게 동작함. 이중 구조. 이중 Frame 형태이기 때문
#네이버는 꽤 많은 IFrame을 쓰고 있음
iframe_element = driver.find_element_by_css_selector("#cafe_main")
driver.switch_to_frame(iframe_element)  # 내부적으로는 focus가 옮겨진거.
post_elements = driver.find_elements_by_css_selector("td.board-list")
len(post_elements)
#관공서 사이트가 대부분 이런 형태로 되어 있음
post_element = post_elements[0]
post_element
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)
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)
# 정적인 ( HTML )
# 동적인 ( API; json, xml )
# 동적인 ( Selenium )
# + 한국형 웹사이트
#   - selenium iFrame
#   - selenium javascript
#http://kcia.or.kr/cid/Document/020.Ingredient_shis/INGREDIENT_SHIS_10L.asp
#화장품 성분명 사이트 실습. 
driver = webdriver.Firefox()
driver.get("http://kcia.or.kr/cid/Document/020.Ingredient_shis/INGREDIENT_SHIS_10L.asp")
driver.execute_script('fGoPage(1)')
for page in range(1, 100+1):
    driver.execute_script("fGoPage({page})".format(page=page))
driver = webdriver.Firefox()
driver.get("http://fastcampus.co.kr")
driver.execute_script("alert('무료 수강권 이벤트에 당첨되었습니다.')")
Explanation: https://opentutorials.org/course/1375/6843 여기 참조
이걸로도 확인은 가능하나 우리는 https(안전한 곳). 그래서 보안 클릭해서 바꾸고 보면 됨
API형태의 ajax를 보지만 많은 종류의 ajax가 있다.
ajax는 asynchronous javascript and xml. 비동기적으로 페이지가 변하지 않는 상태에서 우리가 자바스크립트로 리퀘스트를 보낸 다음에 xml이라는 파일 양식을 받아오는 방식
그런데 이제 최근에는 xml이라는 방식보다 웹에서는 json을 많이 쓰면서 사실상 우리는 json을 받아오는 것임. json은 html도 있고 text도 있다.
이런 게 ajax. 웹사이트가 바뀌지 않으면서 우리가 클릭을 했을 때 웹사이트 뒤에서 동작이 일어나고 결과가 바뀌는 일련의 과정을 우리가 ajax라고 부른다.
2T_데이터 크롤링 유형 (4) - 한국형 웹사이트 ( iFrame, javascript )
End of explanation
<END_TASK>