크롤링 예제소스 (180301 추가)
1. import
import requests from bs4 import BeautifulSoup import os import re import json import pandas as pd # 데이터 시각화를 위한 pandas from urllib.parse import urljoin # url import collections # OrderedDict()를 사용하기위한 collections headers = { 'User-Agent': ('Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 ' '(KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36'), }
2. 소스
# 멜론 차트 100위 headers = { 'Referer': 'http://news.naver.com/main/home.nhn', # 네이버 크롤링 시, Referer 필수이기에 User-Agent 재선언 'User-Agent': ('Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 ' '(KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36'), } html = requests.get("http://www.melon.com/chart/index.htm", headers = headers).text soup = BeautifulSoup(html, 'html.parser') tag_list = soup.select('.service_list_song .wrap_song_info a[href*=playSong]') for idx, tag in enumerate(tag_list, 1): print(idx , tag.text)
# reddit 글 제목, url html = requests.get('https://www.reddit.com/', headers = headers).text soup = BeautifulSoup(html, 'html.parser') tag_list = soup.select('div[class*=sitetable] p.title > a[href]') # CSS Selector를 이용
# tag_list = soup.find_all('title may-blank outbound) # find_all을 이용
result = [] # DataFrame을 사용하기 위한 선언 for idx, tag in enumerate(tag_list,1): result.append({ 'title' : tag.text, 'url' : tag.attrs['href'] }) df = pd.DataFrame(result) # 데이터 시각화를 위해 사용하는 DataFrame df
# 네이버 실시간 인기검색어
url = 'http://naver.com' html = requests.get(url).text soup = BeautifulSoup(html, 'html.parser') tag_list = soup.select('.PM_CL_realtimeKeyword_rolling_base .ah_k') for idx,tag in enumerate(tag_list, 1): print(idx, tag.text)
# AskDjango lv1 : html lv1_url = 'https://askdjango.github.io/lv1/' html = requests.get(lv1_url, headers = headers).text soup = BeautifulSoup(html, 'html.parser') for a_tag in soup.select('#course_list .course a'): print(a_tag.text, a_tag['href'])
# AskDjango lv2 : ajax lv2_json_url = 'https://askdjango.github.io/lv2/data.json' json_string = requests.get(lv2_json_url, headers = headers).text results = json.loads(json_string) # json 데이터를 읽을 수 있게 변환 result = [] for course in results: result.append({ 'name' : course['name'], 'url' : course['url'] }) df = pd.DataFrame(result) df
# AskDjango lv3 : Javascript # re.S : 정규표현식에서 .은 모든 문자를 match한다. 하지만 약속되어있는 특수 문자들은 예외다. # 개행까지 match 되어야하므로 re.S를 사용한다. url = 'https://askdjango.github.io/lv3/' html = requests.get(url, headers = headers).text # (.+) : 1회 이상의 문자 중 가장 큰 범위 // (.+?) : 1회 이상의 문자 중, 가장 작은 범위 # 뽑고자하는 데이터의 위치를 ()로 나타낸다. matched = re.search((r'var courses = (.+?);'), html, re.S) json_string = matched.group(1) course_list = json.loads(json_string) result = [] for course in course_list: #print('{name} {url}'.format(**course)) # 키워드 가변인자 #print('{} {}'.format(course['name'], course['url'])) result.append({ 'name' : '{name}'.format(**course), 'url' : '{url}'.format(**course) }) df = pd.DataFrame(result) df
# 네이버 해외축구 기사 html = requests.get('http://sports.news.naver.com/wfootball/news/index.nhn', headers = headers).text matched = re.search(r'newsListModel: {"list":(.+?),"date"', html, re.S) json_string = matched.group(1) news_list = json.loads(json_string) result = [] for news in news_list: result.append({ 'officeName' : news['officeName'], 'sectionName' : news['sectionName'], 'title' : news['title'], }) df = pd.DataFrame(result) df
# 네이버 맞춤법 검사 # dict의 특성상 순서가 무작위이기에 OrderedDict를 사용해 순서를 고정시켰다. def spellchecker(q): url = 'https://m.search.naver.com/p/csearch/dcontent/spellchecker.nhn' params = collections.OrderedDict() params['_callback'] = 'window.__jindo2_callback._spellingCheck_0' params['q'] = q html = requests.get(url, headers = headers, params = params).text matched = re.search(r'_spellingCheck_0\((.+?)\);', html) json_string = json.loads(matched.group(1)) text = json_string['message']['result']['html'] result_text = re.sub(r'<.+?>','', text) return result_text if __name__ == '__main__': line = input() print("수정결과 : " + spellchecker(line))
# 팟빵 오디오 조회 및 다운로드 (송은이&김숙 비밀보장)
def get_list(page): url = 'http://www.podbbang.com/podbbangchnew/episode_list' params = {'id' : 12757, 'page' : page} r = requests.get(url, headers = headers, params = params) r.encoding = 'utf-8' # 한글 깨지는 것을 수정 html = r.text soup = BeautifulSoup(html, 'html.parser')
for tag_list in soup.select('li'): try: title = tag_list.find('dt')['title'] link = urljoin(url, tag_list.find('a')['href']) print(title, link, '\n') except (TypeError, KeyError): print("End Page") return None # 다운로드 주석 (입력한 페이지의 모든 오디오 다운로드) ''' mp3_bin = requests.get(link, headers = headers).content headers = { "Referer" : "http://www.podbbang.com/ch/{pid}".format(pid = id) # Referer를 설정해주지 않으면 다운로드 불가 } filename = '{}.mp3'.format(title) with open(filename, 'wb') as f: f.write(mp3_bin) break '''
# 구글 검색 (selenium) driver = webdriver.Chrome("/Applications/MAMP/htdocs/chromedriver") driver.get('http://www.google.com') assert "Google" in driver.title # Google로 접속이 됬는지 확인 ele = driver.find_element_by_name('q') # 검색란의 id가 q ele.clear() # 검색란 비우기 ( 검색란에 default 값이 있는 경우가 많으므로 clear를 습관화하자.) ele.send_keys("가상화폐") ele.submit() assert "No results found." not in driver.page_source driver.close()
# 뽐뿌 검색 url = 'http://www.ppomppu.co.kr/zboard/zboard.php' params = { 'id' : 'ppomppu' } headers = {'Accept-Encoding' : None} # requests.get에서 자동 세팅하는 헤더 None 설정 시, gzip을 하지 않아 제대로 출력됨. html = requests.get(url, params = params, headers = headers).text soup = BeautifulSoup(html, 'html.parser') p_lists = soup.select('table a font') for idx, p_list in enumerate(p_lists,1): print(idx, p_list.text)
웹 개발자가 알려주는 수익형 블로그 고속 성장 A to Z