toolkit-frame之toolkit-sprider(数据采集)---百度图片

简介: toolkit-frame之toolkit-sprider(数据采集)---百度图片

没写好!有点瑕疵!可以根据任意关键字采集检索的图片!

使用的技术:

Python3.7 、selenium  3.141.0 及Google浏览器的插件。

为啥使用selenium 包呢?主要是因为百度检索出来的图片页面是ajax的。传统的bs4等包根本获取不到html的dom结构,无法进行UI层面的采集。selenium包解决了这个问题。

其中:

1、BaseFrame.__log__("开始采集中国船舶网的数据...") BaseFrame.__log__() 就是我个人封装的日之类替换成print就可以。

2、response = requests.get(self.base_url, timeout=30, headers=UserAgent().get_random_header(self.base_url)) 这个就是封装的一个随机header,防止被认为是机器,每次都模拟一个新的浏览器的header。代码是这个:UserAgent().get_random_header(self.base_url) 随机header类:

3、filepath = BaseConfig().CORPUS_ROOT + os.sep + "equipment_info.xlsx" 这个就是文件的路径BaseConfig().CORPUS_ROOT替换成自己的文件路径就可以了。

4、mmEntity = SpriderEntity() 这个就是一个实体类用来记录采集过的数据,程序可以多次执行。防止数据重复采集的策略。


不废话了直接上代码:

import os
import requests
import ssl
import time
from selenium import webdriver
from selenium.common.exceptions import TimeoutException
from sprider.access.SpriderAccess import SpriderAccess
from main.base.BaseConfig import BaseConfig
from main.base.BaseFrame import BaseFrame
from sprider.object.SpriderEntity import SpriderEntity
from main.plugin.Tools import Tools
class SpriderSearchImage():
    page_count = 1  # 每个栏目开始业务
    base_url = "http://image.baidu.com/search/index"  # 采集的网址
    save_path = BaseConfig().CORPUS_ROOT + os.sep + "Baidu"
    dict_column_list = ["骏马"]
    sprider_count = 100
    window_height = 30000
    def __init__(self, path):
        Tools.judge_diskpath_exits_create(self.save_path)
        pass
    def sprider(self, key_word, sprider_count):
        search_url = self.base_url + "?tn=baiduimage&ipn=r&ct=201326592&cl=2&lm=-1&st=-1&fm=index&fr=&hs=0&xthttps=111111&sf=1&fmq=&pv=&ic=0&nc=1&z=&se=1&showtab=0&fb=0&width=&height=&face=0&istype=2&ie=utf-8&word={0}&oq={0}&rsp=-1"
        search_url = search_url.format(key_word)
        print(search_url)
        BaseFrame.__log__("开始采集采用Google浏览器的静默模式")
        BaseFrame.__log__("开始采集" + self.base_url + "上的图片,关键字是:" + key_word)
        ssl._create_default_https_context = ssl._create_unverified_context
        option = webdriver.ChromeOptions()
        option.add_argument('headless')
        driver = webdriver.Chrome(chrome_options=option)
        driver.set_window_size(1024, self.window_height)
        driver.implicitly_wait(10)  # 这里设置智能等待10s
        BaseFrame.__log__("延迟加载10s,请等待")
        try:
            driver.get(search_url)
        except TimeoutException:
            driver.execute_script("window.stop()")  # 当页面加载时间超过设定时间,通过js来stop,即可执行后续动作
        self.item_list = driver.find_elements_by_css_selector(".imgitem")
        self.total_count = len(self.item_list)  # 第一次加载到的图片数量
        BaseFrame.__log__("本次共获取到" + str(self.total_count) + "个图片")
        total_index = 1
        self.range = range(self.total_count)
        image_index = 0
        while True:
            image_index = image_index + 1
            image = self.item_list[image_index - 1]
            image_url = image.get_attribute("data-objurl")
            image_title = image.get_attribute("data-title").replace("<strong>", "").replace("</strong>", "")
            BaseFrame.__log__("正在下载第" + str(image_index) + "张图片,标题是" + image_title + "")
            picEntity = SpriderEntity()  # 依据图片执行,下载过的图片不再下载
            picEntity.sprider_base_url = self.base_url
            picEntity.create_datetime = Tools.get_current_datetime()
            picEntity.sprider_url = image_url
            picEntity.sprider_pic_title = image_title
            picEntity.sprider_pic_index = str(image_index)
            if SpriderAccess().query_sprider_entity_by_urlandtitle(image_url, image_title) is None:
                SpriderAccess().save_sprider(picEntity)
                self.down_picture(image_url, image_title, key_word)
            if image_index + 1 == self.total_count and self.total_count < self.sprider_count:
                print("第" + str(total_index) + "次")
                driver.execute_script("window.scrollBy(" + str(self.window_height * total_index) + "," + str(
                    self.window_height * (1 + total_index)) + ")")
                self.item_list = driver.find_elements_by_css_selector(".imgitem")
                self.total_count = len(self.item_list)
                total_index = total_index + 1
                if image_index == self.total_count:  # 采集的数量够了
                    BaseFrame.__log__("采集完毕!")
                    break
    # region 下载图片
    def down_picture(self, pic_url, pic_title, folder):
        BaseFrame.__log__("正在下载" + pic_url)
        try:
            headers = {"Referer": pic_url,
                       'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 '
                                     '(KHTML, like Gecko)Chrome/62.0.3202.94 Safari/537.36'}
            content = requests.get(pic_url, headers=headers, timeout=10)
            real_path = self.save_path + os.sep + folder + os.sep
            if (os.path.exists(real_path) is False):
                os.makedirs(real_path)
            if content.status_code == 200:
                BaseFrame.__log__("读取图片成功")
                pic_cun = real_path + pic_title + '.jpg'
                fp = open(pic_cun, 'wb')
                fp.write(content.content)
                fp.close()
            else:
                BaseFrame.__err__("读取图片出现错误")
        except Exception as e:
            BaseFrame.__err__("下载图片过程出现错误" + str(e))
            return
        pass
        # endregion
    # endregion
if __name__ == '__main__':
    SpriderSearchImage(BaseConfig().CORPUS_ROOT).sprider("汗血马", 1000)

截图欣赏:

 

 

目录
相关文章
|
5月前
|
人工智能 自然语言处理 数据可视化
低代码构建办公Agent:给非技术团队的自助流程编排工具选型
这是一篇关于低代码Agent如何赋能业务人员的实战指南:以运营查订单为例,详解如何零代码编排跨系统智能体——无需开发,拖拽配置即可实现自动查询、异常判断与客户回复。它让运营、客服等一线人员亲手打造AI助手,打破数据孤岛,把生产力还给最懂业务的人。(239字)
590 0
|
5月前
|
人工智能 编解码 自然语言处理
对话式生图正在把提示词变成工作流
如果你已经用过不少 AI 生图工具,大概率会遇到同一个问题:模型越来越强,但创作流程还是很容易散。
357 1
|
5月前
|
人工智能 安全 网络虚拟化
为什么总显示请求超时或者一直运行中无反应,卸载重装了好几次,把各种安全软件和vpn等都关了也不行
该问题表现为AI工具频繁超时、卡在“生成中”无响应,强制停止无效甚至导致程序卡死。已尝试重装、关闭安全软件及VPN仍无效,疑似网络连接异常、服务端故障或本地环境兼容性问题。
|
9月前
|
存储 缓存 监控
Python装饰器实战:从入门到封装通用工具
Python装饰器是“函数外套”,不改原代码即可动态增强功能。本文详解其原理(@语法糖、wrapper封装)、进阶技巧(保留元信息、带参装饰器、多层叠加)及企业级应用(性能监控、缓存、权限校验),涵盖类装饰器、工厂模式与最佳实践,助你写出优雅可维护的代码。(239字)
450 1
|
8月前
|
数据采集 存储 JavaScript
Python实现网页内容转纯文本与EPUB电子书全攻略
本文介绍用Python自动化保存网页为TXT或EPUB电子书的完整方案:基于requests+BeautifulSoup抓取解析,ebooklib生成标准EPUB,支持正文智能提取、多章合并、图片保留与异常处理,兼顾实用性与合规性。(239字)
1011 0
|
9月前
|
人工智能 自然语言处理 数据可视化
当行业进入寒冬,那个自带“AI调度中心”的人成了最稳的赢家
本文剖析职场寒冬下个体突围新路径:告别单点执行,构建个人“AI调度中心”,成为指挥多Agent协同、融合RAG知识库与LUI交互的“AI Agent指挥官”,实现从劳动力到系统力的跃迁。
305 2
|
传感器 Ubuntu Python
使用ubuntu串口数据收和发不一致问题
在Ubuntu中使用串口进行数据通信时,确保发送和接收设备的串口配置一致是解决数据不一致问题的关键。此外,适当的软件配置、硬件连接和流控制设置也是确保数据正确传输的重要因素。通过上述方法,可以有效地排查并解决串口数据收发不一致的问题。
937 8
|
Python
新手向 Python:VsCode环境下Manim配置
该文介绍了如何准备和配置开发环境以使用Manim,主要包括两个步骤:一是准备工作,需要下载并安装VsCode和Anaconda,其中Anaconda需添加到系统PATH环境变量,并通过清华镜像源配置;二是配置环境,VsCode中安装中文插件和Python扩展,激活并配置虚拟环境。最后,安装ffmpeg和manim,通过VsCode运行测试代码验证配置成功。
2364 1
|
Java jenkins 测试技术
云效流水线 Flow
云效流水线Flow是阿里云提供的企业级CI/CD工具,简化软件开发流程,提高协作效率。本报告评估了其易用性、功能、性能、开放性和成本。Flow界面直观,提供预设模板,但学习曲线略陡。功能完备,支持全生命周期管理,智能诊断功能强大。性能上,依托阿里云,具备高可用性和弹性。然而,开放性和与其他云服务的集成有待增强。成本方面,免费额度适合小项目,大项目需考虑额外费用。一个中型Java项目案例显示,Flow快速构建CI/CD流程,智能诊断节省调试时间,但在非阿里云环境集成存在挑战。
2289 3
云效流水线 Flow