本文一部分代码参考网络大牛文章,在此深表感谢,如有侵犯请告知,谢谢。
本文主要是作者在学习过程中,对一些学习内容进行总结与练习,期望对后来学习者有一定的帮助。
使用的Python第三方库主要包括以下几个:
import urllib.request,re
import json
import os
import re
from multiprocessing import Pool
其中urllib作用是为了进行网络数据的请求,re负责正则表达式进行数据的提取,json进行一些字符串与json数据之间的转换,multiprocessing是用了其中的进程池,进行多进程下载相关数据与图片(该部分暂未完全实现)。
本实验爬取的目标网站为淘女郎网站(https://mm.taobao.com/search_tstar_model.htm?spm=5679.126488.640745.2.1b545b81eOvhp1点击打开链接)如下图所示:
根据该网页的信息爬取每一位模特的身份信息以及靓照,每一个模特详细页面如下图所示:
爬取结果如下所示,将每一位模特的文字信息及靓图进行下载,保存至本地,纯粹为了学习,切勿用于其它用途。
下面对整个项目进行介绍:
1、解析美女列表页,分析每一位美女的主页地址、以及每一位美女的基本信息,由于淘宝采用ajax数据夹菜机制,在获取的源码中不能获取美女列表,所有需要采用POST请求的方式,动态获取美女列表信息,代码如下:
firsturl = "https://mm.taobao.com/tstar/search/tstar_model.do?_input_charset=utf-8"
# 采取动态POST请求的方式请求美女列表
send_data = {}
send_data['q'] = r''
send_data['viewFlag'] = r'A'
send_data['sortType'] = r'default'
send_data['searchStyle'] = r''
send_data['searchRegion'] = r'city:'
send_data['searchFansNum'] = r''
send_data['currentPage'] = str(x)
send_data['pageSize'] = r'100'
# 必须对原始请求数据进行编码(作者在此处遇到了很大的麻烦)
data1 = urllib.parse.urlencode(send_data)
data1 = data1.encode('gbk')
# 创建POST请求
request = urllib.request.Request(url=firsturl, data=data1)
# 发送请求获取服务器内容,即美女们的列表
response = urllib.request.urlopen(request)
text_obj = response.read().decode('gbk')
# 返回的数据为JSon格式,但是初始为txt,使用JSon模块转换为json
json_obj = json.loads(text_obj)
# 获取json中的美奴主页地址列表
girls = json_obj['data']['searchDOList']
# 创建计数器,计算总共爬取多少位美女
photocount = 0
# 创建美女图片存储路径
if not os.path.exists('GIRLS'): # 判断GIRLS文件夹是否存在
os.mkdir('GIRLS')
for girl in girls:
# 为每一个美女创建属于自己的文件夹
temp = 'GIRLS/' + girl['realName']
if not os.path.exists(temp):
os.mkdir(temp)
# 下载美女主页内的所有美女图片
photocount = photocount + GetPhoto(temp, str(girl['userId']), girl)
# break
2、获取每一位美女的主页地址,下载该地址网站中所有美女的图片,并将图片保存至本地文件夹,在此处作者将该步骤封装在一个下载函数内,代码如下:
#####根据图片ID下载图片,并保存到指定路径
def GetPhoto(path,id,girl):
girlmessageurl='https://mm.taobao.com/self/aiShow.htm?spm=719.7763510.1998643336.2.HC43QM&userId='+id
response=urllib.request.urlopen(girlmessageurl)
texthtml=response.read().decode('gbk')
#print(texthtml)
#获取女孩信息,并进行存储'userId' (859049713592)
with open('GIRLS/0.txt','a') as f:
#f.write('姓名:'+girl['realName']+',ID:'+girl['userid']+',城市:'+girl['city']+',身高:'+girl['height']+',体重:'+girl['weight']+',QQ:'+qq+',weixin:'+weixin+',tele:'+tele)
f.write('姓名:' + girl['realName'] + ',ID:' + str(girl['userId']) + ',城市:' + girl['city'] + ',身高:' + girl['height'] + ',体重:' + girl['weight'] + '\r\n')
photos=re.findall(r'src="//(.*?)"/>',texthtml)
i=1
for photo in photos:
#urllib.request.urlretrieve('http://img.alicdn.com/imgextra/i1/176817195/TB1a4uZHXXXXXbaXpXXXXXXXXXX_!!176817195-0-tstar.jpg','1.jpg')
try:
urllib.request.urlretrieve('http://'+photo,path+'/'+str(i)+'.jpg')
print('正在下载美女('+girl['realName']+') 的第 '+str(i)+' 张美图')
i=i+1
except:
print('图片下载失败')
return i
3、在主函数中启动下载任务,并使用多进程进行快速下载(暂未实现),代码如下:
if __name__=='__main__':
##print('主函数')
#pool=Pool(processes=3)
#for i in range(1,3):
# pool.apply_async(main,(i,))
# print(str(i)+' 个进程加入')
#print('kaishi')
#pool.close()
#pool.join()
main()
4、至此整个程序完成,如需帮助联系 qq:3501353029;
淘宝:https://shop165937777.taobao.com/?spm=a230r.7195193.1997079397.2.xufnqZ
当前版本源码下载地址:https://download.youkuaiyun.com/download/zz_z123/10301513
Github下载地址:https://github.com/zzzz123zz/GetPhoto-of-model/tree/master