爬虫实例——爬取淘女郎相册(通过selenium、PhantomJS、BeautifulSoup爬取)
环境
操作系统: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爬取)的更多相关文章
- 数据抓取的艺术(一):Selenium+Phantomjs数据抓取环境配置
数据抓取的艺术(一):Selenium+Phantomjs数据抓取环境配置 2013-05-15 15:08:14 分类: Python/Ruby 数据抓取是一门艺术,和其他软件不同,世界上 ...
- Selenium&PhantomJS 完成爬取网络代理
Selenium模块是一套完整的Web应用程序测试系统,它包含了测试的录制(SeleniumIDE).编写及运行(Selenium Remote Control)和测试的并行处理(Selenimu G ...
- 动态网页爬取例子(WebCollector+selenium+phantomjs)
目标:动态网页爬取 说明:这里的动态网页指几种可能:1)需要用户交互,如常见的登录操作:2)网页通过JS / AJAX动态生成,如一个html里有<div id="test" ...
- 动态网页爬取样例(WebCollector+selenium+phantomjs)
目标:动态网页爬取 说明:这里的动态网页指几种可能:1)须要用户交互,如常见的登录操作:2)网页通过JS / AJAX动态生成.如一个html里有<div id="test" ...
- selenium+phantomjs+pyquery 爬取淘宝商品信息
from selenium import webdriver from selenium.common.exceptions import TimeoutException from selenium ...
- Python 之selenium+phantomJS斗鱼抓取案例
from selenium import webdriver from bs4 import BeautifulSoup import time if __name__ == '__main__': ...
- scrapy爬虫实例(1)
爬虫实例 对象 阳光问政平台 目标 : 主题,时间,内容 爬取思路 预先设置好items import scrapy class SuperspiderItem(scrapy.Item): title ...
- Selenium+PhantomJS替代方案
问题描述: python3在使用selenium+PhantomJS动态抓取网页时,出现如下报错信息: UserWarning: Selenium support for PhantomJS has ...
- Selenium+PhantomJS使用时报错原因及解决方案
问题 今天在使用selenium+PhantomJS动态抓取网页时,出现如下报错信息: UserWarning: Selenium support for PhantomJS has been dep ...
随机推荐
- git branch 分支与合并
在使用 git 进行分支开发与合并的时候需要用到这些命令.其他基本 git 命令参考 Git 简易食用指南 git branch 查看分支 git branch 查看当前分支情况 创建分支 git b ...
- eos智能合约开发最佳实践
安全问题 1.可能的错误 智能合约终止 限制转账限额 限制速率 有效途径来进行bug修复和提升 2.谨慎发布智能合约 对智能合约进行彻底的测试 并在任何新的攻击手法被发现后及时制止 赏金计划和审计合约 ...
- 十四:Using CGroups with YARN
Cgroups可以控制linux 上应用程序的资源(内存.CPU)使用,yarn可以使用Cgroups来CPU使用.Cgroups的配置,在yarn-site.xml中设置: 1)启用Cgro ...
- default & delete
一.使用“=default” 1. 显式生成拷贝控制成员的合成版本 class A { public: A() = default; A(const A &) = default; A& ...
- 软工2017团队协作第七周——个人PSP
10.27 --11.2本周例行报告 1.PSP(personal software process )个人软件过程. 类型 任务 开始时间 结束时间 中断时间 实际用时 ...
- BluetoothAdapter解析
这篇文章将会详细解析BluetoothAdapter的详细api, 包括隐藏方法, 每个常量含义. 一 BluetoothAdapter简介 1.继承关系 该类仅继承了Object类; 2.该类作用 ...
- JavaScript初探系列之String的基本操作
1.字符串转换 字符串转换是最基础的要求和工作,你可以将任何类型的数据都转换为字符串,你可以用下面三种方法的任何一种: var myStr = num.toString(); // "19& ...
- [solution]xdebug正确配置,但不显示错误信息
一开始以为是配置问题,其实不是,折腾了好久,貌似中文网页很少有人提到这事,更别提解决之道! 最好还是用英文关键词google之:得如下网页 https://bugs.launchpad.net/ubu ...
- <Effective C++>读书摘要--Introduction
Introduction 1.Learning the fundamentals of a programming language is one thing; learning how to des ...
- 微信小程序wx.pageScrollTo的替代方案
wx.pageScrollTo这个微信小程序的api功能如下: 简而言之就是实现页面滚动的.但是在实际应用当中显得有些鸡肋,为啥呢?使用中有明显页面有明显的抖动,这无疑是极不好的用户体验.我用的华为6 ...