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

  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. docke 网络配置2

    一,docker 的bridge模式是和vmware中的nat模式类似的,但是如果想要弄成和vmwae中的bridge怎么办呢? 说明,bridge模式获取的Ip是与宿主机的ip是出于同一个网段的. ...

  2. SpringTest2

    Spring 框架第二天 AOP切面编程 今天重点内容: 1. 什么是AOP ? AOP实现原理是怎样的? AOP相关术语 2. AOP底层实现 (了解) ----- JDK动态代理. Cglib动态 ...

  3. 关于java中根据身份证求生日和年龄的问题

    /*这个也没什么大的功能,也没什么安全验证,只是对输入的身份证号码的长度进行了验证.其他的功能可以自己添加.*/import java.util.*; import java.util.Scanner ...

  4. 转载:android——eclipse如何去除Ctrl+shift+R组合键查找到的.class文件

    转载自:http://blog.csdn.net/virgilli/article/details/22500409 AS里面的build文件下一堆的.class 文件,当你要定位资源文件的时候,有些 ...

  5. Js字面变量,定义问题

    Js字面变量.浏览器的版本问题:

  6. static \ const \ volatile 的含义

    1.static 在函数体内,一个被声明为静态的变量在这一函数被调用的过程中维持其值不变 在模块内(函数体外),一个被声明为静态的变量可以被模块内的所有函数访问,但不能被模块外的其他函数访问,即它是一 ...

  7. Oracle System密码忘记 密码修改、删除账号锁定lock

    一下转自http://www.cnblogs.com/yjhrem/articles/2340149.html 运行cmd命令行 录入 sqlplus /nolog  无用户名登录 conn /as ...

  8. C++的this指针

    这篇博客主要内容翻译自国外著名程序员网站:geekersforgeekers,经过作者小幅度整理,水平有限,敬请指正. 关于this指针的粗浅认识 (一) this指针: 在对象的任意非static类 ...

  9. VC中窗口ID,句柄,指针三者相互转换函数【转】

    ID--HANDLE--HWND三者之间的互相转换id->句柄        hWnd = ::GetDlgItem(hParentWnd,id);id->指针        CWnd:: ...

  10. struts2 使用jsonplugin

    配置中的参数含义: root参数用于指定要序列化的根对象,如果省去这一配置,表示要序列化action中的所有属性 ignoreHierarchy 为false时表示要序列化根对象的所有基类 exclu ...