第一次算是成功的爬虫小代码,花了挺长时间的。
目的:
获取淘宝mm图片
现存问题:
无法获取动态加载的图片,只能得到打开网页后存在的图片
虽然更换代理仍禁止访问
收获:
对爬虫的思路相对来说更清晰了——想爬什么,这东西有什么规律,怎么体现在网页上的,如何抓取
增强了对python基础知识的掌握 1,文件写入的方法 2,json被加载时所需要的条件 3,列表,元组,字典
4,网络请求的基本操作 5,基础的应对反爬机制的方法
1 import json
2 import urllib.response
3 import urllib.request
4 import re
5 import random
6 from json import loads
7 import os
8
9 #请求头数组
10 headerstr = '''Mozilla/5.0(Macintosh;IntelMacOSX10.6;rv:2.0.1)Gecko/20100101Firefox/4.0.1
11 Opera/9.80(Macintosh;IntelMacOSX10.6.8;U;en)Presto/2.8.131Version/11.11
12 Mozilla/4.0(compatible;MSIE7.0;WindowsNT5.1;360SE)'''
13 #获取请求头
14 def headers():
15 header = headerstr.split('
')
16 length = len(header)
17 return header[random.randint(0,length-1)]
18
19 #返回基本信息和user_id
20 def getUrlList():
21 req = urllib.request.Request('https://mm.taobao.com/tstar/search/tstar_model.do?_input_charset=utf-8')
22 req.add_header('User-Agent', headers())
23 html = urllib.request.urlopen(req).read().decode('gbk')
24
25 #加载json,html解码后才能加载到json中
26 # 注:目前只知道{}内的可以转成json,其余情况未知
27 # 注:[]是列表,()是元组,{}是字典
28 json = loads(html)
29
30 return json['data']['searchDOList']
31
32
33 #获取mm相册的代号所在的url
34 def getAlbumCode(userId):
35 req = urllib.request.Request('https://mm.taobao.com/self/album/open_album_list.htm?_charset=utf-8&user_id%%20=%s' % userId)
36 req.add_header('User-Agent', headers())
37 html = urllib.request.urlopen(req).read().decode('gbk')
38 reg = r'class="mm-first" href="//(.*?)"'
39
40 return re.findall(reg, html)[::2]
41
42
43 #获取mm相册的代号
44 def getAlbumInner(code):
45 reg = 'd+'
46 result= re.findall(reg,code)
47 return result[1]
48
49
50 #获取图片地址并保存图片到个人文件夹
51 def getpic(userId,album_id,Album_num,content):
52 #因为下滑可以加载图片,准备将page=1,2,3...的情况做出来,但目前而言由于未知的错误而无法进入page=2的情况,所以暂时搁浅,只选了page=1的情况
53 #这里的page无多少意义,可以忽略
54 page=1
55
56 #index表示下面for循环中在json['picList']的列表中每个元素的指针
57 index = 0
58
59 req = urllib.request.Request('https://mm.taobao.com/album/json/get_album_photo_list.htm?user_id=%s&album_id=%s&page=1'%(userId,album_id))
60 req.add_header('User-Agent', headers())
61 html = urllib.request.urlopen(req,timeout=5).read(
62 ).decode('gbk')
63 json = loads(html)
64
65 #json['picList']是一个列表,要通过循环遍历出来每个元素
66 for it in json['picList']:
67 index += 1
68
69 #通过比较url发现大图与小图之间的差距在于290与620,所以直接替换就可以啦
70 picUrl=re.sub('290','620',it['picUrl'])
71
72 #获得的url无法直接写入文件,观察后发现直接加http:就行了
73 pic = 'http:'+picUrl
74
75 #open打开的是将要写入的文件的绝对路径或者说是相对路径
76 contex = urllib.request.urlopen(pic).read()
77 with open(content+"\"+str(Album_num)+'-'+str(page)+'-'+str(index)+".jpg",'wb') as f:
78
79 f.write(contex)
80
81 #先加个代理
82 proxy_support = urllib.request.ProxyHandler({'http': '124.93.87.140:80'})
83 opener = urllib.request.build_opener(proxy_support)
84 urllib.request.install_opener(opener)
85
86 json = getUrlList()
87 for i in json:
88 userId = i['userId']
89 realName = i['realName']
90 city = i['city']
91 height = i['height']
92 weight = i['weight']
93 print (u'发现一位美女,她的名字叫:' +realName, '身高:'+height + 'm','体重:'+ weight + 'kg',u'她现在的居住在-' + city)
94 # 根据mm名字创建文件夹
95 content = 'E:\demo\' + realName
96 if not os.path.exists(content):
97 os.mkdir(content)
98 print('正在为'+realName+'创建文件夹...')
99 #mm的第Album_num个相册
100 Album_num = 0
101 print('正在为你悄咪咪的保存她的图片...')
102 for j in getAlbumCode(userId):
103 code = j
104 album_id=getAlbumInner(code)
105 Album_num+=1
106 getpic(userId, album_id, Album_num,content)
107 print(realName+'的图片已经保存成功啦!')