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 ...
随机推荐
- ncsim仿真VHDL
ncsim仿真VHDL 1.文件列表 ctrl.vhd design_io.vhd tb.vhd compile.nc simulate.nc ./shm/shmtb.tcl 2. Compile你的 ...
- Linux的目录结构及其作用
/bin bin是Binary的缩写.这个目录存放着最经常使用的命令. /boot这里存放的是启动Linux时使用的一些核心文件,包括一些连接文件以及镜像文件. /dev dev是Device(设备) ...
- 阿里云主机SSD实例磁盘测试及IO调度算法调整
测试背景及环境说明 阿里云ECS 主机配置: 4C8G root@zabbix-master:~# grep -i "model name" /proc/cpuinfo model ...
- python - 类的方法
类的方法分为:普通方法. 静态方法和类方法 调用方式 特征 普通方法 由对象去调用执行,属于类 至少一个self,对象调用 静态方法 属于类,但通过类来调用,不依赖于任何对象,方法内部不需要对象封 ...
- MySql 事务+异常处理+异常抛出
-- 测试用表 -- innodb 支持事务 CREATE TABLE `tb_test` ( `id` ) NOT NULL AUTO_INCREMENT, `name` ) NOT NULL, P ...
- Property与Attribute的区别
Property属于面向对象的范畴----属性 Attribute则是编程语言文法层面的东西----特征 Property属于面向对象的范畴.在使用面向对象编程的时候,常常需要对客观 ...
- js改变div宽度
document.getElementById('Content_Right_id').style.width = document.documentElement.clientWidth - 250 ...
- 简单描述一下XIB与Storyboards,简述它们的优缺点。
参考答案: 我倾向于纯代码开发,因此所提供的参考答案可能具有一定的个人感情,不过还是给大家说说自己的想法. 优点: XIB:在编译前就提供了可视化界面,可以直接拖控件,也可以直接给控件添加约束,更直观 ...
- Java Se 基础系列(笔记) -- BasicDataType
java.lang.String类代表不可变的字符序列 String类常用方法:1.public char charAt(int index); -- 返回下标为index的字符 2.public i ...
- Opensuse13.2开启ssh
要开启ssh很简单,步骤分为三步 步骤1: 安装ssh zypper install ssh 步骤2:启动ssh daemon网上很多通过 service 命令或者 init.d 目录中的脚本启动ss ...