Toggle menu
Toggle personal menu
Not logged in
Your IP address will be publicly visible if you make any edits.

권영기/web crawler: Difference between revisions

From ZeroWiki
imported>trailblaze
No edit summary
(Repair batch-0004 pages from live compare)
 
(27 intermediate revisions by 3 users not shown)
Line 4: Line 4:


Python을 이용해서 Web Crawler를 제작하면서 Python의 사용법을 익히고, 원하는 웹 페이지를 긁기 위한 Web Crawler를 제작한다. (네이버웹툰(돌아온 럭키짱, 신의 탑...), 네이버 캐스트, 그 외의 각종 웹페이지..)
Python을 이용해서 Web Crawler를 제작하면서 Python의 사용법을 익히고, 원하는 웹 페이지를 긁기 위한 Web Crawler를 제작한다. (네이버웹툰(돌아온 럭키짱, 신의 탑...), 네이버 캐스트, 그 외의 각종 웹페이지..)


= 필요기술 =
= 필요기술 =
Line 14: Line 15:
   HTML, CSS, JavaScript - 웹 페이지 분석
   HTML, CSS, JavaScript - 웹 페이지 분석
   Python
   Python


= 진행 과정 =
= 진행 과정 =


== 필요한 문서 ==
== 필요한 문서 ==
* http://docs.python.org/
* http://hyogeun.tistory.com/107 - try, except.
== 시작 ==
== 시작 ==


Line 23: Line 30:




import urllib
import urllib2
req = urllib2.Request('http://9632024.tistory.com/974')
try: urllib2.urlopen(req)
except URLError, e:
print e.reason
fo = open("test1.html","w")
for line in urllib2.urlopen(req).readlines():
fo.write(line)
fo.close()
* http://coreapython.hosting.paran.com/howto/HOWTO%20Fetch%20Internet%20Resources%20Using%20urllib2.htm
=== 소스에서 URL만 추출하기 ===
=== 소스에서 URL만 추출하기 ===


import urllib
import urllib2
import string
fo1 = open("test1.html", "r")
fo2 = open("test2.html", "w")
for line in fo1.readlines() :
pos = string.find(line, '"http')
if pos is not -1 :
for c in range(pos+1, len(line)) :
if line[c] is '"' :
fo2.write("\n")
break
fo2.write(line[c])
fo1.close()
fo2.close()
* http://docs.python.org/tutorial/controlflow.html
* http://docs.python.org/tutorial/inputoutput.html
=== 파일 다운로드하기 ===
=== 파일 다운로드하기 ===
import urllib
import urllib2
fo = open("test2.html", "r")
for line in fo.readlines():
urllib.urlretrieve(line,line.split('/')[-1])
fo.close()
* http://www.wellho.net/resources/ex.php4?item=y108/bejo.py
* split
  line = 'http://cfile23.uf.tistory.com/original/2001D2044C945F80495C6F'
  line.split('/')-1 == '2001D2044C945F80495C6F'
  line.split('/')-2 == 'original'
  say = "This is a line of text"
  part = line.split(' ')
  part == 'This', 'is', 'a', 'line', 'of', 'text'
* swap
Python 2.7.2+ (default, Oct  4 2011, 20:03:08)
[GCC 4.6.1] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> first = 1
>>> second = 2
>>> first, second = second, first
>>> print first
2
>>> print second
1
>>> first, second = second, first
>>> third = 3
>>> first, second, third = third, first, second
>>> print first, second, third
3 1 2
* retrieve
  urllib.urlretrieve(url[, filename[, reporthook, data]])
  http://docs.python.org/library/urllib.html
=== 디렉토리 만들기 ===
import os
os.chdir(os.getcwd() + '/folder')
def create_dir(folder):
cdir = os.getcwd()
mdir = cdir + folder
print mdir;
if os.path.isdir(mdir) is  False :
os.mkdir(mdir , 0755)
type = ['/mp3', '/jpg', '/txt']
for t in type :
create_dir(t)
* os.chdir(path) - Change the current working directory to path.
* os.getcwd() - Return a string representing the current working directory.
* os.path.isdir(path) - Return True if path is an existing directory.
* os.mkdir(path, mode) - Create a directory named path with numeric mode mode. If the directory already exists, OSError is raised.
http://docs.python.org/library/os.html
http://docs.python.org/library/os.path.html#module-os.path
 
* mode -
  d - 디렉토리 구분
  r - 읽기 권한
  w - 쓰기 권한
  x - 실행 권한
  d    /    rwx    /    r-x    /    r-x
디렉토리  소유자 권한  그룹 권한    전체 권한
  r(4)w(2)x(1)
  755 -> drwxr-xr-x
  http://snowbora.com/343
=== 웹툰(네이버) 긁기 ===
import prepare
import os
currentpath = os.getcwd()
path = os.getcwd() + '/luckyzzang'
if os.path.isdir(path) is False :
os.mkdir(path, 0755)
os.chdir(path)
currentpath = os.getcwd()
for i in range(1, 21):
url = 'http://comic.naver.com/webtoon/detail.nhn?titleId=449854&no=' + str(i) + '&weekday=wed'
path = currentpath + '/' + str(i)
if os.path.isdir(path) is False :
os.mkdir(path, 0755)
os.chdir(path)
prepare.readpage(url, str(i) + '.html')
prepare.extractwt(str(i) + '.html', str(i) + 'file.html')
prepare.download(str(i) + 'file.html')
* prepare는 앞의 4개 소스를 적절히 조합한 python 파일
* 'http://comic.naver.com/webtoon/detail.nhn?titleId=449854&no=***&weekday=wed'
  titleId는 웹툰 ID, 여기서는 돌아온 럭키짱
  no는 그 페이지가 몇 편인지
  weekday는 어떤 요일 웹툰인지.
  'http://comic.naver.com/webtoon/detail.nhn?titleId=449854&no=20&weekday=wed' 이면 럭키짱 20편이라는 소리.
=== wxPython ===
자꾸 글자만 나오는 환경을 보니까 질리기 시작했다. 아직 완성은 멀었지만 GUI로 만들어보려고 함. 어차피 나중에 해야되니까...
* 설치 - apt-get install python-wxgtk2.8
* 문서 - http://wiki.wxpython.org/How%20to%20Learn%20wxPython
* Gtk-WARNING **: 모듈을 module_path에서 찾을 수 없습니다: "pixmap"
  sudo apt-get install libgtkglextmm-x11-1.2-dev
  sudo apt-get install gtk2-engines-pixbuf
  http://stackoverflow.com/questions/8046667/vpython-error-on-ubuntu-11-10
=== pywin32 ===
* http://sourceforge.net/projects/pywin32/
* 2.7버전.
=== Eclipse + PyDev + wxPython + pywin32 ===
# Eclipse 설치
# Eclipse에서, Help > Install New Software > Add > PyDev, Http://pydev.org/updates
# 중간에 Aptana 신뢰하는지에 동의, 재시작
# Window > Preference > PyDev > Interpreter - Python > Auto Config
# New Folder > /usr/lib/python2.7/dist-packages/wx-2.8-gtk2-unicode
* 사실 라이브러리 다 깔아놓고 Auto Config하면 됨..
== 개선해야 할 점 ==


* 파일을 저장할 떄 소스 파일에 저장이 되서 지저분하다. o
* 필요하지 않은 파일까지 전부 긁어온다. o
* 내가 인터넷에서 jpg 파일 긁어오려고 만든 파이썬 코드 있는데 혹시 필요함? - [[서민관]]
** 그러면 매우 감사하죠 ㅎㅎ - [[권영기]]
* http://git-scm.com/ - Git.
* http://wiki.kldp.org/wiki.php/SubversionBook/BranchingAndMerging
* http://www.crummy.com/software/BeautifulSoup/ - 웹분석 라이브러리 BeautifulSoup 이용해보기
* wxpython
* http://docs.python.org/tutorial/classes.html / 9.5까지.
* 로그인이 가능한 페이지를 긁고 싶은데 방법을 모르겠다.
* 굳이 Python으로 GUI를 구현해야 할 필요성을 모르겠다.
----
* 크롤러라니.. 음. -태진

Latest revision as of 00:37, 27 March 2026

목적

Python을 이용해서 Web Crawler를 제작하면서 Python의 사용법을 익히고, 원하는 웹 페이지를 긁기 위한 Web Crawler를 제작한다. (네이버웹툰(돌아온 럭키짱, 신의 탑...), 네이버 캐스트, 그 외의 각종 웹페이지..)


필요기술

  • HTML
  • CSS
  • JavaScript
  • Python
  HTML, CSS, JavaScript - 웹 페이지 분석
  Python


진행 과정

필요한 문서

시작

웹 페이지 소스 긁어오기

import urllib
import urllib2

req = urllib2.Request('http://9632024.tistory.com/974')
try: urllib2.urlopen(req)
except URLError, e:
	print e.reason

fo = open("test1.html","w")
for line in urllib2.urlopen(req).readlines():
	fo.write(line)

fo.close()

소스에서 URL만 추출하기

import urllib
import urllib2
import string

fo1 = open("test1.html", "r")
fo2 = open("test2.html", "w")

for line in fo1.readlines() :
	pos = string.find(line, '"http')
	if pos is not -1 :
		for c in range(pos+1, len(line)) :
			if line[c] is '"' :
				fo2.write("\n")
				break
			fo2.write(line[c])

fo1.close()
fo2.close()

파일 다운로드하기

import urllib
import urllib2


fo = open("test2.html", "r")
for line in fo.readlines():
	urllib.urlretrieve(line,line.split('/')[-1])

fo.close()


 line = 'http://cfile23.uf.tistory.com/original/2001D2044C945F80495C6F'
 line.split('/')-1 == '2001D2044C945F80495C6F'
 line.split('/')-2 == 'original'
 say = "This is a line of text"
 part = line.split(' ')
 part == 'This', 'is', 'a', 'line', 'of', 'text'
  • swap
Python 2.7.2+ (default, Oct  4 2011, 20:03:08) 
[GCC 4.6.1] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> first = 1
>>> second = 2
>>> first, second = second, first
>>> print first
2
>>> print second
1
>>> first, second = second, first
>>> third = 3
>>> first, second, third = third, first, second
>>> print first, second, third
3 1 2


  • retrieve
  urllib.urlretrieve(url[, filename[, reporthook, data]])
  http://docs.python.org/library/urllib.html

디렉토리 만들기

import os

os.chdir(os.getcwd() + '/folder')
def create_dir(folder):
	cdir = os.getcwd()
	mdir = cdir + folder
	print mdir;
	if os.path.isdir(mdir) is  False :
		os.mkdir(mdir , 0755)

type = ['/mp3', '/jpg', '/txt']
for t in type :
	create_dir(t)
  • os.chdir(path) - Change the current working directory to path.
  • os.getcwd() - Return a string representing the current working directory.
  • os.path.isdir(path) - Return True if path is an existing directory.
  • os.mkdir(path, mode) - Create a directory named path with numeric mode mode. If the directory already exists, OSError is raised.
http://docs.python.org/library/os.html
http://docs.python.org/library/os.path.html#module-os.path
 
  • mode -
  d - 디렉토리 구분
  r - 읽기 권한
  w - 쓰기 권한
  x - 실행 권한
  d    /    rwx    /    r-x    /    r-x

디렉토리 소유자 권한 그룹 권한 전체 권한

  r(4)w(2)x(1) 
  755 -> drwxr-xr-x
  http://snowbora.com/343

웹툰(네이버) 긁기

import prepare
import os

currentpath = os.getcwd()
path = os.getcwd() + '/luckyzzang'
if os.path.isdir(path) is False :
	os.mkdir(path, 0755)


os.chdir(path)
currentpath = os.getcwd()


for i in range(1, 21):
	url = 'http://comic.naver.com/webtoon/detail.nhn?titleId=449854&no=' + str(i) + '&weekday=wed'

	path = currentpath + '/' + str(i)
	if os.path.isdir(path) is False :
		os.mkdir(path, 0755)
	
	os.chdir(path)
	
	prepare.readpage(url, str(i) + '.html')
	prepare.extractwt(str(i) + '.html', str(i) + 'file.html')
	prepare.download(str(i) + 'file.html')
  titleId는 웹툰 ID, 여기서는 돌아온 럭키짱
  no는 그 페이지가 몇 편인지
  weekday는 어떤 요일 웹툰인지.
  'http://comic.naver.com/webtoon/detail.nhn?titleId=449854&no=20&weekday=wed' 이면 럭키짱 20편이라는 소리.

wxPython

자꾸 글자만 나오는 환경을 보니까 질리기 시작했다. 아직 완성은 멀었지만 GUI로 만들어보려고 함. 어차피 나중에 해야되니까...

  • Gtk-WARNING **: 모듈을 module_path에서 찾을 수 없습니다: "pixmap"
  sudo apt-get install libgtkglextmm-x11-1.2-dev
  sudo apt-get install gtk2-engines-pixbuf
  http://stackoverflow.com/questions/8046667/vpython-error-on-ubuntu-11-10

pywin32

Eclipse + PyDev + wxPython + pywin32

  1. Eclipse 설치
  2. Eclipse에서, Help > Install New Software > Add > PyDev, Http://pydev.org/updates
  3. 중간에 Aptana 신뢰하는지에 동의, 재시작
  4. Window > Preference > PyDev > Interpreter - Python > Auto Config
  5. New Folder > /usr/lib/python2.7/dist-packages/wx-2.8-gtk2-unicode
  • 사실 라이브러리 다 깔아놓고 Auto Config하면 됨..

개선해야 할 점


  • 크롤러라니.. 음. -태진