爬虫实例——爬取淘女郎相册(通过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
时间: 2024-12-11 17:43:15

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

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

数据抓取的艺术(一):Selenium+Phantomjs数据抓取环境配置 2013-05-15 15:08:14 分类: Python/Ruby 数据抓取是一门艺术,和其他软件不同,世界上不存在完美的.一致的.通用的抓取工具.为了不同的目的,需要定制不同的代码.不过,我们不必Start from Scratch,已经有许多的基本工具.基本方法和基础框架可供使用.不同的工具.不同的方法.不同的框架的特点也不同.了解这些工具.方法和框架是首要任务,接下来就需要明白它们的差异都在哪里.什么情境该用什

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

目标:动态网页爬取 说明:这里的动态网页指几种可能:1)需要用户交互,如常见的登录操作:2)网页通过JS / AJAX动态生成,如一个html里有<div id="test"></div>,通过JS生成<div id="test"><span>aaa</span></div>. 这里用了WebCollector 2进行爬虫,这东东也方便,不过要支持动态关键还是要靠另外一个API -- selen

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

目标:动态网页爬取 说明:这里的动态网页指几种可能:1)须要用户交互,如常见的登录操作:2)网页通过JS / AJAX动态生成.如一个html里有<div id="test"></div>,通过JS生成<div id="test"><span>aaa</span></div>. 这里用了WebCollector 2进行爬虫,这东东也方便,只是要支持动态关键还是要靠另外一个API -- selen

爬虫实例(二):多线程,多进程对网页的爬取

采用多线程对韩寒的微博进行爬取,这个只是不需要进行模拟登陆的: 1 #--coding:utf-8--- 2 #!/usr/bin/env python 3 import urllib 4 import os 5 import re 6 import time 7 from threading import Thread 8 from multiprocessing import Process 9 10 def downloadURL(urls,dirpath): 11 ##在之前中分装一个l

python利用selenium+requests+beautifulsoup爬取12306火车票信息

在高速发展的时代.乘车出远门是必不可少的,有些查询信息是要收费的.这里打造免费获取火车票信息 想要爬取12306火车票信息,访问12306官方网站,输入出发地,目的地  ,时间  之后点击确定,这是我们打开谷歌浏览器开发者模式找到   https://kyfw.12306.cn/otn/resources/js/framework/station_name.js    这里包含了所有城市的信息和所有城市的缩写字母.想要获取火车票信息  https://kyfw.12306.cn/otn/left

爬虫实例——爬取淘女郎的相册(通过谷歌浏览器的开发者工具找出规律快速爬取)

用正常的方式(selenium.PhantomJS.BeautifulSoup)爬取淘女郎相册不仅困难,效率很低,而且很容易卡死. 我通过谷歌浏览器的开发者工具找出每个页面的规律,快速获取每张照片的链接,再下载,这样效率就很高了. 过程 首页很简单,没有采用JS渲染,直接用requests就能获取完整的源代码,没什么说的. 淘女郎首页采用了JS渲染,直接用requests是获取不到完整的源代码的,此时可以打开谷歌浏览器的开发者工具,主要看“Network”,筛选出“XHR”,如下图: 从上图可知

数据抓取的艺术(三):抓取Google数据之心得

本来是想把这部分内容放到前一篇<数据抓取的艺术(二):数据抓取程序优化>之中.但是随着任务的完成,我越来越感觉到其中深深的趣味,现总结如下: (1)时间     时间是一个与抓取规模相形而生的因素,数据规模越大,时间消耗往往越长.所以程序优化变得相当重要,要知道抓取时间越长,出错的可能性就越大,这还不说程序需要人工干预的情境.一旦运行中需要人工干预,时间越长,干预次数越多,出错的几率就更大了.在数据太多,工期太短的情况下,使用多线程抓取,也是一个好办法,但这会增加程序复杂度,对最终数据准确性产

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

问题今天在使用selenium+PhantomJS动态抓取网页时,出现如下报错信息: UserWarning: Selenium support for PhantomJS has been deprecated, please use headless versions of Chrome or Firefox instead warnings.warn('Selenium support for PhantomJS has been deprecated, please use headle

python爬虫实例详细介绍之爬取大众点评的数据

python 爬虫实例详细介绍之爬取大众点评的数据 一. Python作为一种语法简洁.面向对象的解释性语言,其便捷性.容易上手性受到众多程序员的青睐,基于python的包也越来越多,使得python能够帮助我们实现越来越多的功能.本文主要介绍如何利用python进行网站数据的抓取工作.我看到过利用c++和Java进行爬虫的代码,c++的代码很复杂,而且可读性.可理解性较低,不易上手,一般是那些高手用来写着玩加深对c++的理解的,这条路目前对我们不通.Java的可读性还可以,就是代码冗余比较多,