2011年12月31日 星期六

擷取網站檔案

http_c0.py
  1 #!/usr/bin/env python
2 #encoding=utf-8
3 # -*- coding: utf-8 -*-
4 #ref: http://www.cnblogs.com/chenzehe/archive/2010/08/30/1812995.html
5
6 import httplib
7 import commands
8 import shutil
9 import re
10 import os
11
12 def get_fn(fp):
13 a=fp.rfind('/')
14 a+=1
15 return fp[a:]
16
17 def get_href(page_html):
18 #return get_page('href.*"', page_html)
19 return get_page('[0-9_]*.shtml', page_html)
20
21 def get_page(page_pattern, page_html):
22 s=''
23 if (re.search(page_pattern, page_html)):
24 m=re.search(page_pattern, page_html)
25 #print "found:", m.group()
26 s = m.group()
27 else:
28 pass#print "not found"
29 return s
30
31 def get_next_page(page_html):
32 return get_page('<a href=.*>下一页</a>', page_html)
33 def get_previous_page(page_html):
34 return get_page('<a href=.*>上一页</a>', page_html)
35 def get_file_url(page_html):
36 return get_page('http://.*.jpg', page_html)
37
38 #http://www.webxml.com.cn/WebServices/WeatherWebService.asmx?wsdl
39
40 #url = 'www.webxml.com.cn'
41 url = 'www.google.com'
42 #url = 'pic.076.com/ComicList/201008/2911_68.shtml'
43 url='files.076.com'
44 url = 'pic.076.com'
45
46 conn = httplib.HTTPConnection(host=url)
47
48 h={'User-agent': 'python-httplib'}
49
50 req_path = '/'
51 #req_path = '/WebServices/WeatherWebService.asmx?wsdl'
52 #conn.request("GET", "/", headers=h)
53 #conn.request("GET", req_path, headers=h)


54 #path='2911_69.shtml'
55 path='/201008/20100830145757244358.jpg'
56 path='/ComicList/201008/'
57 p='2818.shtml'
58 #p='2818_32.shtml'
59
60
61 #conn.request("GET", path+p, headers=h)
62 #r1 = conn.getresponse()
63 #print r1.status, r1.reason
64 #print "msg:", r1.msg
65 #print "version:", r1.version
66 #print "headers:", r1.getheaders()
67 #data1 = r1.read()
68 #print type(data1)
69 #print "len:", len(data1)
70 #print data1
71
72 #f=open('c.jpg', 'w')
73 #f.write(data1)
74 #f.close()
75
76 #print get_file_url(data1)
77 #ppage=get_previous_page(data1)
78 #print ppage
79 #ppage_page=get_href(ppage)
80 #print ppage_page
81
82 move_dir = os.path.join(os.getcwd(), 'jpg/')
83
84 try:
85 os.mkdir(move_dir)
86 except Exception as err:
87 if err.errno != 17: # the directory already exists
88 print("warn", err)
89 else:
90 print("ERROR", err)
91
92 fc=0
93 while(1):
94
95 print 'req path:', path+p
96 conn.request("GET", path+p, headers=h)
97 r1 = conn.getresponse()
98 data1 = r1.read()
99
100 furl = get_file_url(data1)
101
102 fn=get_fn(furl)
103 print 'get file:', furl
104 print 'fn:', fn
105
106 # os.spawnl(os.P_NOWAIT, cmd)
107
108 cmd = "/usr/bin/wget " + furl
109 ( stat, output ) = commands.getstatusoutput(cmd)
110 if stat!=0:
111 print output
112 print "move", os.path.join(os.getcwd(), fn), "to", os.path.join(os.getcwd(), 'jpg/')+str(fc) + '.jpg'
113 shutil.move(os.path.join(os.getcwd(), fn), move_dir + str(fc) + '.jpg')
114 fc+=1
115
116 npage=get_next_page(data1)
117 print npage
118 # if npage.find('_101')!=-1:
119 # break
120 npage_page=get_href(npage)
121 print npage_page
122 p=npage_page
123 if fc > 100 :
124 break
125
126 #print data1


這是一個練習程式, 把漫畫網站的圖檔抓下來, 這樣就不用辛苦的一一點選上一頁/下一頁, 不過這程式有好幾個缺點。
  • 需要使用 wget
  • 只能針對特定網站, 可能需要改寫其他規則才能用在其他網站上。
  • 依序把所有檔案抓下來, 前一個圖檔抓完, 才能抓下一個。
  • 停止條件很粗糙。
  • 若是網站圖檔 url 使用 javascript 產生, 那就無法處理了, 這需要一個 javascript interpreter, 這工程可能有點麻煩。
不過已經比慢慢等著圖檔傳輸, 按著上一頁/下一頁好很多了。

這裡有更多技巧:
http://www.pythonclub.org/python-network-application/observer-spider

沒有留言:

張貼留言

使用 google 的 reCAPTCHA 驗證碼, 總算可以輕鬆留言了。

我實在受不了 spam 了, 又不想讓大家的眼睛花掉, 只好放棄匿名留言。這是沒辦法中的辦法了。留言的朋友需要有 google 帳號。