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类:https://blog.csdn.net/zy0412326/article/details/104258491

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

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

这里我之前写过防止重复采集的文章:https://blog.csdn.net/zy0412326/article/details/103224399

不废话了直接上代码:

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)

截图欣赏:

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

亚丁号

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值