Python抓取花瓣网高清美图 - 狙击手+

jiaoyu121 2021-11-05 原文


Python抓取花瓣网高清美图

养眼的妹子图哦

一:前言

嘀嘀嘀,上车请刷卡。昨天看到了不错的图片分享网——花瓣,里面的图片质量还不错,所以利用selenium+xpath我把它的妹子的栏目下爬取了下来,以图片栏目名称给文件夹命名分类保存到电脑中。这个妹子主页http://huaban.com/boards/favorite/beauty 是动态加载的,如果想获取更多内容可以模拟下拉,这样就可以更多的图片资源。这种之前爬虫中也做过,但是因为网速不够快所以我就抓了19个栏目,一共500多张美图,也已经很满意了。

先看看效果:

Paste_Image.png

Paste_Image.png

二:运行环境

  • IDE:Pycharm
  • Python3.6
  • lxml 3.7.2
  • Selenium 3.4.0
  • requests 2.12.4

三:实例分析

1.这次爬虫我开始做的思路是:进入这个网页http://huaban.com/boards/favorite/beauty然后来获取所有的图片栏目对应网址,然后进入每一个网页中去获取全部图片。(如下图所示)

Paste_Image.png

Paste_Image.png

2.但是爬取获取的图片分辨率是236×354,图片质量不够高,但是那个时候已经是晚上1点30之后了,所以第二天做了另一个版本:在这个基础上再进入每个缩略图对应的网页,再抓取像下面这样高清的图片。

Paste_Image.png

四:实战代码

1.第一步导入本次爬虫需要的模块

__author__ = \'布咯咯_rieuse\'
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.ui import WebDriverWait
from selenium import webdriver
import requests
import lxml.html
import os

2.下面是设置webdriver的种类,就是使用什么浏览器进行模拟,可以使用火狐来看它模拟的过程,也可以是无头浏览器PhantomJS来快速获取资源,[\’–load-images=false\’, \’–disk-cache=true\’]这个意思是模拟浏览的时候不加载图片和缓存,这样运行速度会加快一些。WebDriverWait标明最大等待浏览器加载为10秒,set_window_size可以设置一下模拟浏览网页的大小。有些网站如果大小不到位,那么一些资源就不加载出来。

# SERVICE_ARGS = [\'--load-images=false\', \'--disk-cache=true\']
# browser = webdriver.PhantomJS(service_args=SERVICE_ARGS)
browser = webdriver.Firefox()
wait = WebDriverWait(browser, 10)
browser.set_window_size(1400, 900)

3.parser(url, param)这个函数用来解析网页,后面有几次都用用到这些代码,所以直接写一个函数会让代码看起来更整洁有序。函数有两个参数:一个是网址,另一个是显性等待代表的部分,这个可以是网页中的某些板块,按钮,图片等等…

def parser(url, param):
    browser.get(url)
    wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, param)))
    html = browser.page_source
    doc = lxml.html.fromstring(html)
    return doc

4.下面的代码就是解析本次主页面http://huaban.com/boards/favorite/beauty/ 然后获取到每个栏目的网址和栏目的名称,使用xpath来获取栏目的网页时,进入网页开发者模式后,如图所示进行操作。之后需要用栏目名称在电脑中建立文件夹,所以在这个网页中要获取到栏目的名称,这里遇到一个问题,一些名称不符合文件命名规则要剔除,我这里就是一个 * 影响了。

def get_main_url():
    print(\'打开主页搜寻链接中...\')
    try:
        doc = parser(\'http://huaban.com/boards/favorite/beauty/\', \'#waterfall\')
        name = doc.xpath(\'//*[@id="waterfall"]/div/a[1]/div[2]/h3/text()\')
        u = doc.xpath(\'//*[@id="waterfall"]/div/a[1]/@href\')
        for item, fileName in zip(u, name):
            main_url = \'http://huaban.com\' + item
            print(\'主链接已找到\' + main_url)
            if \'*\' in fileName:
                fileName = fileName.replace(\'*\', \'\')
            download(main_url, fileName)
    except Exception as e:
        print(e)

Paste_Image.png

5.前面已经获取到栏目的网页和栏目的名称,这里就需要对栏目的网页分析,进入栏目网页后,只是一些缩略图,我们不想要这些低分辨率的图片,所以要再进入每个缩略图中,解析网页获取到真正的高清图片网址。这里也有一个地方比较坑人,就是一个栏目中,不同的图片存放dom格式不一样,所以我这样做

img_url = doc.xpath(\'//*[@id="baidu_image_holder"]/a/img/@src\')
img_url2 = doc.xpath(\'//*[@id="baidu_image_holder"]/img/@src\')

这就把两种dom格式中的图片地址都获取了,然后把两个地址list合并一下。img_url +=img_url2
在本地创建文件夹使用filename = \'image\{}\\'.format(fileName) + str(i) + \'.jpg\'表示文件保存在与这个爬虫代码同级目录image下,然后获取的图片保存在image中按照之前获取的栏目名称的文件夹中。

def download(main_url, fileName):
    print(\'-------准备下载中-------\')
    try:
        doc = parser(main_url, \'#waterfall\')
        if not os.path.exists(\'image\\\' + fileName):
            print(\'创建文件夹...\')
            os.makedirs(\'image\\\' + fileName)
        link = doc.xpath(\'//*[@id="waterfall"]/div/a/@href\')
        # print(link)
        i = 0
        for item in link:
            i += 1
            minor_url = \'http://huaban.com\' + item
            doc = parser(minor_url, \'#pin_view_page\')
            img_url = doc.xpath(\'//*[@id="baidu_image_holder"]/a/img/@src\')
            img_url2 = doc.xpath(\'//*[@id="baidu_image_holder"]/img/@src\')
            img_url +=img_url2
            try:
                url = \'http:\' + str(img_url[0])
                print(\'正在下载第\' + str(i) + \'张图片,地址:\' + url)
                r = requests.get(url)
                filename = \'image\\{}\\\'.format(fileName) + str(i) + \'.jpg\'
                with open(filename, \'wb\') as fo:
                    fo.write(r.content)
            except Exception:
                print(\'出错了!\')
    except Exception:
        print(\'出错啦!\')


if __name__ == \'__main__\':
    get_main_url()

五:总结

这次爬虫继续练习了Selenium和xpath的使用,在网页分析的时候也遇到很多问题,只有不断练习才能把自己不会部分减少,当然这次爬取了500多张妹纸还是挺养眼的。

学习过程中遇到什么问题或者想获取学习资源的话,欢迎加入学习交流群
626062078,我们一起学Python!

发表于
2017-06-12 14:21 
狙击手+ 
阅读(9008
评论(3
编辑 
收藏 
举报

 

版权声明:本文为jiaoyu121原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/jiaoyu121/p/6992814.html

Python抓取花瓣网高清美图 - 狙击手+的更多相关文章

  1. 网络协议 12 – HTTP 协议:常用而不简单

    网络协议五层通天路,咱们从物理层、到链路层、网络层、再到传输层,现在又进一步,来到了应用层。这也是我们五层协议 […]...

  2. 解决iPhone网络软件在睡眠情况断线问题 – Mr.Xer

    解决iPhone网络软件在睡眠情况断线问题 2011-12-12 13:52  Mr.Xer  阅读(454) […]...

  3. 科学发明家特斯拉传记 – exce4

    科学发明家特斯拉传记 科学发明家特斯拉传记 //为了方便阅读,所以我根据矿业大学的PDF版本,使用<汉王 […]...

  4. eclipse老运行上一个程序之原因总结 – 白包子

    eclipse老运行上一个程序之原因总结 运行eclipse有的时候不运行刚写的类,老是运行别的以前的类,删除 […]...

  5. 随机测试 – 测试者家园

    随机测试 作者:天网 原文如下: 随机测试是这样一种测试,在测试中,测试数据是随机产生的。举例来说,我们测试一 […]...

  6. Apache服务器的下载与安装 – 叶是风的眼泪

    Apache服务器的下载与安装 第一步:打开Apache官网:http://www.apache.org/,点 […]...

  7. iOS 文字转化成图片 – 我就是一种相逢

    iOS 文字转化成图片   //文字转化成图片 -(UIImage *)imageFromText:(NSAr […]...

  8. Oracle 备份与恢复 – weiguoyuan

    Oracle 备份与恢复 逻辑备份及恢复: 用exp命令,将数据库、表等内容导入到备份文件中。 恢复时用imp […]...

随机推荐

  1. 使用css3背景渐变中的透明度来设置不同颜色的背景渐变

    为了添加透明度,我们使用 rgba() 函数来定义颜色结点。rgba() 函数中的最后一个参数可以是从 0 到 […]...

  2. html 基础代码及简单框架

    一、代码 1、背景设置为图片:<body style=”background-image: […]...

  3. mongoDB5–mongoDB增删改查 – gaomatlab

    mongoDB5–mongoDB增删改查 之前我们探讨了mongodb的“增删改查”,要知道,我们 […]...

  4. Spring Boot 自带缓存及结合 Redis 使用

    本文测试环境: Spring Boot 2.1.4.RELEASE + Redis 5.0.4 + CentO […]...

  5. 一个超好用的Gif图像录制软件GifRecode

         我有个癖好,每当我发现很实用的软件的时候我一定上网千方百计的找寻同类的软件并下载做比较,而同样的,我 […]...

  6. 微服务SpringCloud之服务网关zuul一

    前面学习了Eureka、Feign、Hystrix、Config,本篇来学习下API网关zuul。在微服务架构 […]...

  7. AviatorEvaluator表达式引擎

    AviatorEvaluator...

  8. 小程序

    小程序       App() App()函数用来注册一个小程序。接受一个object参数,其指定小程序的生命 […]...

展开目录

目录导航