Python网络爬虫(6)--爬取淘宝模特图片
经过前面的一些基础学习,我们大致知道了如何爬取并解析一个网页中的信息,这里我们来做一个更有意思的事情,爬取MM图片并保存。网址为https://mm.taobao.com/json/request_top_list.htm。这个网址有很多页,通过在网址后添加?page=页码来进入指定的页。
为了爬取模特的图片,我们首先要找到各个模特自己的页面。通过查看网页源码,我们可以发现,模特各自的页面的特点如下:
我们可以通过查找class属性为lady-name的标签,然后取其href属性来获取各个模特各自的页面地址。
- html = urlopen(url)
- bs = BeautifulSoup(html.read().decode('gbk'),"html.parser")
- girls = bs.findAll("a",{"class":"lady-name"})
- for item in girls:
- linkurl = item.get('href')
继续分析模特各自的页面的特点,模特页面打开后的页面布局如下:
在这个页面中我们要提取的是模特的个性域名,这个域名打开后,里面就有模特的图片了。那么我们的关键问题就是如何提取这个域名。按我们之前的学习,我们会去查找这个标签,但是我们打开网页源码会发现网页源码里面并没有包含这个信息。这是因为这一部分的信息是用JS动态生成的。那么这种情况下我们怎么办呢?
答案是使用selenium和PhantomJS,相关的概念可以自行百度。简而言之,PhantomJS是一个无界面的浏览器,而selenium是一个测试浏览器的工具,结合这2者,我们就可以解析动态的页面了。
获取模特的个性域名的代码如下:
- def getUrls(url):
- driver= webdriver.PhantomJS()
- html = urlopen(url)
- bs = BeautifulSoup(html.read().decode('gbk'),"html.parser")
- girls = bs.findAll("a",{"class":"lady-name"})
- namewithurl = {}
- for item in girls:
- linkurl = item.get('href')
- driver.get("https:"+linkurl)
- bs1 = BeautifulSoup(driver.page_source,"html.parser")
- links = bs1.find("div",{"class":"mm-p-info mm-p-domain-info"})
- if links is not None:
- links = links.li.span.get_text()
- namewithurl[item.get_text()] = links
- print(links)
- return namewithurl
在这里,我们使用PhantomJs去加载动态的页面,然后用BeautifulSoup去规则化加载后的页面,接下来的工作就与普通的网页相同了。
接下来分析模特的个人主页的特点,直观上是这样的页面:
分析源码后我们会发现,模特的图片地址可以这样获取:
- html = urlopen(personurl)
- bs = BeautifulSoup(html.read().decode('gbk'),"html.parser")
- contents = bs.find("div",{"class":"mm-aixiu-content"})
- imgs = contents.findAll("img",{"src":re.compile(r'//img\.alicdn\.com/.*\.jpg')})
如此我们就能获取模特的个人域名地址中的图片了,接下来的问题就是如何保存图片了。
我们可以用urllib中的urlretrieve函数来完成保存的工作。
用法为urlretrieve(imgurl, savepath)
再加入多线程等代码,完整的爬虫代码为:
- #coding = utf-8
- from urllib.request import urlopen
- from urllib.request import urlretrieve
- from urllib.error import HTTPError
- from selenium import webdriver
- from selenium.webdriver.common.by import By
- from bs4 import BeautifulSoup
- from multiprocessing.dummy import Pool as ThreadPool
- import sys,os
- import re
- savepath=r".\save"
- def mkdir(path):
- if os.path.exists(path):
- return
- os.mkdir(path)
- def getUrls(url):
- driver= webdriver.PhantomJS()
- html = urlopen(url)
- bs = BeautifulSoup(html.read().decode('gbk'),"html.parser")
- girls = bs.findAll("a",{"class":"lady-name"})
- namewithurl = {}
- for item in girls:
- linkurl = item.get('href')
- driver.get("https:"+linkurl)
- bs1 = BeautifulSoup(driver.page_source,"html.parser")
- links = bs1.find("div",{"class":"mm-p-info mm-p-domain-info"})
- if links is not None:
- links = links.li.span.get_text()
- namewithurl[item.get_text()] = links
- print(links)
- return namewithurl
- def getImgs(parms):
- personname = parms[0]
- personurl = "https:"+parms[1]
- html = urlopen(personurl)
- bs = BeautifulSoup(html.read().decode('gbk'),"html.parser")
- contents = bs.find("div",{"class":"mm-aixiu-content"})
- imgs = contents.findAll("img",{"src":re.compile(r'//img\.alicdn\.com/.*\.jpg')})
- savefilename = os.path.join(savepath,personname)
- mkdir(savefilename)
- print("img num :",len(imgs))
- cnt = 0
- for img in imgs:
- try:
- urlretrieve(url = "https:"+img.get("src"),filename =os.path.join(savefilename,str(cnt)+".jpg"))
- cnt+=1
- except HTTPError as e:
- continue
- if __name__ == "__main__":
- mkdir(savepath)
- pagenum = 10
- for i in range(1,pagenum):
- urls = getUrls("https://mm.taobao.com/json/request_top_list.htm"+"?page="+str(i))
- pool = ThreadPool(4)
- pool.map(getImgs,urls.items())
- pool.close()
- pool.join()
- # for (k,v) in urls.items():
- # getImgs((k,v))
代码下载地址:
https://github.com/HaoLiuHust/Spider
运行结果如下:
Python网络爬虫(6)--爬取淘宝模特图片的更多相关文章
- Python网络爬虫 | Scrapy爬取妹子图网站全站照片
根据现有的知识,写了一个下载妹子图(meizitu.com)Scrapy脚本,把全站两万多张照片下载到了本地. 网站的分析 网页的网址分析 打开网站,发现网页的网址都是以 http://www.mei ...
- 学习用java基于webMagic+selenium+phantomjs实现爬虫Demo爬取淘宝搜索页面
由于业务需要,老大要我研究一下爬虫. 团队的技术栈以java为主,并且我的主语言是Java,研究时间不到一周.基于以上原因固放弃python,选择java为语言来进行开发.等之后有时间再尝试pytho ...
- python网络爬虫《爬取get请求的页面数据》
一.urllib库 urllib是python自带的一个用于爬虫的库,其主要作用就是可以通过代码模拟浏览器发送请求.其常被用到的子模块在python3中的为urllib.request和urllib. ...
- python网络爬虫--简单爬取糗事百科
刚开始学习python爬虫,写了一个简单python程序爬取糗事百科. 具体步骤是这样的:首先查看糗事百科的url:http://www.qiushibaike.com/8hr/page/2/?s=4 ...
- Python网络爬虫_爬取Ajax动态加载和翻页时url不变的网页
1 . 什么是 AJAX ? AJAX = 异步 JavaScript 和 XML. AJAX 是一种用于创建快速动态网页的技术. 通过在后台与服务器进行少量数据交换,AJAX 可以使网页实现异步更新 ...
- 一篇文章教会你用Python爬取淘宝评论数据(写在记事本)
[一.项目简介] 本文主要目标是采集淘宝的评价,找出客户所需要的功能.统计客户评价上面夸哪个功能多,比如防水,容量大,好看等等. 很多人学习python,不知道从何学起.很多人学习python,掌握了 ...
- 利用Python爬虫爬取淘宝商品做数据挖掘分析实战篇,超详细教程
项目内容 本案例选择>> 商品类目:沙发: 数量:共100页 4400个商品: 筛选条件:天猫.销量从高到低.价格500元以上. 项目目的 1. 对商品标题进行文本分析 词云可视化 2. ...
- python爬虫学习(三):使用re库爬取"淘宝商品",并把结果写进txt文件
第二个例子是使用requests库+re库爬取淘宝搜索商品页面的商品信息 (1)分析网页源码 打开淘宝,输入关键字“python”,然后搜索,显示如下搜索结果 从url连接中可以得到搜索商品的关键字是 ...
- python3编写网络爬虫16-使用selenium 爬取淘宝商品信息
一.使用selenium 模拟浏览器操作爬取淘宝商品信息 之前我们已经成功尝试分析Ajax来抓取相关数据,但是并不是所有页面都可以通过分析Ajax来完成抓取.比如,淘宝,它的整个页面数据确实也是通过A ...
随机推荐
- 新建的硬盘-mount
一.查看已经格式化或已挂接硬盘 df -aT 等命令(自己度娘) 二.查看未挂硬盘和未格式化硬盘 1.fdisk -l 比如/dev/sdb 如果已经分区,会有sdb1. 2.格式化 #mkfs - ...
- Invalid content was found starting with element 'taglib'”
今天在使用struts-menu制作菜单,在web.xml中写入 <taglib> <taglib-uri>/WEB-INF/struts-menu.tld</ ...
- gitolite随记
1.git clone源码 git clone git://github.com/sitaramc/gitolite 2.安装 gitolite/install -ln 3.建立git仓库 gitol ...
- 8 fastJson的使用
Fastjson介绍 Fastjson是一个Java语言编写的JSON处理器,由阿里巴巴公司开发. 1.遵循http://json.org标准,为其官方网站收录的参考实现之一. 2.功能qiang打, ...
- MFC的初始化过程和消息映射技术
1.删除#include <windows.h>--win32中的-(使用win32工程编程mfc必须删除) 添加#include <afxwin.h> -- mfc中的- 2 ...
- javascript的prototype原理理解
prototype是函数的内置属性,每一个function都拥有这样一个属性,在js的面向对象编程上,prototype发挥着强大的作用. 某天,春哥问我你知道prototype的原理吗?我突然懵了, ...
- jquery navi
/// <reference path="../global.js" /> /********************************************* ...
- CSS样式总结
CSS: Cascading Style Sheet,层叠样式表 Css由三部分组成:选择符.样式属性.值: 基本语法:选择符 {样式属性:值:样式属性:值.....} 一,选择器 常用的选择器有:标 ...
- NSString 去掉前后空格或回车符
NSString *string = @" spaces in front and at the end "; NSString *trimmedString = [string ...
- 九章算法系列(#3 Binary Tree & Divide Conquer)-课堂笔记
前言 第一天的算法都还没有缓过来,直接就进入了第二天的算法学习.前一天一直在整理Binary Search的笔记,也没有提前预习一下,好在Binary Tree算是自己最熟的地方了吧(LeetCode ...