使用selenium实现简单网络爬虫抓取MM图片

  撸主听说有个网站叫他趣,里面有个社区,其中有一项叫他趣girl,撸主点进去看了下,还真不错啊,图文并茂,宅男们自己去看看就知道啦~

  接下来当然就是爬取这些妹子的图片啦,不仅仅是图片,撸主发现里面的对话也很有意思,于是把对话也一并抓取下来好了。

  那么问题来了,用什么工具呢?在之前的练习中已经用过urllib2,正则表达式匹配实在麻烦,这次来点稍微高级的,试试selenium;

  selenium是什么?其实它是一个web自动化测试的工具,运行起来就跟我们自己操作浏览器差不多,废话不多说,下面开始。

  工具:python2.7 + selenium2 python版

  1 首先导入需要的模块,然后定义本地存放目录

 1 # coding: utf-8
 2
 3 from selenium import webdriver
 4 from selenium.common.exceptions import NoSuchElementException
 5 from time import *
 6 import os
 7 import urllib2
 8
 9 # 文件保存路径
10 file_path = r‘F:\taqu‘

  2 然后还是定义3个函数,分别用来为每个girl创建目录,保存每个girl的图片,保存每个girl的文本描述和对话;其中在保存图片的时候还是用到了urllib2

# ------------定义3个函数,用来创建每个girl的目录、保存图片、写入文本描述及对话----------------
def mkdir_for_girl(path, name):
    """
    创建以标题命令的目录
    :param name: 目录名称
    :return: 返回创建的目录路径
    """
    path = os.path.join(path, name)
    if not os.path.exists(path):
        os.mkdir(path)
    return path

def save_pictures(path, url_list):
    """
    保存图片到本地指定文件夹
    :param path: 保存图片的文件夹,由mkdir_for_girl返回
    :param url_list: 待保存图片的url列表
    :return: none
    """
    for (index, url) in enumerate(url_list):
        try:
            print u‘%s 正在保存第%d张图片‘ % (ctime(), index)
            pic_name = str(index) + ‘.jpg‘
            file_name = os.path.join(path, pic_name)
            # 如果存在该图片则不保存
            if os.path.exists(file_name):
                print u‘%s 该图片已经存在‘ % ctime()
                continue
            req = urllib2.Request(url, headers={‘User-Agent‘:  r‘Mozilla/5.0 (Windows NT 6.1; WOW64; rv:45.0) Gecko/20100101 Firefox/45.0‘})
            data = urllib2.urlopen(req, timeout=30).read()
            f = open(file_name, ‘wb‘)
            f.write(data)
            f.close()
        except Exception, e:
            print u‘%s 第%d张图片保存失败,不处理,跳过继续处理下一张‘ % (ctime(), index)

def write_text(path, info):
    """
    在path目录中创建txt文件,将info信息(girl的文本描述和对话)写入txt文件中
    :param path: 保存txt文件的目录,由mkdir_for_girl返回
    :param info: 要写入txt的文本内容
    :return: none
    """
    # 创建/打开info.txt文件,并写入内容
    filename = os.path.join(path, ‘info.txt‘)

    with open(filename, ‘a+‘) as fp:
        fp.write(info.encode(‘utf-8‘))
        fp.write(‘\n‘.encode(‘utf-8‘))
        fp.write(‘\n‘.encode(‘utf-8‘))

  3 定义webdirver,打开目标网页,其中切换到目标页面使用了超链接文本定位元素

# -----------------------打开页面,设置超时时间,窗口最大化-----------------------
driver = webdriver.Firefox()
driver.implicitly_wait(10)
driver.maximize_window()
driver.get(r‘http://www.taqu.cn/community/‘)

# -----------------------切换到“他趣Girl”页面-----------------------
driver.find_element_by_partial_link_text(u‘他趣Girl‘).click()

  4 由于所有girl都在一个页面中,但是这个页面很长很长,真的很长,需要滑动很久才能滑到底部,为什么要滑动到底部呢?

因为浏览器获取的HTML源码,只有当前窗口已显示元素的代码,未显示部分的代码没有,当然selenium也定位不到那些元素了;

所以说,如果要selenium能找到所有girl,先要把页面滑动到底部,等所有girl都加载完,才能获取到包含所有girl的HTML代码。

  那么问题来了,怎么滑动页面呢,通过浏览器的滚动条,但是滚动条不是HTML元素,selenium不能直接控制,这里就得借助

javascript了,在selenium中执行js代码还是可以的,具体实现看代码:

# -----------------------滑动到窗口最底部,以将所有的girl都刷新出来-----------------------
# 由于页面很长,并且需要不断下拉才会刷新,因此通过javascript来控制器滚动条向下滑动
# 但是一次滑动并不能到达底部,需要多次,那么需要多少次呢?这里采用的方式是不停的向下
# 滑动,每滑动一次,都查询下是否到达底部,怎么查询呢?这是通过查到底部的一个标志图片来判断,
# 如果没找到标志,就说明还没到达底部,需要继续滑动,如果找到就跳出循环
# 为了快速滑动,先设置超时时间为1秒driver.implicitly_wait(1)
# 不停的滑啊滑
while True:
    driver.execute_script("window.scrollTo(0,document.body.scrollHeight)")
    try:
        # 定位页面底部的一个图片
        driver.find_element_by_xpath(".//*[@id=‘waterfall-loading‘]/img[@src=‘/img/no-more.png‘]")
        # 如果没抛出异常就说明找到了底部标志,跳出循环
        break
    except NoSuchElementException as e:
        # 抛出异常说明没找到底部标志,继续向下滑动
        pass

# 将超时时间改回10秒
driver.implicitly_wait(10)

  5 获取到整个完整的页面后,就可以一次找出所有的girl封面图片了,这些封面图片是可以点击的,一点就打开了该girl的所有图片和对话,

  这里使用的是CSS选择器,比起xpath,撸主更喜欢CSS一些

# -----------------------找到所有girl的封面图片-----------------------
# 这些封面图片是可点击的,单击都会弹出该girl的所有图片和文字描述
girls = driver.find_elements_by_css_selector("div#container img")
num = len(girls)
print u"girl总数为:%d" % num

  6 最后一步了,遍历所有的封面图片,依次点击,然后抓取保存每一个girl的图片和对话,保存到本地

# -----------------------依次点击每张封面,提取每个girl的信息-----------------------
for girl in girls:
    # 依次点击每一个girl的封面
    girl.click()

    # 每点击一个girl后,都再点击一下弹出框,以更新driver,不然driver中的缓存还是上一个girl的
    # 一定要注意这一步啊,撸主当时没有做这一步,折腾了好久
    driver.find_element_by_xpath("html/body/div[3]/div[2]").click()

    # 提取标题,由于标题中的字符:和|不能作为文件名,将他们替换了
    title = driver.find_element_by_css_selector("p.waterfall-detail-header-title").text
    title = title.encode(‘utf-8‘)
    title = title.replace(":", ":")
    title = title.replace("|", "丨")
    title = title.decode(‘utf-8‘)

    # 在file_path目录下,为该girl创建以标题命名的目录
    path = mkdir_for_girl(file_path, title)

    # 提取该girl所有图片的URL
    pics = driver.find_elements_by_css_selector("div.water-detail-content img")
    pic_url = [x.get_attribute(‘src‘) for x in pics]
    print u‘该girl的图片总数为:%d‘ % len(pic_url)

    # 保存图片到本地以该girl标题命名的目录中
    save_pictures(path, pic_url)

    # 提取girl的基本介绍,并写入info.txt文件
    info = driver.find_element_by_xpath("html/body/div[3]/div[2]/div[2]/div[2]").text
    write_text(path, info)

    # 提取所有对话,写入info.txt文件
    talks = driver.find_elements_by_css_selector("div.water-detail-content p")
    for t in talks:
        write_text(path, t.text)

    # 关闭该girl的图片
    driver.find_element_by_xpath("html/body/div[3]/div[2]/div[1]/div/img").click()
    print u‘该girl信息提取完成,继续处理下一个‘
    sleep(1)

# -----------------------所有girl信息提取完成-----------------------
driver.close()
print u‘恭喜,所有girl信息提取完成!‘

  7 试着运行下,看下输出,是不是有点小激动

girl总数为:90
该girl的图片总数为:12
Sat May 14 09:24:54 2016 正在保存第0张图片
Sat May 14 09:24:54 2016 正在保存第1张图片
Sat May 14 09:24:54 2016 正在保存第2张图片
。
。省略很多
。
Sat May 14 09:33:36 2016 正在保存第9张图片
Sat May 14 09:33:37 2016 正在保存第10张图片
Sat May 14 09:33:37 2016 正在保存第11张图片
该girl信息提取完成,继续处理下一个
恭喜,所有girl信息提取完成!

  8 再看下本地目录,是不是很激动?

  说明:上面的代码是完整的,将所有的分段合并在一起就可以运行了。这里可以看到,selenium是很强大的,不仅仅是web自动化工具哦,

还是爬虫利器呢;但是,但是这里有个缺点就是,selenium会打开浏览器UI,这样操作起来就有点偏慢了,有没有更好的解决方案呢?---有的!

时间: 2024-08-01 19:02:23

使用selenium实现简单网络爬虫抓取MM图片的相关文章

[Python学习] 简单网络爬虫抓取博客文章及思想介绍

        前面一直强调Python运用到网络爬虫方面非常有效,这篇文章也是结合学习的Python视频知识及我研究生数据挖掘方向的知识.从而简单介绍下Python是如何爬去网络数据的,文章知识非常简单,但是也分享给大家,就当简单入门吧!同时只分享知识,希望大家不要去做破坏网络的知识或侵犯别人的原创型文章.主要包括: 1.介绍爬取CSDN自己博客文章的简单思想及过程 2.实现Python源码爬取新浪韩寒博客的316篇文章 一.爬虫的简单思想      最近看刘兵的<Web数据挖掘>知道,在研

使用Python编写简单网络爬虫抓取视频下载资源

我第一次接触爬虫这东西是在今年的5月份,当时写了一个博客搜索引擎.所用到的爬虫也挺智能的,起码比电影来了这个站用到的爬虫水平高多了! 回到用Python写爬虫的话题. Python一直是我主要使用的脚本语言,没有之中的一个. Python的语言简洁灵活,标准库功能强大.寻常能够用作计算器,文本编码转换,图片处理,批量下载,批量处理文本等.总之我非常喜欢,也越用越上手,这么好用的一个工具,一般人我不告诉他.. .很多其它网络编程教程请上网维教程网 由于其强大的字符串处理能力,以及urllib2,c

如何利用Python网络爬虫抓取微信好友数量以及微信好友的男女比例

前几天给大家分享了利用Python网络爬虫抓取微信朋友圈的动态(上)和利用Python网络爬虫爬取微信朋友圈动态--附代码(下),并且对抓取到的数据进行了Python词云和wordart可视化,感兴趣的伙伴可以戳这篇文章:利用Python词云和wordart可视化工具对朋友圈数据进行可视化. 今天我们继续focus on微信,不过这次给大家带来的是利用Python网络爬虫抓取微信好友总数量和微信好友男女性别的分布情况.代码实现蛮简单的,具体的教程如下. 相信大家都知道,直接通过网页抓取微信的数据

Python3简单爬虫抓取网页图片

现在网上有很多python2写的爬虫抓取网页图片的实例,但不适用新手(新手都使用python3环境,不兼容python2),所以我用Python3的语法写了一个简单抓取网页图片的实例,希望能够帮助到大家,并希望大家批评指正. 1 import urllib.request 2 import re 3 import os 4 import urllib 5 #根据给定的网址来获取网页详细信息,得到的html就是网页的源代码 6 def getHtml(url): 7 page = urllib.r

如何利用Python网络爬虫抓取微信朋友圈的动态(上)

今天小编给大家分享一下如何利用Python网络爬虫抓取微信朋友圈的动态信息,实际上如果单独的去爬取朋友圈的话,难度会非常大,因为微信没有提供向网易云音乐这样的API接口,所以很容易找不到门.不过不要慌,小编在网上找到了第三方工具,它可以将朋友圈进行导出,之后便可以像我们正常爬虫网页一样进行抓取信息了. [出书啦]就提供了这样一种服务,支持朋友圈导出,并排版生成微信书.本文的主要参考资料来源于这篇博文:https://www.cnblogs.com/sheng-jie/p/7776495.html

利用Python网络爬虫抓取微信好友的所在省位和城市分布及其可视化

前几天给大家分享了如何利用Python网络爬虫抓取微信好友数量以及微信好友的男女比例,感兴趣的小伙伴可以点击链接进行查看.今天小编给大家介绍如何利用Python网络爬虫抓取微信好友的省位和城市,并且将其进行可视化,具体的教程如下. 爬取微信好友信息,不得不提及这个itchat库,简直太神奇了,通过它访问微信好友基本信息可谓如鱼得水.下面的代码是获取微信好友的省位信息: 程序运行之后,需要扫描进行授权登录,之后在Pycharm的控制台上会出现如下图的红色提示,这些红色的字体并不是我们通常遇到的Py

利用Python网络爬虫抓取微信好友的签名及其可视化展示

前几天给大家分享了如何利用Python词云和wordart可视化工具对朋友圈数据进行可视化,利用Python网络爬虫抓取微信好友数量以及微信好友的男女比例,以及利用Python网络爬虫抓取微信好友的所在省位和城市分布及其可视化,感兴趣的小伙伴可以点击进去看看详情,内容方面不是很难,即使你是小白,也可以通过代码进行实现抓取.今天,小编继续给大家分享如何利用Python网络爬虫抓取微信好友的签名及其可视化展示,具体的教程如下所示. 1.代码实现还是基于itchat库,关于这个神奇的库,在之前的文章中

抓取MM图片的爬虫

刚学python,试着写了个非常简单的爬虫,爬一些MM的鲍照下来.记录一下 #coding=utf-8 import urllib,time import re global x x=0 def getHtml(url): page = urllib.urlopen(url) html = page.read() return html def getImg(html): global x reg = r'original=\'(.+?.jpg)\' width' imgre = re.comp

Python爬虫抓取网页图片

本文通过python 来实现这样一个简单的爬虫功能,把我们想要的图片爬取到本地. 下面就看看如何使用python来实现这样一个功能. # -*- coding: utf-8 -*- import urllib import re import time import os #显示下载进度 def schedule(a,b,c): ''''' a:已经下载的数据块 b:数据块的大小 c:远程文件的大小 ''' per = 100.0 * a * b / c if per > 100 : per =