环境

操作系统:CentOS 6.7 32-bit

Python版本:2.6.6

第三方插件

selenium

PhantomJS

BeautifulSoup

代码

# -*- coding: utf-8 -*-
import sys
reload(sys)
sys.setdefaultencoding('utf-8')
'''
作者:昨夜星辰
'''
import re
import os
import time
import shutil
import requests
import subprocess
from bs4 import BeautifulSoup
from selenium import webdriver # 拼接url
def joint_url(string):
return 'https:' + string # 判断文件夹是否存在,如果存在就删除,否则就创建。
def create_folder(path):
if os.path.exists(path):
if os.path.isdir(path):
shutil.rmtree(path)
else:
os.remove(path)
os.mkdir(path) root_folder = '淘女郎'
create_folder(root_folder)
url = 'https://mm.taobao.com/json/request_top_list.htm?page=1'
browser = webdriver.PhantomJS()
browser.get(url)
bs = BeautifulSoup(browser.page_source, 'lxml')
for top in bs('p', 'top'):
mm_url = joint_url(top.find('a')['href'])
mm_name = top.find('a').text
mm_age = top.find('em').text
mm_city = top.find('span').text
mm_folder = '%s/%s' % (root_folder, mm_name)
create_folder(mm_folder)
print '发现一位美眉,她叫做%s,今年%s,住在%s,现在开始爬取她的个人页面……' % (mm_name, mm_age, mm_city)
browser.get(mm_url)
bs1 = BeautifulSoup(browser.page_source, 'lxml')
base_info = bs1.find('ul', 'mm-p-info-cell clearfix')
info_list = base_info('span')
result = []
result.append('昵称:' + info_list[0].text)
result.append('生日:' + info_list[1].text.strip())
result.append('所在城市:' + info_list[2].text)
result.append('职业:' + info_list[3].text)
result.append('血型:' + info_list[4].text)
result.append('学校/专业:' + info_list[5].text)
result.append('风格:' + info_list[6].text)
result.append('身高:' + base_info.find('li', 'mm-p-small-cell mm-p-height').find('p').text)
result.append('体重:' + base_info.find('li', 'mm-p-small-cell mm-p-weight').find('p').text)
result.append('三围:' + base_info.find('li', 'mm-p-small-cell mm-p-size').find('p').text)
result.append('罩杯:' + base_info.find('li', 'mm-p-small-cell mm-p-bar').find('p').text)
result.append('鞋码:' + base_info.find('li', 'mm-p-small-cell mm-p-shose').find('p').text)
print '资料收集完毕,正在保存她的个人资料……'
filename = '%s/%s.txt' % (mm_folder, mm_name)
with open(filename, 'w') as f:
f.write('\r\n'.join(result))
print '保存完毕!现在开始爬取她的个人相册……'
album_menu_url = joint_url(bs1.find('ul', 'mm-p-menu').find('a')['href'])
browser.get(album_menu_url)
time.sleep(3)
bs2 = BeautifulSoup(browser.page_source, 'lxml')
album_number = 1
for album_info in bs2('div', 'mm-photo-cell-middle'):
album_url = joint_url(album_info.find('h4').find('a')['href'])
album_name = album_info.find('h4').find('a').text.strip()
album_size = album_info.find('span', 'mm-pic-number').text
print '现在开始爬取她的第%d个相册,相册名为:《%s》%s……' % (album_number, album_name, album_size)
browser.get(album_url)
js1 = 'return document.body.scrollHeight'
js2 = 'window.scrollTo(0, document.body.scrollHeight)'
old_scroll_height = 0
while(browser.execute_script(js1) > old_scroll_height):
old_scroll_height = browser.execute_script(js1)
browser.execute_script(js2)
time.sleep(3)
bs3 = BeautifulSoup(browser.page_source, 'lxml')
photo_number = 1
for photo_area in bs3('div', 'mm-photoimg-area'):
print '现在开始下载她这个相册的第%d张图片……' % photo_number,
photo_url = joint_url(photo_area.find('a')['href'])
browser.get(photo_url)
bs4 = BeautifulSoup(browser.page_source, 'lxml')
big_img_url = joint_url(bs4.find('img', id='J_MmBigImg')['src'])
content = requests.get(big_img_url).content
filename = '%s/%d.jpg' % (mm_folder, photo_number)
with open(filename, 'wb') as f:
f.write(content)
print '下载完毕!'
photo_number += 1
album_number += 1

爬虫实例——爬取淘女郎相册(通过selenium、PhantomJS、BeautifulSoup爬取)的更多相关文章

  1. 数据抓取的艺术(一):Selenium+Phantomjs数据抓取环境配置

     数据抓取的艺术(一):Selenium+Phantomjs数据抓取环境配置 2013-05-15 15:08:14 分类: Python/Ruby     数据抓取是一门艺术,和其他软件不同,世界上 ...

  2. Selenium&PhantomJS 完成爬取网络代理

    Selenium模块是一套完整的Web应用程序测试系统,它包含了测试的录制(SeleniumIDE).编写及运行(Selenium Remote Control)和测试的并行处理(Selenimu G ...

  3. 动态网页爬取例子(WebCollector+selenium+phantomjs)

    目标:动态网页爬取 说明:这里的动态网页指几种可能:1)需要用户交互,如常见的登录操作:2)网页通过JS / AJAX动态生成,如一个html里有<div id="test" ...

  4. 动态网页爬取样例(WebCollector+selenium+phantomjs)

    目标:动态网页爬取 说明:这里的动态网页指几种可能:1)须要用户交互,如常见的登录操作:2)网页通过JS / AJAX动态生成.如一个html里有<div id="test" ...

  5. selenium+phantomjs+pyquery 爬取淘宝商品信息

    from selenium import webdriver from selenium.common.exceptions import TimeoutException from selenium ...

  6. Python 之selenium+phantomJS斗鱼抓取案例

    from selenium import webdriver from bs4 import BeautifulSoup import time if __name__ == '__main__': ...

  7. scrapy爬虫实例(1)

    爬虫实例 对象 阳光问政平台 目标 : 主题,时间,内容 爬取思路 预先设置好items import scrapy class SuperspiderItem(scrapy.Item): title ...

  8. Selenium+PhantomJS替代方案

    问题描述: python3在使用selenium+PhantomJS动态抓取网页时,出现如下报错信息: UserWarning: Selenium support for PhantomJS has ...

  9. Selenium+PhantomJS使用时报错原因及解决方案

    问题 今天在使用selenium+PhantomJS动态抓取网页时,出现如下报错信息: UserWarning: Selenium support for PhantomJS has been dep ...

随机推荐

  1. 第六模块:WEB框架开发 第1章·Django框架开发88~128

    88-Ajax简介 89-Ajax的简单实现 90-基于Ajax的传递数据 91-基于Ajax的登录验证 92-基于Form表单的文件上传 93-请求头之contentType 94-Ajax传递js ...

  2. TW实习日记:第31-32天

    不知不觉的,实习的净工作天数,已经都超过一个月了.因为对工作内容不是很满意,所以打算月底离职,也不知道是公司太缺人还是我真的能干活,领导竟然三番两次找我让我再考虑...明天又要找我了,哎...随机应变 ...

  3. a链接传参的方法

    //获取分案编号 var hrefVal=window.location.href.split("?")[1]; //得到id=楼主 //console.log(hrefVal+& ...

  4. 【20180807模拟测试】tree

    题目描述 或许会传送失败的传送门 #分析 考虑如何才能让白边显得更(不)重要,即在每条白边上(加上)减去一个值. 我们可以二分这个值,然后用寻常方法做最小生成树.统计在此最小生成树里有多少白 边. 然 ...

  5. 2.hadoop基本配置,本地模式,伪分布式搭建

    2. Hadoop三种集群方式 1. 三种集群方式 本地模式 hdfs dfs -ls / 不需要启动任何进程 伪分布式 所有进程跑在一个机器上 完全分布式 每个机器运行不同的进程 2. 服务器基本配 ...

  6. HDU 3062 Party(2-SAT模版题)

    Problem Description 有n对夫妻被邀请参加一个聚会,因为场地的问题,每对夫妻中只有1人可以列席.在2n 个人中,某些人之间有着很大的矛盾(当然夫妻之间是没有矛盾的),有矛盾的2个人是 ...

  7. jquery中的$(document).ready()、JavaScript中的window.onload()以及body中的onload()、DomContentLoaded()区别

    $().ready().$(handler).$(document).ready(handler)均不是原生JS中的,都是jQuery中封装的方法.这些事件在当页面的dom节点加载完毕后就执行,无需等 ...

  8. Python中的赋值语法

    Python中复制语法有6种 Basic Form >>>spam = 'spam' Tuple assignment >>>spam, ham = 'spam', ...

  9. iOS开发解决页面滑动返回跟scrollView左右划冲突

    -(BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithG ...

  10. 【Redis】- 延时任务

    引言 在开发中,往往会遇到一些关于延时任务的需求.例如 生成订单30分钟未支付,则自动取消 生成订单60秒后,给用户发短信 对上述的任务,我们给一个专业的名字来形容,那就是延时任务.那么这里就会产生一 ...