经过前面的一些基础学习,我们大致知道了如何爬取并解析一个网页中的信息,这里我们来做一个更有意思的事情,爬取MM图片并保存。网址为https://mm.taobao.com/json/request_top_list.htm。这个网址有很多页,通过在网址后添加?page=页码来进入指定的页。

为了爬取模特的图片,我们首先要找到各个模特自己的页面。通过查看网页源码,我们可以发现,模特各自的页面的特点如下:

我们可以通过查找class属性为lady-name的标签,然后取其href属性来获取各个模特各自的页面地址。

1 html = urlopen(url)
2 bs = BeautifulSoup(html.read().decode('gbk'),"html.parser")
3 girls = bs.findAll("a",{"class":"lady-name"})
4 for item in girls:
5     linkurl = item.get('href')

继续分析模特各自的页面的特点,模特页面打开后的页面布局如下:

在这个页面中我们要提取的是模特的个性域名,这个域名打开后,里面就有模特的图片了。那么我们的关键问题就是如何提取这个域名。按我们之前的学习,我们会去查找这个标签,但是我们打开网页源码会发现网页源码里面并没有包含这个信息。这是因为这一部分的信息是用JS动态生成的。那么这种情况下我们怎么办呢?

答案是使用selenium和PhantomJS,相关的概念可以自行百度。简而言之,PhantomJS是一个无界面的浏览器,而selenium是一个测试浏览器的工具,结合这2者,我们就可以解析动态的页面了。

获取模特的个性域名的代码如下:

 1 def getUrls(url):
 2     driver= webdriver.PhantomJS()
 3     html = urlopen(url)
 4     bs = BeautifulSoup(html.read().decode('gbk'),"html.parser")
 5     girls = bs.findAll("a",{"class":"lady-name"})
 6     namewithurl = {}
 7     for item in girls:
 8         linkurl = item.get('href')
 9         driver.get("https:"+linkurl)
10         bs1 = BeautifulSoup(driver.page_source,"html.parser")
11         links = bs1.find("div",{"class":"mm-p-info mm-p-domain-info"})
12         if links is not None:
13             links = links.li.span.get_text()
14             namewithurl[item.get_text()] = links
15             print(links)
16     return namewithurl

在这里,我们使用PhantomJs去加载动态的页面,然后用BeautifulSoup去规则化加载后的页面,接下来的工作就与普通的网页相同了。

接下来分析模特的个人主页的特点,直观上是这样的页面:

分析源码后我们会发现,模特的图片地址可以这样获取:

1 html = urlopen(personurl)
2 bs = BeautifulSoup(html.read().decode('gbk'),"html.parser")
3 contents = bs.find("div",{"class":"mm-aixiu-content"})
4 imgs = contents.findAll("img",{"src":re.compile(r'//img\.alicdn\.com/.*\.jpg')})

如此我们就能获取模特的个人域名地址中的图片了,接下来的问题就是如何保存图片了。

我们可以用urllib中的urlretrieve函数来完成保存的工作。

用法为urlretrieve(imgurl, savepath)

再加入多线程等代码,完整的爬虫代码为:

 1 #coding = utf-8
 2 from urllib.request import urlopen
 3 from urllib.request import urlretrieve
 4 from urllib.error import HTTPError
 5 from selenium import webdriver
 6 from selenium.webdriver.common.by import By
 7 from bs4 import BeautifulSoup
 8 from multiprocessing.dummy import Pool as ThreadPool
 9 import sys,os
10 import re
11
12 savepath=r".\save"
13
14 def mkdir(path):
15     if os.path.exists(path):
16         return
17     os.mkdir(path)
18
19 def getUrls(url):
20     driver= webdriver.PhantomJS()
21     html = urlopen(url)
22     bs = BeautifulSoup(html.read().decode('gbk'),"html.parser")
23     girls = bs.findAll("a",{"class":"lady-name"})
24     namewithurl = {}
25     for item in girls:
26         linkurl = item.get('href')
27         driver.get("https:"+linkurl)
28         bs1 = BeautifulSoup(driver.page_source,"html.parser")
29         links = bs1.find("div",{"class":"mm-p-info mm-p-domain-info"})
30         if links is not None:
31             links = links.li.span.get_text()
32             namewithurl[item.get_text()] = links
33             print(links)
34     return namewithurl
35
36 def getImgs(parms):
37     personname = parms[0]
38     personurl = "https:"+parms[1]
39     html = urlopen(personurl)
40     bs = BeautifulSoup(html.read().decode('gbk'),"html.parser")
41     contents = bs.find("div",{"class":"mm-aixiu-content"})
42     imgs = contents.findAll("img",{"src":re.compile(r'//img\.alicdn\.com/.*\.jpg')})
43     savefilename = os.path.join(savepath,personname)
44     mkdir(savefilename)
45     print("img num :",len(imgs))
46     cnt = 0
47     for img in imgs:
48         try:
49             urlretrieve(url = "https:"+img.get("src"),filename =os.path.join(savefilename,str(cnt)+".jpg"))
50             cnt+=1
51         except HTTPError as e:
52             continue
53
54 if __name__ == "__main__":
55     mkdir(savepath)
56     pagenum = 10
57     for i in range(1,pagenum):
58         urls = getUrls("https://mm.taobao.com/json/request_top_list.htm"+"?page="+str(i))
59         pool = ThreadPool(4)
60         pool.map(getImgs,urls.items())
61         pool.close()
62         pool.join()
63         # for (k,v) in urls.items():
64         #     getImgs((k,v))

代码下载地址:

https://github.com/HaoLiuHust/Spider

运行结果如下:

转载于:https://www.cnblogs.com/haoliuhust/p/5759339.html

Python网络爬虫(6)--爬取淘宝模特图片相关推荐

  1. python网络爬虫学习(六)利用Pyspider+Phantomjs爬取淘宝模特图片

    本篇博文在编写时参考了http://cuiqingcai.com/2652.html,向作者表示感谢 一.新的问题与工具 平时在淘宝上剁手的时候,总是会看到各种各样的模特.由于自己就读于一所男女比例三 ...

  2. python使用requests库爬取淘宝指定商品信息

    python使用requests库爬取淘宝指定商品信息 在搜索栏中输入商品 通过F12开发者工具抓包我们知道了商品信息的API,同时发现了商品数据都以json字符串的形式存储在返回的html内 解析u ...

  3. 爬取淘宝商品图片(仅用于技术交流)

    爬取淘宝商品图片(仅用于技术交流) 主要用的是selenium自动化工具 #! /usr/bin/env python # -*-.coding: utf-8 -*- # __author__ = ' ...

  4. 江湖小白之一起学Python (五)爬取淘宝商品信息

    趁热需打铁,随着这几天的鸡血澎湃,我们来实现一下爬取淘宝商品信息,我记得几年前曾用python写了下抓取淘宝天猫,京东,拍拍的爬虫,专门采集商品信息,图片,评论及评论图片,我还用pyqt开发了个客户端 ...

  5. python爬取淘宝淘女郎图片

    网上有许多爬取淘宝淘女郎的代码,发现有的都不可用,就自己改写了一个,当前可用日期为2017.07.30 前提 chromedriver.exe(本文用的是2.30,有两种使用方式,一种是直接绝对路径引 ...

  6. python爬取淘宝商品图片

    python爬取淘宝商品的图片 话不多说,直接上代码: from selenium import webdriver from selenium.webdriver.common import key ...

  7. 【网络爬虫】爬取神奇宝贝Pokemon图鉴图片大全

    [网络爬虫]爬取神奇宝贝Pokemon图鉴 前言: 最近心血来潮,想要一个Pokemon图鉴,无可奈何网上没有相关的博客:后来想了想不如自己动手丰衣足食,就写了一个爬虫,成功从神奇宝贝Wiki百科爬取 ...

  8. Python网络爬虫:爬取并下载个性化签名图片 附GUI窗体版

    Hello,大家好,我是wangzirui32,最近我开了个新的系列,是"Python网络爬虫"分类,还请大家多多支持! 今天,我们来学习如何爬取并下载个性化签名图片,开始学习吧! ...

  9. 【python爬虫】爬取淘宝网商品信息

    相信学了python爬虫,很多人都想爬取一些数据量比较大的网站,淘宝网就是一个很好的目标,其数据量大,而且种类繁多,而且难度不是很大,很适合初级学者进行爬取.下面是整个爬取过程: 第一步:构建访问的u ...

最新文章

  1. vb中可视对象的操作
  2. C++ Primer 学习笔记(第四章:表达式)
  3. [CentOS7] systemd
  4. 《sqlite权威指南》读书笔记 (一)
  5. Hadoop2.0新特性
  6. vscode如何及时提示flutter代码
  7. Deep Residual Learning for Image Recognition(ResNet)论文翻译及学习笔记
  8. 梅捷主板A780G+不支持前面板耳机输出?
  9. java工商银行项目_ChaosBlade 在工商银行混沌工程体系中的应用实践
  10. excel打印字被表格遮住_Excel表格太大无法打印在一页纸上?这几个打印技巧你值得学习...
  11. webservice python开发接口_基于Python的Webservice开发(四)-泛微OA的SOAP接口
  12. winform使用fastreport制作报表(二)使用
  13. java学习--基础知识阶段性总结--多线程
  14. [SDOI2009]HH的项链 BZOJ1878
  15. tcpdf使用及字体设置
  16. 恒凯USB数据采集卡在国产麒麟操作系统下的应用(一)环境设置、采集卡驱动安装及C语言采集应用
  17. 康考迪亚大学应用计算机科学,康考迪亚大学专业设置详情
  18. 写不成书,只寄得相思一点
  19. IDEA 返回上一步,回到下一步 冲突 快捷键设置
  20. 身份证号码验证--C/C++ 实现

热门文章

  1. 一套适用于所有老板的营销方案,让他一个月就卖出3780箱红酒!
  2. 10多个LearnDash示例和演示:从这些在线教育网站获得灵感!
  3. 如何查看 ananconda 的环境(虚拟环境)安装包位置
  4. Java开发学习(三十四)----Maven私服(二)本地仓库访问私服配置与私服资源上传下载
  5. DTOJ #3702. 月读(tsukuyomi)
  6. Arduino与Proteus仿真实例-简单信号频率计数仿真
  7. UOS桌面操作系统定制镜像(下)
  8. 仿网易云音乐新版详情页(沉浸式状态栏,上滑隐藏)
  9. iOS开发 给view绘制虚线边框
  10. Mybaties框架基础原理