1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
|
#!/usr/bin/env python
#encoding:UTF-8
import
re
import
urllib
import
threading
import
time
import
Queue
def
getHtml(url):
html_page
=
urllib.urlopen(url).read()
return
html_page
#提取网页中图片的URL
def
getUrl(html):
pattern
=
r
'http://.*?\.jpg!mid'
#正则表达式 .*?(匹配http://和\.jpg!mid之间所有字符串)
imgre
=
re.
compile
(pattern)
imglist
=
re.findall(imgre,html)
#re.findall(pattern,string) 在string中寻找所有匹配成功的字符串,以列表形式返回值
return
imglist
class
getImg(threading.Thread):
def
__init__(
self
,queue):
#进程间通过队列通信,所以每个进程需要用到同一个队列初始化
threading.Thread.__init__(
self
)
self
.queue
=
queue
#self.setDaemon(True) #守护线程
self
.start()
#启动线程
#使用队列实现进程间通信
def
run(
self
):
global
count
while
(
True
):
imgurl
=
self
.queue.get()
# print self.getName()
#urllib.urlretrieve(url,filname) 将url的内容提取出来,并存入filename中
urllib.urlretrieve(imgurl,
'/home/dragonriver/图片/girls/%s.jpg'
%
count)
# print "%s.jpg done"%count
count
+
=
1
if
self
.queue.empty():
break
self
.queue.task_done()
#当使用者线程调用 task_done() 以表示检索了该项目、并完成了所有的工作时,那么未完成的任务的总数就会减少。
def
main():
global
count
url
=
"http://girl-atlas.com/a/10130205170100000231"
#要爬的网页地址
html
=
getHtml(url)
imglist
=
getUrl(html)
threads
=
[]
count
=
0
queue
=
Queue.Queue()
#将所有任务加入队列
for
i
in
range
(
len
(imglist)):
queue.put(imglist[i])
#多线程爬去图片
for
i
in
range
(
4
):
thread
=
getImg(queue)
threads.append(thread)
#合并进程,当子进程结束时,主进程才可以执行
#for thread in threads:
# thread.join()
#另一种保持主进程阻塞的方法,次方法和前面的self.queue.task_tone()相照应
#两个要同时使用
#queue.join()
if
__name__
=
=
'__main__'
:
main()
print
"Down"
|