经过前面的一些基础学习,我们大致知道了如何爬取并解析一个网页中的信息,这里我们来做一个更有意思的事情,爬取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

运行结果如下:

Python网络爬虫(6)--爬取淘宝模特图片的更多相关文章

  1. Python网络爬虫 | Scrapy爬取妹子图网站全站照片

    根据现有的知识,写了一个下载妹子图(meizitu.com)Scrapy脚本,把全站两万多张照片下载到了本地. 网站的分析 网页的网址分析 打开网站,发现网页的网址都是以 http://www.mei ...

  2. 学习用java基于webMagic+selenium+phantomjs实现爬虫Demo爬取淘宝搜索页面

    由于业务需要,老大要我研究一下爬虫. 团队的技术栈以java为主,并且我的主语言是Java,研究时间不到一周.基于以上原因固放弃python,选择java为语言来进行开发.等之后有时间再尝试pytho ...

  3. python网络爬虫《爬取get请求的页面数据》

    一.urllib库 urllib是python自带的一个用于爬虫的库,其主要作用就是可以通过代码模拟浏览器发送请求.其常被用到的子模块在python3中的为urllib.request和urllib. ...

  4. python网络爬虫--简单爬取糗事百科

    刚开始学习python爬虫,写了一个简单python程序爬取糗事百科. 具体步骤是这样的:首先查看糗事百科的url:http://www.qiushibaike.com/8hr/page/2/?s=4 ...

  5. Python网络爬虫_爬取Ajax动态加载和翻页时url不变的网页

    1 . 什么是 AJAX ? AJAX = 异步 JavaScript 和 XML. AJAX 是一种用于创建快速动态网页的技术. 通过在后台与服务器进行少量数据交换,AJAX 可以使网页实现异步更新 ...

  6. 一篇文章教会你用Python爬取淘宝评论数据(写在记事本)

    [一.项目简介] 本文主要目标是采集淘宝的评价,找出客户所需要的功能.统计客户评价上面夸哪个功能多,比如防水,容量大,好看等等. 很多人学习python,不知道从何学起.很多人学习python,掌握了 ...

  7. 利用Python爬虫爬取淘宝商品做数据挖掘分析实战篇,超详细教程

    项目内容 本案例选择>> 商品类目:沙发: 数量:共100页  4400个商品: 筛选条件:天猫.销量从高到低.价格500元以上. 项目目的 1. 对商品标题进行文本分析 词云可视化 2. ...

  8. python爬虫学习(三):使用re库爬取"淘宝商品",并把结果写进txt文件

    第二个例子是使用requests库+re库爬取淘宝搜索商品页面的商品信息 (1)分析网页源码 打开淘宝,输入关键字“python”,然后搜索,显示如下搜索结果 从url连接中可以得到搜索商品的关键字是 ...

  9. python3编写网络爬虫16-使用selenium 爬取淘宝商品信息

    一.使用selenium 模拟浏览器操作爬取淘宝商品信息 之前我们已经成功尝试分析Ajax来抓取相关数据,但是并不是所有页面都可以通过分析Ajax来完成抓取.比如,淘宝,它的整个页面数据确实也是通过A ...

随机推荐

  1. 新建的硬盘-mount

    一.查看已经格式化或已挂接硬盘 df -aT 等命令(自己度娘) 二.查看未挂硬盘和未格式化硬盘 1.fdisk -l 比如/dev/sdb  如果已经分区,会有sdb1. 2.格式化 #mkfs - ...

  2. Invalid content was found starting with element 'taglib'”

    今天在使用struts-menu制作菜单,在web.xml中写入 <taglib>      <taglib-uri>/WEB-INF/struts-menu.tld</ ...

  3. gitolite随记

    1.git clone源码 git clone git://github.com/sitaramc/gitolite 2.安装 gitolite/install -ln 3.建立git仓库 gitol ...

  4. 8 fastJson的使用

    Fastjson介绍 Fastjson是一个Java语言编写的JSON处理器,由阿里巴巴公司开发. 1.遵循http://json.org标准,为其官方网站收录的参考实现之一. 2.功能qiang打, ...

  5. MFC的初始化过程和消息映射技术

    1.删除#include <windows.h>--win32中的-(使用win32工程编程mfc必须删除) 添加#include <afxwin.h> -- mfc中的- 2 ...

  6. javascript的prototype原理理解

    prototype是函数的内置属性,每一个function都拥有这样一个属性,在js的面向对象编程上,prototype发挥着强大的作用. 某天,春哥问我你知道prototype的原理吗?我突然懵了, ...

  7. jquery navi

    /// <reference path="../global.js" /> /********************************************* ...

  8. CSS样式总结

    CSS: Cascading Style Sheet,层叠样式表 Css由三部分组成:选择符.样式属性.值: 基本语法:选择符 {样式属性:值:样式属性:值.....} 一,选择器 常用的选择器有:标 ...

  9. NSString 去掉前后空格或回车符

    NSString *string = @" spaces in front and at the end "; NSString *trimmedString = [string ...

  10. 九章算法系列(#3 Binary Tree & Divide Conquer)-课堂笔记

    前言 第一天的算法都还没有缓过来,直接就进入了第二天的算法学习.前一天一直在整理Binary Search的笔记,也没有提前预习一下,好在Binary Tree算是自己最熟的地方了吧(LeetCode ...