本文一部分代码参考网络大牛文章,在此深表感谢,如有侵犯请告知,谢谢。
本文主要是作者在学习过程中,对一些学习内容进行总结与练习,期望对后来学习者有一定的帮助。
使用的Python第三方库主要包括以下几个:
import urllib.request,reimport jsonimport osimport refrom multiprocessing import Pool
其中urllib作用是为了进行网络数据的请求,re负责正则表达式进行数据的提取,json进行一些字符串与json数据之间的转换,multiprocessing是用了其中的进程池,进行多进程下载相关数据与图片(该部分暂未完全实现)。
本实验爬取的目标网站为淘女郎网站(/search_tstar_model.htm?spm=5679.126488.640745.2.1b545b81eOvhp1点击打开链接)如下图所示:
根据该网页的信息爬取每一位模特的身份信息以及靓照,每一个模特详细页面如下图所示:
爬取结果如下所示,将每一位模特的文字信息及靓图进行下载,保存至本地,纯粹为了学习,切勿用于其它用途。
下面对整个项目进行介绍:
1、解析美女列表页,分析每一位美女的主页地址、以及每一位美女的基本信息,由于淘宝采用ajax数据夹菜机制,在获取的源码中不能获取美女列表,所有需要采用POST请求的方式,动态获取美女列表信息,代码如下:
firsturl = "/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模块转换为jsonjson_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='/self/aiShow.htm?spm=719.7763510.1998643336.2.HC43QM&userId='+idresponse=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=1for photo in photos:#urllib.request.urlretrieve('/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+1except: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;
淘宝:/?spm=a230r.7195193.1997079397.2.xufnqZ
当前版本源码下载地址:/download/zz_z123/10301513
Github下载地址:/zzzz123zz/GetPhoto-of-model/tree/master