Python爬取淘宝图片

爬取淘女郎模特图片与相关信息

(一) 解析淘女郎首页网站地址
打开淘女郎首页界面 https://www.taobao.com/markets/mm/mm2017,点击 查看更多,然后 F12 进入网页抓包工具,按 F5观察数据加载变化。审查元素发现,我们想找的图片的链接在网页的源代码里更本找不到,所以这个网页应该不是简单的静态网页。不然那那些妹子图不给我们轻易就得到了。。哈哈。不过不怕。我们进入 NETwork 里面看有没有动态加载的文件是我们想要的。

这里写图片描述

果然,仔细观察发现,里面加载的内容跟当前页面的人名及其他信息完全吻合。便可以肯定这就是我们要的数据。所以,查看request url获取相关url。https://mm.taobao.com/alive/list.do?scene=all&page=1
而后面的page=1 则就表示,第一页。只要我们把数值改变便可以加载到对应的页码。

个人觉得这个还算简单。所以直接上代码了:

import urllib.request
import re
from user_agent.base import generate_user_agentclass Spider:# 定义需要爬取的页数def __init__(self, page):self.page = int(page)# 获取要爬取的图片的页数def get_pags(self, page):for i in range(1, page+1):url = "https://mm.taobao.com/alive/list.do?scene=all&page=%d"%iyield url# 定义常用的 URL 打开函数def open_url(self, url):user_agent = generate_user_agent()header = {"User-Agent":user_agent}req = urllib.request.Request(url, headers=header)response = urllib.request.urlopen(req).read() # 文件未进行decode解码,此时为response二进制文件return response# 定义获取图片名称的函数def get_name(self, url):response = self.open_url(url).decode('gbk').encode('utf-8').decode('utf-8')name_list = re.compile('darenNick":"(.*?)"').findall(response)return name_list# 定义获取图片链接地址并返回图片内容def get_picture(self, url):response = self.open_url(url).decode('gbk').encode('utf-8').decode('utf-8')link_list = re.compile('avatarUrl":"(.*?)"').findall(response)for link in link_list:if re.compile('http:').match(link):img = self.open_url(link)else:link_ = 'http:'+ linkimg = self.open_url(link_)yield img               # 这里一个二进制生成器,方便图片保存# 保存图片def save_picture(self, url):name = self.get_name(url)img = self.get_picture(url)list_zip = list(zip(name, img))for each in list_zip:with open('./首页/%s.jpg'%each[0], 'wb') as f:f.write(each[1])def main(self):links = self.get_pags(self.page)for link in links:print(link)self.get_name(link)self.get_picture(link)self.save_picture(link)print("It's done!!")if __name__ == "__main__":spider = Spider(67)spider.main()

都是一些常见的爬虫知识,而我重点要讲的不是这个,而是这中间的这个decode编码问题(纯属个人的看法):这里面获取那些信息的时候那是出现那些编码错误,好像是由于,中文与utf-8的老毛病导致的。我试过在decode()参数中设置忽略ignore,与replace,然而并没有什么用。试来试去发现这种办法最靠谱了。不报错。如果有遇到相同错误的可以参考一下。
结果部分截图:

这里写图片描述

(二) 解析淘女郎找模特网址地址
相比于首页来说,抓取”找模特”里面模特的信息,才算有点难度。但只要不怕辛苦,慢慢摸索。还是可以找到规律 的。一开始我也是一头雾水,等自己搞出来之后发现感觉蛮爽还。。
1,进入找模特
这里写图片描述
这里写图片描述

2,细心找
进入一个网页地址第一件事肯定是,审查元素。发现也不能在网页源码中找到信息。想想我们上面说的,那就是耐细的去网页数据包中找。先看有没有动态加载的XHR,一般都是在这个下面可以找到。没错。这个就是这么找到的。
这里写图片描述

右边的数据仔细一看,发现它是一个像字典一样的东西,里面包含了很多键值对,再网页翻发现最里面那一层包含了30对键值对,分别包含一些用户名,userID ,等。这个时候再看这个网页,发现,刚好有30张照片。初步确定就是这个。
这里写图片描述
随后,找到request url 的请求网络地址,然后用浏览器打开。发现里面包含了30张照片的基本信息。于是我们就知道,这就是我们要的 真实的 URL

3,信息获取
我们可以看到,每张图片下方都有对应模特的相关信息:名字,城市,身高,体重,被赞次数。
当我们点进去看,里面还有很多东西,相册里面有很多写真。模特卡里面还有跟多个人简介,三围等
这里呢,我们初步确定先只爬取模特的相关信息:名字,城市,身高,体重,被赞次数,并且每个模特单独使用一个文件夹。

4,分析代码可行度
我们需要编写一个函数从来获取图片
一个用来获取名字,另一个用来获取其他的相关信息。
这个应该容易。因为提取信息,只需要用到很简单的正则表达式即可。

在准备好这一切之后。发现,整个页面只有30张图片,是不是少了点。那么我们怎么翻页呢?首先肯定是去往源代码里找翻页的链接可不可以用。结果显示,是不可以的。那么我么怎么去做?下面来看:

这里写图片描述

在header里面可以看到,下面有个一个表单。而这个表单就是我们这个网页提交的数据。里面有一项currentpage,当你切换页码的时候,发现这个值跟随页码也在变化。好了。肯定就是这样了。
所有我们可以通过表单提交数据来达到切换到下一页的目的。然后结合我们前面的,大致的思路应该出来了,即:

①编写几个获取相应信息的函数
②然后编写保存这个些信息的函数
③接着通过切换下一页来达到保存更多的信息

5,给出代码参考

# -*- coding : utf-8 -*-
'''
Desc: 抓取淘宝中淘女郎模特的信息:名字,图片,身高,体重以文件夹形式保存信息保存为文本通过观察network 中变化,得出信息网址:https://mm.taobao.com/tstar/search/tstar_model.do?_input_charset=utf-8经过分析发现,无法通过此网站源码中链接实现翻页,于是想到通过提交表单数据实现翻页。request url 不变然后就是如何进入 各位模特的详情页 的问题了。通过观察发现:https://mm.taobao.com/self/aiShow.htm?&userId=268367415  可以进入对应模特的个人界面。https://mm.taobao.com/self/model_info.htm?user_id=268367415  可以进入对应model的模特卡,里面有跟多相关信息。而 userId 正好我们可以从前面那个链接获取到。通过改变ID便可实现对详情页面信息的爬取
'''
import urllib.request
import urllib.parse
import re
from user_agent.base import generate_user_agent
import os.path, os
from datetime import datetime
import threading
# 设立标志位flag 用于判断文件是否已经存在,用来避免重复操作
global flag
class Spider:def __init__(self):pass# 定义常用的 URL 打开函数def open_url(self, url, data):data = urllib.parse.urlencode(data).encode("utf-8")user_agent = generate_user_agent()header = {"User-Agent":user_agent}req = urllib.request.Request(url, data=data, headers=header)response = urllib.request.urlopen(req).read() # 文件未进行decode解码,此时为response二进制文件return response# 获取model的realnamedef get_realname(self, url, data):response = self.open_url(url, data).decode('gbk').encode('utf-8').decode('utf-8')name = re.compile('realName":"(.*?)"').findall(response)return name# 获取model头像地址,并返回图片的二进制信息def get_head(self, url,data):response = self.open_url(url,data).decode('gbk').encode('utf-8').decode('utf-8')link_list = re.compile('avatarUrl":"(.*?)"').findall(response)imgs = []for link in link_list:link_ = 'http:'+ linkimg = urllib.request.urlopen(link_).read()imgs.append(img)return imgs               # 直接返回二进制文件,方便图片保存# 保存一张图片def save_img(self, img, folder, picname, i):print("正在保存 %s 的照片..." %picname)with open(folder+'/'+picname+'.jpg', 'wb') as f:f.write(img)print("完成!")# 获取model的 城市,身高,体重,被赞次数def get_desc(self,url, data):response = self.open_url(url,data).decode('gbk').encode('utf-8').decode('utf-8')city = re.compile('city":"(.*?)"').findall(response)height = re.compile('height":"(.*?)"').findall(response)weight = re.compile('weight":"(.*?)"').findall(response)favor = re.compile('totalFavorNum":(.*?),').findall(response)# 建立人物信息对应关系desc = list(zip(city, height, weight, favor))return desc# 保存一个人物信息def save_desc(self, folder, filename, desc, i):print("正在保存 %s 的个人信息" %filename)line = "model:\t\t %s \n\n所在城市:\t\t %s \n\n身高(cm):\t\t %s \n\n体重(kg):\t\t %s \n\n这货被赞过: %d 次" % (filename, desc[i][0], (desc[i][1]), (desc[i][2]), int(desc[i][3]))with open(folder + '/' + filename + '.txt', 'w') as f:f.write(line)print("完成!")# 建立每个模特的文件夹def make_dir(self, folder):#判断model文件夹下是否存在folderif os.path.exists(folder):print("文件夹已存在!")flag = 1return flagelse:os.mkdir(folder)print("已创建文件夹 %s " % folder)flag = 0return flagdef main(self):url = "https://mm.taobao.com/tstar/search/tstar_model.do?_input_charset=utf-8"print(datetime.now().strftime( '%Y-%m-%d %H:%M:%S' ))pages = int(input("程序开始...\n请输入要爬取的页数(1-1450):\n" ))if pages<1:print("太小啦,请输入1-1450之间的整数...")if pages>1450:print("太大啦,请输入1-1450之间的整数...")i = 0# 选择一个文件夹os.chdir("model")# 实现翻页操作for page in range(1,pages+1):data = {'currentPage': page, 'pageSize':100}# 重置i 因为每一页只有30份数据i =0# 获取人物基本信息real_name = self.get_realname(url, data)imgs = self.get_head(url, data)desc = self.get_desc(url, data)# 围绕名字这个关键字来理清思路for name in real_name:flag = self.make_dir(name)if flag == 0:print("正在进行第 %d 页的第 %d 次操作,操作对象是: %s " % (page, i + 1, name))# 保存model头像的二进制文件self.save_img(imgs[i], name, name, i)self.save_desc(name, name, desc, i)else:passi += 1print("It's done!!\n", datetime.now().strftime( '%Y-%m-%d %H:%M:%S' ))if __name__ == "__main__":spider = Spider()spider.main()

6,代码分析

1,上边代码的注释都非常清楚,import user_agent 是用来随机生成可用的user-agent模拟浏览器访问,防止被BAN。
我对部分代码进行了处理,比如利用标志位防止文件夹重复操作,只不过代码太过冗长,因为我没有花时间去优化下它,都是想到什么写什么,所以仅供参考。

2,这个代码的功能及其少,不过如果要爬取跟跟多信息也很简单。如:
https://mm.taobao.com/self/aiShow.htm?&userId=268367415 可以进入对应模特的个人界面。
https://mm.taobao.com/self/model_info.htm?user_id=268367415 可以进入对应model的模特卡,
上面这连个链接可以让我们获得跟更多的信息。而我们可以通过改变 userID的值来获得不同model的不同信息。这些userID我们都可以在上面的代码中获得,只需要多添加一行代码用正则提取相关userID操作即可。这个没啥大问题。

3,代码在执行过程中,可以回比较慢,因为这只是一个单线程,而且还受网路影响,不过单线程才是主要的。所以建议开多个线程来执行这个操作。这样会快很多。由于程序改动会比较麻烦。我就没弄了。。我太懒了。没办法。。。。还有一个就是多线程不太会。。[/尴尬]
结果部分截图:

这里写图片描述

好吧,就这么多了..

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/28566.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【实例】Python爬取淘宝图片

文章目录 一、分析二、代码三、效果 一、分析 》》 第一页时 》》第二页时s48,第三页时s96&#xff08;每页为48的倍数&#xff09; 》》当q外套时&#xff08;q为关键字&#xff09; 》》用于每页图片的正则表达目标 二、代码 导入请求、报错模块&正则表达式类库 f…

Python3爬虫图片抓取

&#xff08;1&#xff09;实战背景 上图的网站的名字叫做Unsplash&#xff0c;免费高清壁纸分享网是一个坚持每天分享高清的摄影图片的站点&#xff0c;每天更新一张高质量的图片素材&#xff0c;全是生活中的景象作品&#xff0c;清新的生活气息图片可以作为桌面壁纸也可以应…

爬虫实战 爬取谷歌图片 Google images

目标 #date&#xff1a;2020.5.25 #author:pmy #aim:爬取google图片 本次爬取主要是为了练习selenium。 分析 爬取的目标如下图&#xff0c;爬取猫猫图片 将google图片顺利爬下来。 由于google图片界面是属于那种往下划会在本页面中加载出更多信息&#xff0c;但未刷新的机…

Python爬虫爬取Google图片

文章目录 urlliburllib.request.urlretrieve urllib3 in python3PoolManagerRequest BeautifulSoup安装 Installation一些函数 Some functionsget_textfind_all(name, attrs, recursive, string, limit, **kwargs)name - 通过标签名搜索kwargs - keyword arguments 关键字参数进…

Python——爬虫抓取图片

/* * Copyright (c) 2014, 烟台大学计算机学院 * All rights reserved. * 文件名称&#xff1a;test.cpp * 作 者&#xff1a;李晓凯 * 完成日期&#xff1a;2019年 8 月 19 日 * 版 本 号&#xff1a;v1.0 * * 问题描述&#xff1a; * 输入描述&#xff1a; * 程…

python爬虫(爬取图片)

在家无聊写的爬虫程序&#xff0c;用来爬取图片&#xff0c;由于这个是好久之前写的&#xff0c;有点忘了&#xff0c;写的不详细&#xff0c;后面再写一份详细的 爬虫的基本原理就是&#xff1a; 发起请求->获取响应->解析内容->保存数据 第一步&#xff1a;发…

面试常见题(荷兰国旗问题

面试常见题&#xff0c;荷兰三色国旗问题 挺有意思的 #include<bits/stdc.h> using namespace std; int main(){vector<int>str{2, 3, 1, 9, 7, 6, 1, 4, 5,4};int nstr.size();int target4;int l-1,rn;int p0;//这里不能是l<r哦&#xff0c;p代表数组遍历指针…

快速排序之荷兰国旗问题

描述 荷兰国旗有三横条块构成&#xff0c;自上到下的三条块颜色依次为红、白、蓝。现有若干由红、白、蓝三种颜色的条块序列&#xff0c;要将它们重新排列使所有相同颜色的条块在一起。本问题要求将所有红色的条块放最左边、所有白色的条块放中间、所有蓝色的条块放最右边。 …

从糖尿病捆绑支付看荷兰整合医疗

来源:中国数字科技馆 所谓捆绑支付模式,是指对于患有特定疾病的患者,在涉及多个照护提供方的时候,通过单一途径即可支付所接受的所有服务。在荷兰,随着老年人口及慢性疾病患者的增加,整合医疗开始受到政策决策者和保健提供者的关注,并将整合医疗定位为有前瞻性的、多学…

荷兰旗问题(三色旗排序)

摘要&#xff1a; 荷兰旗问题是三色排序&#xff0c;即某一组数据&#xff0c;元素的值只能为a,b ,c。把这组数据按照a, b, c的顺序排序。 本文介绍了一种时间复杂度为O&#xff08;n&#xff09;&#xff0c;空间复杂度O&#xff08;1&#xff09;的算法。 1. 问题描述 某…

荷兰国旗问题(分三块)

在说 “荷兰国旗” 问题之前&#xff0c;首先来看一个引例。 给定一个数组arr&#xff0c;和一个数num&#xff0c;请把小于等于num的数放在数组的左边&#xff0c;大于num的数放在数组的右边。要求额外空间复杂度O(1&#xff09;,时间复杂度 O(N&#xff09; 分析&#xff1…

荷兰国旗问题

Cousera Algorithms PartI第二周课后问答题&#xff0c;有这样一道题&#xff0c;当时没什么想法&#xff0c;直到学了第三周的归并排序&#xff0c;才弄明白要怎么做&#xff0c;这里记录一下自己的想法与最终代码。 问题描述 简而言之&#xff0c;这道题就是有红白蓝三种颜…

算法:荷兰国旗问题

什么是荷兰国旗问题 荷兰国旗是由红白蓝3种颜色的条纹拼接而成&#xff0c;如下图所示&#xff1a; 假设这样的条纹有多条&#xff0c;且各种颜色的数量不一&#xff0c;并且随机组成了一个新的图形&#xff0c;新的图形可能如下图所示&#xff0c;但是绝非只有这一种情况&am…

快排-荷兰国旗

在使用partition-exchange排序算法时&#xff0c;如快速排序算法&#xff0c;我们会遇到一些问题&#xff0c;比如重复元素太多&#xff0c;降低了效率&#xff0c;在每次递归中&#xff0c;左边部分是空的(没有元素比关键元素小)&#xff0c;而右边部分只能一个一个递减移动。…

BUUCTF 荷兰宽带数据泄露

题目 RouterPassView RouterPassView官方下载-RouterPassView中文免费版-华军软件园 ​ RouterPassView,大多数现代路由器允许您备份到一个文件路由器的配置&#xff0c;然后从文件中恢复配置时的需要。路由器的备份文件通常包含了像您的ISP的用户名重要数据/密码&#xff0c…

荷兰国旗问题以及快速排序

文章目录 一、荷兰国旗问题1、啥是荷兰国旗问题2、荷兰国旗问题的抽象3、解决的思路4、详细的参考代码 二、快速排序1、啥是快排&#xff08;排序流程&#xff09;2、抽象后的快排流程3、详细的参考代码 大家好&#xff0c;我是周一。 最近几篇算法&#xff0c;我们都是聊的归…

拍卖理论 英式拍卖 和 荷兰式拍卖 是什么

拍卖理论 源自Vickrey&#xff08;1961&#xff09;的早期研究&#xff0c;其因此获得1996年的诺贝尔经济学奖。 目标一般为&#xff1a;拍卖人的收益最大化、社会的整体效率最优化 对科研和商业方面有非常价值 英式拍卖 又称增价拍卖。拍品的起拍价格即最低期望价格&#…

谈腾讯地图web api如何实现类似百度地图内置的城市切换、关键字输入提示功能

PC WEB端新增客户的时候需要填写客户地址和联系人信息&#xff0c;包括&#xff1a;省市区、街道、详细地址和经纬度以及联系人、固话和移动电话。获取客户地址信息之前用的是百度地图&#xff0c;由于小程序中客户拜访时&#xff0c;需要对客户进行定位、距离计算&#xff0c;…

数学系列 (二)自然数、分数、小数、算数、代数

从无到有 数的概念 出生不久的孩子你觉的他认识1、2、3类似的数字吗&#xff1f;应该都不知道&#xff0c;可见数字的概念也是随着我们人类成长逐渐认识到的&#xff0c;英国经济学创立者亚当斯密说“数是人类在精神上制造出来的最抽象的概念”&#xff0c;属于逻辑思维里面的…

html 省份,城市 选择器附效果图

开发交流QQ群: 173683895 173683895 526474645 人满的请加其它群 效果图&#xff1a; 源码&#xff1a; <!DOCTYPE html> <html><head><meta charset"UTF-8"><link href"https://cdn.bootcss.com/bootstrap/3.3.7/css/boots…