本篇目標
1.抓取淘寶MM的姓名,頭像,年齡
2.抓取每一個MM的資料簡介以及寫真圖片
3.把每一個MM的寫真圖片按照文件夾保存到本地
4.熟悉文件保存的過程
1.URL的格式
在這裏我們用到的URL是 http://mm.taobao.com/json/request_top_list.htm?page=1,問號前面是基地址,後面的參數page是代表第幾頁,可以隨意更換地址。點擊開之後,會發現有一些淘寶MM的簡介,並附有超鏈接鏈接到個人詳情頁面。
我們需要抓取本頁面的頭像地址,MM姓名,MM年齡,MM居住地,以及MM的個人詳情頁面地址。
2.抓取簡要信息
相信大家經過上幾次的實戰,對抓取和提取頁面的地址已經非常熟悉了,這裏沒有什麼難度了,我們首先抓取本頁面的MM詳情頁面地址,姓名,年齡等等的信息打印出來,直接貼代碼如下
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 | __author__ = 'CQC' # -*- coding:utf-8 -*- import urllib import urllib2 import re class Spider: def __init__(self): self.siteURL = 'http://mm.taobao.com/json/request_top_list.htm' def getPage(self,pageIndex): url = self.siteURL + "?page=" + str(pageIndex) print url request = urllib2.Request(url) response = urllib2.urlopen(request) return response.read().decode('gbk') def getContents(self,pageIndex): page = self.getPage(pageIndex) pattern = re.compile('<div class="list-item".*?pic-word.*?<a href="(.*?)".*?<img src="(.*?)".*?<a class="lady-name.*?>(.*?)</a>.*?<strong>(.*?)</strong>.*?<span>(.*?)</span>',re.S) items = re.findall(pattern,page) for item in items: print item[0],item[1],item[2],item[3],item[4] spider = Spider() spider.getContents(1) |
運行結果如下
2.文件寫入簡介
在這裏,我們有寫入圖片和寫入文本兩種方式
1)寫入圖片
1
2
3
4
5
6
7
|
運行結果如下
QQ截圖20150220234132
2.文件寫入簡介
在這裏,我們有寫入圖片和寫入文本兩種方式
1)寫入圖片
|
2)寫入文本
1 2 3 4 5 | def saveBrief(self,content,name): fileName = name + "/" + name + ".txt" f = open(fileName,"w+") print u"正在偷偷保存她的個人信息爲",fileName f.write(content.encode('utf-8')) |
3)創建新目錄
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
#創建新目錄
defmkdir(self,path):
path=path.strip()
#
判斷路徑是否存在
#
存在 True
#
不存在 False
isExists=os.path.exists(path)
#
判斷結果
ifnotisExists:
#
如果不存在則創建目錄
#
創建目錄操作函數
os.makedirs(path)
returnTrue
else:
#
如果目錄存在則不創建,並提示目錄已存在
returnFalse
|
3.代碼完善
主要的知識點已經在前面都涉及到了,如果大家前面的章節都已經看了,完成這個爬蟲不在話下,具體的詳情在此不再贅述,直接帖代碼啦。
1 | spider.py |
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
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
|
__author__='CQC'
#
-*- coding:utf-8 -*-
importurllib
importurllib2
importre
importtool
importos
#抓取MM
classSpider:
#頁面初始化
def__init__(self):
self.siteURL='http://mm.taobao.com/json/request_top_list.htm'
self.tool=tool.Tool()
#獲取索引頁面的內容
defgetPage(self,pageIndex):
url=self.siteURL+"?page="+str(pageIndex)
request=urllib2.Request(url)
response=urllib2.urlopen(request)
returnresponse.read().decode('gbk')
#獲取索引界面所有MM的信息,list格式
defgetContents(self,pageIndex):
page=self.getPage(pageIndex)
pattern=re.compile('<div
class="list-item".*?pic-word.*?<a href="(.*?)".*?<img src="(.*?)".*?<a class="lady-name.*?>(.*?)</a>.*?<strong>(.*?)</strong>.*?<span>(.*?)</span>',re.S)
items=re.findall(pattern,page)
contents=[]
foriteminitems:
contents.append([item[0],item[1],item[2],item[3],item[4]])
returncontents
#獲取MM個人詳情頁面
defgetDetailPage(self,infoURL):
response=urllib2.urlopen(infoURL)
returnresponse.read().decode('gbk')
#獲取個人文字簡介
defgetBrief(self,page):
pattern=re.compile('<div
class="mm-aixiu-content".*?>(.*?)<!--',re.S)
result=re.search(pattern,page)
returnself.tool.replace(result.group(1))
#獲取頁面所有圖片
defgetAllImg(self,page):
pattern=re.compile('<div
class="mm-aixiu-content".*?>(.*?)<!--',re.S)
#個人信息頁面所有代碼
content=re.search(pattern,page)
#從代碼中提取圖片
patternImg=re.compile('<img.*?src="(.*?)"',re.S)
images=re.findall(patternImg,content.group(1))
returnimages
#保存多張寫真圖片
defsaveImgs(self,images,name):
number=1
printu"發現",name,u"共有",len(images),u"張照片"
forimageURLinimages:
splitPath=imageURL.split('.')
fTail=splitPath.pop()
iflen(fTail)>3:
fTail="jpg"
fileName=name+"/"+str(number)+"."+fTail
self.saveImg(imageURL,fileName)
number+=1
#
保存頭像
defsaveIcon(self,iconURL,name):
splitPath=iconURL.split('.')
fTail=splitPath.pop()
fileName=name+"/icon."+fTail
self.saveImg(iconURL,fileName)
#保存個人簡介
defsaveBrief(self,content,name):
fileName=name+"/"+name+".txt"
f=open(fileName,"w+")
printu"正在偷偷保存她的個人信息爲",fileName
f.write(content.encode('utf-8'))
#傳入圖片地址,文件名,保存單張圖片
defsaveImg(self,imageURL,fileName):
u=urllib.urlopen(imageURL)
data=u.read()
f=open(fileName,'wb')
f.write(data)
printu"正在悄悄保存她的一張圖片爲",fileName
f.close()
#創建新目錄
defmkdir(self,path):
path=path.strip()
#
判斷路徑是否存在
#
存在 True
#
不存在 False
isExists=os.path.exists(path)
#
判斷結果
ifnotisExists:
#
如果不存在則創建目錄
printu"偷偷新建了名字叫做",path,u'的文件夾'
#
創建目錄操作函數
os.makedirs(path)
returnTrue
else:
#
如果目錄存在則不創建,並提示目錄已存在
printu"名爲",path,'的文件夾已經創建成功'
returnFalse
#將一頁淘寶MM的信息保存起來
defsavePageInfo(self,pageIndex):
#獲取第一頁淘寶MM列表
contents=self.getContents(pageIndex)
foritemincontents:
#item[0]個人詳情URL,item[1]頭像URL,item[2]姓名,item[3]年齡,item[4]居住地
printu"發現一位模特,名字叫",item[2],u"芳齡",item[3],u",她在",item[4]
printu"正在偷偷地保存",item[2],"的信息"
printu"又意外地發現她的個人地址是",item[0]
#個人詳情頁面的URL
detailURL=item[0]
#得到個人詳情頁面代碼
detailPage=self.getDetailPage(detailURL)
#獲取個人簡介
brief=self.getBrief(detailPage)
#獲取所有圖片列表
images=self.getAllImg(detailPage)
self.mkdir(item[2])
#保存個人簡介
self.saveBrief(brief,item[2])
#保存頭像
self.saveIcon(item[1],item[2])
#保存圖片
self.saveImgs(images,item[2])
#傳入起止頁碼,獲取MM圖片
defsavePagesInfo(self,start,end):
foriinrange(start,end+1):
printu"正在偷偷尋找第",i,u"個地方,看看MM們在不在"
self.savePageInfo(i)
#傳入起止頁碼即可,在此傳入了2,10,表示抓取第2到10頁的MM
spider=Spider()
spider.savePagesInfo(2,10)
|
1 | tool.py |
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
|
__author__='CQC'
#-*-
coding:utf-8 -*-
importre
#處理頁面標籤類
classTool:
#去除img標籤,1-7位空格,
removeImg=re.compile('<img.*?>|
{1,7}| ')
#刪除超鏈接標籤
removeAddr=re.compile('<a.*?>|</a>')
#把換行的標籤換爲\n
replaceLine=re.compile('<tr>|<div>|</div>|</p>')
#將表格製表<td>替換爲\t
replaceTD=re.compile('<td>')
#將換行符或雙換行符替換爲\n
replaceBR=re.compile('<br><br>|<br>')
#將其餘標籤剔除
removeExtraTag=re.compile('<.*?>')
#將多行空行刪除
removeNoneLine=re.compile('\n+')
defreplace(self,x):
x=re.sub(self.removeImg,"",x)
x=re.sub(self.removeAddr,"",x)
x=re.sub(self.replaceLine,"\n",x)
x=re.sub(self.replaceTD,"\t",x)
x=re.sub(self.replaceBR,"\n",x)
x=re.sub(self.removeExtraTag,"",x)
x=re.sub(self.removeNoneLine,"\n",x)
#strip()將前後多餘內容刪除
returnx.strip()
|
以上兩個文件就是所有的代碼內容,運行一下試試看,那叫一個酸爽
看看文件夾裏面有什麼變化