实验楼 2017-03-15 10:57 阅读 16 收藏 1 推荐 2

项目简介:本实验通过使用 python 实现一个淘宝女郎图片收集爬虫,学习并实践 BeautifulSoup、Selenium Webdriver 及正则表达式等知识。
每一个老司机都和这门课相见恨晚。只要20分钟,8个多G的美女图片就会按文件夹、姓名、地点整整齐齐地出现在你的电脑里。单身狗看了会流泪,宅男看了会沉默。
本教程由阿treee发布在 实验楼 ,完整教程及在线练习地址: Python3 实现淘女郎照片爬虫 ,可以直接在教程中下载代码使用demo。
一、实验说明 1.1 实验介绍本项目通过使用 Python 实现一个淘女郎图片收集爬虫,学习并实践 BeautifulSoup、Selenium Webdriver 及正则表达式等知识。在项目开发过程中采用瀑布流开发模型。
1.2 知识点本项目中将会学习并实践以下知识点:
Python3 编程 使用 BeautifulSoup 解析 HTML 页面 使用 Selenium Webdriver 爬取 Web 页面 使用正则表达式提取所需的关键信息 1.3 实验效果这是我们要爬取的目标页面:
淘女郎: https://mm.taobao.com/search_tstar_model.htm

爬取后的目录结构如下:

每个目录中都有一系列的图片:

二、基础工具
本节主要介绍和安装项目中将用到的几个基础工具。本实验使用实验楼的环境开发,中间部分步骤在不同版本的 linux 环境下会有不同。
在开始之后的步骤之前,先更新源:
sudo apt-get update 2.1 安装 pip3首先,由于使用的工具都需要通过 pip3 进行安装,实验楼的环境中没有安装 pip3(现在已经有了,可以跳过此步),所以需要先将pip3准备好。
打开桌面上的 Xfce 终端,输入下面的命令安装 pip3:
sudo apt-get install python3-pip 2.2 安装 BeatifulSoup 简介BeautifulSoup库的名字取自刘易斯卡罗尔在《爱丽丝梦游仙境》里的同名歌词。就像故事中他在仙境中的说法一样,BeautifulSoup试图化平淡为神奇。它通过定位HTML标签来去格式化和组织复杂的网络信息,用简单易用的Python对象为我们展现 XML 结构信息。
安装由于这次实验是在python3.X版本以上的所以,将拓展库安装到特定的库中使用pip3,从而安装到python3的系统目录中,仍然是在实验楼中的 Xfce 终端执行命令:
sudo pip3 install beautifulsoup4BeautifulSoup4是现今的最新版本,也是接下来重点使用的工具。
此外,项目中 beautifulsoup 还会用到 html5lib 这个模块,所以也需要安装 html5lib:
sudo apt-get install python3-html5lib 2.3 Selenium 简介Selenium 是一个强大的网络数据采集工具,最初是为网站自动化测试而开发的。近几年,他还被广泛用于获取精确的网站快照,因为他们可以直接运行在浏览器上。Selenium可以让浏览器自动加载页面,获取需要的数据,甚至页面截屏,或者判断网站上某些动作上是否发生。
Selenium自己不带浏览器,它需要与第三方浏览器结合在一起使用。例如,可以在实验楼桌面上的Firefox浏览器上运行Selenium,可以直接看到一个FireFox窗口被打开,进入网站,然后执行你在代码中设置的动作。虽然使用Firefox浏览器看起来更清楚,但在本实验中我们采用 PhantomJS 来代替真实的浏览器结合使用。
安装 sudo pip3 install selenium测试是否都安装成功:

2.4 PhantomJS 简介
一个无头的浏览器,PhantomJS会把网站加载到内存并执行页面上的javascript,但是不会向用户展示网页的图形化界面,可以用来处理cookie、JavaScript及header信息,以及任何你需要浏览器协助完成的事情。
安装我们从阿里的镜像下载包,然后解压到你喜欢的目录,这里我们解压到/opt/。
wget https://npm.taobao.org/mirrors/phantomjs/phantomjs-2.1.1-linux-x86_64.tar.bz2sudo tar xjf phantomjs-2.1.1-linux-x86_64.tar.bz2 -C /opt/ 2.5 Ajax 信息加载
现在有很多页面都是采用 Ajax 加载数据,我们实验的目标网址也是这样的: 淘女郎
如果我们用传统的方法采集这个页面,只能获取加载前的页面,而我们真正需要的信息( Ajax 执行之后的页面)却抓不到,后续实验中可以看到效果的区别。
三、项目实现 3.1 本节目标本节实验中我们将分别按照如下步骤:
抓取淘宝MM 的姓名,封面图片,年龄、所在城市等信息 抓取每一个MM个人主页内的写真图片 把每一个MM的写真图片按照文件夹保存到本地 3.2 可行性分析淘女郎首页上的源码信息是公开的,本次实验仅仅是用来技术实践,并不带盈利性目的,也不将图片用于其他商业环境,并不会产生商业上的产权纠纷,所以这个项目是可行的。
3.3 程序结构 遍历淘女郎主页上所有 MM 抓取各个 MM 的姓名,封面图片,年龄、所在城市等信息 遍历MM 个人主页内的所有写真图片 把每 MM 的写真图片按照文件夹保存到本地 3.4 流程说明 通过Selenium Webdriver获得目标页面源码,之后通过BeautifulSoup解析概源码,通过正则表达式提取出模特名字、所在城市、身高、体重,个人主页、封面图片地址等信息,根据模特名字和城市建立文件夹。 再次通过Selenium Webdriver获得模特个人主页的页面源码,之后通过BeautifulSoup解析源码,通过正则获得页面艺术照的URL地址信息。 最后通过urllib内置库,打开图片地址,通过二进制读写的方式获得模特艺术照,并将艺术照存在相应文件夹里面。 3.5 获取信息模块实现 获得页面源码最简单的查看网页源码的方式就是在浏览器中右键选择审查元素,其他类型浏览器也是类似的:

而 Python 代码中的实现则是调用Selenium Webdriver和PhantomJS来模拟打开该页面源码,最后使用BeautifulSoup进行解析。
注意实验的时候,代码先不要直接写在脚本文件里,可以在交互模式的解释器里尝试一下代码,试着了解下运行原理。
我们先导入相关模块,然后设置一些变量(浏览器路径,起始页,输出目录,解析器名称):
import osimport threading
import re
from bs4 import BeautifulSoup
from urllib.request import urlopen
from selenium import webdriver
browserPath = '/opt/phantomjs-2.1.1-linux-x86_64/bin/phantomjs'
homePage = 'https://mm.taobao.com/search_tstar_model.htm?'
outputDir = 'photo/'
parser = 'html5lib'
现在我们来看看怎样模拟浏览器查看源码:
driver = webdriver.PhantomJS(executable_path=browserPath) #浏览器的地址driver.get(homePage) #访问目标网页地址
bsObj = BeautifulSoup(driver.page_source, parser) #解析目标网页的 Html 源码
这个过程就相当于右键的点击审查的过程。
driver = webdriver.PhantomJS(executable_path=browserPath)这里的意思是实例化一个PhantomJS浏览器对象,括号里面填的是浏览器的安装路径信息,填在单引号里面。selenium支持的浏览器类型有chrome、FireFox等,具体的自行查看webdriver的 API。
bsObj=BeautifulSoup(driver.page_source,parser)这里的driver.page_source意思是网页的全部 HTML 源码,包含的具体内容,可以通过print(driver.page_source)打印查看。
获得MM个人信息 girlsList = driver.find_element_by_id('J_GirlsList').text.split('\n') #获得主页上所有妹子的姓名、所在城市、身高、体重等信息
上面的截图可以发现,整个图片层次是在<ul class="girls-list clearfix" id="J_GirlsList">里面的通过J_GirlsList定位到这个层次,属性text包含网页中所有 HTML 标签的内容,类型为字符串,我们可以看看text里的东西是什么:
print(driver.find_element_by_id('J_GirlsList').text)而后面的split('\n')则会将属性text中的字符串以换行符分割,得到一个包含所有分割后的字符串的列表。
获得 MM 个人主页地址
girlsUrl = bsObj.find_all("a",{"href": re.compile("\/\/.*\.htm\?(userId=)\d*")}) #解析出妹子的个人主页地址等信息
BeautifulSoup 的具体内容我这里不会讲深入的,想详细了解的,可以去他们的官网查阅API,用到的方法稍后会进行分析。
find_all方法可以获得所有的你想通过定位获得的信息,可以使用 xml、xPath、正则表达式等语言来进行定位。
re.compile("\/\/.*\.htm\?(userId=)\d*")这里双引号里面各种斜杆和反斜杆的符号就是正则表达式,专门用来的做信息配对的,Python 的正则匹配引擎,有很多东西可以研究,大家有兴趣的话可以学习实验楼的 正则表达式 课程。
获得 MM 封面图片地址
imagesUrl = re.findall('\/\/gtd\.alicdn\.com\/sns_logo.*\.jpg',
driver.page_source) #获取所有妹子的封面图片
我们可以发现,妹子的封面图片的 url 都是形如//gtd.alicdn.com/sns_logo/xx/xxxxxx.jpg这样的字符串,这样我们就可以用正则表达式匹配它。
建立相应文件夹本部分代码用来创建保存照片的目录结构:
def mkdir(path):# 判断路径是否存在
isExists = os.path.exists(path)
# 判断结果
if not isExists:
# 如果不存在则创建目录
print(" [*]新建了文件夹", path)
# 创建目录操作函数
os.makedirs(path)
else:
# 如果目录存在则不创建,并提示目录已存在
print(' [+]文件夹', path, '已创建')
这里是一些基本的文件操作,判断文件夹是否存在,存在则不创建,不存在就创建文件夹。
获得MM个人页面源码这里前面的操作一样的原理:
driver = webdriver.PhantomJS(executable_path=browserPath)driver.get(url)
bsObj = BeautifulSo