博客
关于我
写博客没高质量配图?python爬虫教你绕过限制一键搜索下载图虫创意图片!
阅读量:443 次
发布时间:2019-03-06

本文共 1632 字,大约阅读时间需要 5 分钟。

文章配图之道:如何通过爬虫抓取高质量图片

在我们写文章(博客、公众号、自媒体)的时候,常常觉得自己的文章有些老土,这很大程度是因为配图没有选好。笔者也曾遇到过相同的困扰,顺便解决其中一个案例,为大家提供一些技术上的参考和借鉴!

对于图片的选择,我们通常会遇到两种情况:非高清或者带水印。这两种情况都是我们所忌讪的东西。笔者这次通过图虫创意抓取高清小图,虽然不是大图,但在火热的移动端阅读上是足够的!

分析与解决方案

理想状态

我们的理想状态是一个网页,图片直接嵌入在html中。这种情况就像你写的博客或个人网站上的图片,简单地通过爬虫解析即可。或者通过后台AJAX传输图片地址引用。我们不清楚这种方式是否可行!

实际分析

很遗憾,理想状态难以实现。考虑到图片作为核心业务,需要注册、购买等流程,直接嵌入的想法显然不可行。那么它到底是如何实现的呢?我们来详细分析一下!

打开网页,检查图片来源发现有两个主要域名:ice 和 wel,并且编号不唯一。但我们发现相同域名不同后缀的图片地址效果相同(例如 icweiliimg9 和 icweiliimg/)。查看网页源代码发现并没有我们想要的图片地址。这意味着图片可能通过AJAX渲染,或者藏在JavaScript中进行混淆或加密。

通过分析发现,图片数据确实藏在JavaScript中。由于URL随着请求变化,返回的数据也必然不同,因此可以通过模拟请求来获取所需图片数据。接下来,我们就来详细讲述爬虫实现的过程。

爬虫实现

经过测试发现,目标网页需要进行某些验证,包括 cookies 中的 wluuid 字段(仅验证存在,不验证正确性)。因此,我们需要编写一段代码来获取网页的HTML内容。然而,图片数据藏在JavaScript中,这意味着我们只能通过正则表达式来提取所需的图片信息。

通过 BeautifulSoup 提取 JavaScript 代码片段即可获取相关信息。例如:`js = soup.select('script')[4]`。对于有用数据,只能通过正则表达式进行截取。我们可以编写一个正则表达式来提取图片地址。例如:

import refrom bs4 import BeautifulSouppattern = re.compile(r'window.hits = (\[)(.*)(\])')match = pattern.search(str(js))if match:    data = match.group(2)    # 通过处理data字符串获取图片地址    # 例如:替换所有','为',,,',然后分割    data = data.replace('}', ',', '').split(',')    # 最终得到一个包含图片地址的列表    for url in data:        # 下载图片并存储        pass

需要注意的是,图片下载时可能会遇到无名图或重复名的问题,因此建议在下载前进行编号处理。同时,两个域名的图片地址需要分别尝试下载,确保能获取到高清图片。

其他注意事项

图片下载:

  • 为了避免重复下载或命名冲突,可以为图片编号。例如:图片名为`image-001.jpg`。
  • 两个域名的图片地址需要尝试下载,其中一个成功即可完成下载。

爬虫方面:

  • 全程无需登录,下载的图片为小图。但由于技术限制,后续可以研究登录后的大图下载方法并分享给大家!

其他:

  • 创建图片存储路径时,确保路径存在。可以通过`os.makedirs` 检查并创建路径。

效果与总结

通过上述方法,我们成功实现了自动下载图片的功能。测试结果表明,只需输入关键词即可实现自动下载,虽然图片为小图,但在移动端阅读时效果不错!这也证明了数据结构与算法的重要性。通过扎实的数据结构与算法基础,处理问题变得不再难题。如果你也对数据结构与算法感兴趣,可以关注我的公众号:bigsai。

转载地址:http://ppvkz.baihongyu.com/

你可能感兴趣的文章
org.apache.ibatis.exceptions.PersistenceException:
查看>>
org.apache.ibatis.exceptions.TooManyResultsException: Expected one result (or null) to be returned
查看>>
org.apache.ibatis.type.TypeException: Could not resolve type alias 'xxxx'异常
查看>>
org.apache.poi.hssf.util.Region
查看>>
org.apache.xmlbeans.XmlOptions.setEntityExpansionLimit(I)Lorg/apache/xmlbeans/XmlOptions;
查看>>
org.apache.zookeeper.KeeperException$ConnectionLossException: KeeperErrorCode = ConnectionLoss for /
查看>>
org.gradle.api.tasks.TaskExecutionException: Execution failed for task ':app:processDebugManifest'
查看>>
org.hibernate.HibernateException: Unable to get the default Bean Validation factory
查看>>
org.hibernate.ObjectNotFoundException: No row with the given identifier exists:
查看>>
org.springframework.amqp.AmqpConnectException:java.net.ConnectException:Connection timed out:connect
查看>>
org.springframework.beans.factory.BeanDefinitionStoreException
查看>>
org.springframework.boot.context.properties.ConfigurationBeanFactoryMetadata
查看>>
org.springframework.boot:spring boot maven plugin丢失---SpringCloud Alibaba_若依微服务框架改造_--工作笔记012
查看>>
SQL-CLR 类型映射 (LINQ to SQL)
查看>>
org.springframework.orm.hibernate3.support.OpenSessionInViewFilter
查看>>
org.springframework.orm.hibernate3.support.OpenSessionInViewFilter
查看>>
org.springframework.web.multipart.MaxUploadSizeExceededException: Maximum upload size exceeded
查看>>
org.tinygroup.serviceprocessor-服务处理器
查看>>
org/eclipse/jetty/server/Connector : Unsupported major.minor version 52.0
查看>>
org/hibernate/validator/internal/engine
查看>>