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 ...
随机推荐
- 给UIImage添加蒙版
http://stackoverflow.com/questions/17448102/ios-masking-an-image-keeping-retina-scale-factor-in-acco ...
- (五)CodeMirror - 关于htmlmixed中包含script脚本
最近发现个问题,场景如下: 当创建的mode类型为htmlmixed,且内容中包含javascript脚本,且是闭包立即执行: 如果内容是使用JQuery函数.html()插入到DOM中后再创建cod ...
- C++11 lambda表达式学习
lambda表达式是函数式编程的基础.咱对于函数式编程也没有足够的理解,因此这里不敢胡言乱语,有兴趣的可以自己查找相关资料看下.这里只是介绍C++11中的lambda表达式自己的认识.这里有参考文档h ...
- No1_5.字符串的基本操作_Java学习笔记
import java.text.DecimalFormat; import java.text.NumberFormat; import java.util.Locale; import java. ...
- Jquery各版本下载,附Jquery官网下载方法
jQuery version 2.1.1 http://ajax.aspnetcdn.com/ajax/jQuery/jquery-2.1.1.js http://ajax.aspnetcdn.com ...
- android 利用Bitmap获取圆角矩形、圆形图片
1.在很多时候,我们要显示图片资源,需要将他的资源显示为圆角的:示例源码如下: public static Bitmap getRoundedCornerBitmap(Bitmap bitmap,fl ...
- 什么是dtd文件,为什么需要dtd
DTD为英文Document Type Definition,中文意思为"文档类定义".DTD肩负着两重任务:一方面它帮助你编写合法的代码,另一方面它让浏览器正确地显示器代码.也许 ...
- iOS开发笔记--什么时候调用layoutSubviews
iOS开发笔记--什么时候调用layoutSubviews 分类: iOS2014-04-22 16:15 610人阅读 评论(0) 收藏 举报 今天在写程序时候遇见layoutSubviews触发时 ...
- CloudStack API编程指引
原文地址:https://cwiki.apache.org/confluence/display/CLOUDSTACK/CloudStack+API+Coding+Guidelines 前言 本文阐述 ...
- Codeforces 229D Towers
http://codeforces.com/problemset/problem/229/D 题意:有n(1<=n<=5,000)座塔排在一条直线上,从左到右每个塔的高度分别为hi(1&l ...