kit de herramientas del marco de la caja de herramientas-sprider (adquisición de datos) --- foto Baidu

No he escrito! Un pequeño fallo! La recuperación se puede recoger de acuerdo con cualquier cuadro de palabras clave!

Uso de la tecnología:

Python3.7, selenio y 3.141.0 del navegador Google plug-ins.

¿Por qué el uso de bolsas de selenio? Principalmente porque Baidu se recupera de la página de la imagen de ajax. bs4 tradicional y otros paquetes simplemente no pueden obtener la estructura HTML DOM no pueden ser recogidos nivel de interfaz de usuario. paquete de selenio resuelve este problema.

donde:

1, bancada .__ __ registro ( "China Shipbuilding comenzó a recoger red de datos ...") .__ bancada registro __ () es mi paquete de día personal como reemplazar impresión en él.

2, la respuesta = requests.get (self.base_url, timeout = 30, cabeceras = UserAgent (). Get_random_header (self.base_url)) Esta es una cabecera de encapsulación al azar, se considera que evitar que la máquina, cada vez que un nuevo análogo navegador de cabecera. Este código :. agente de usuario () (get_random_header self.base_url ) clases de cabecera al azar: https://blog.csdn.net/zy0412326/article/details/104258491

3, ruta de archivo = BaseConfig (). CORPUS_ROOT + + os.sep "equipment_info.xlsx" Este es el archivo de ruta BaseConfig (). CORPUS_ROOT reemplazar su ruta de archivo en él.

4, mmEntity = SpriderEntity () Esta categoría es para el registro de una entidad de adquisición de datos había, el programa puede ser ejecutado varias veces. Las estrategias para prevenir la duplicación de la recogida de datos.

Aquí antes de escribir prevenir colección duplicada de los artículos: https://blog.csdn.net/zy0412326/article/details/103224399

Sin tonterías directamente en el código:

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)

Imágenes:

 

 

Publicado 41 artículos originales · ganado elogios 9 · vistas 8514

Supongo que te gusta

Origin blog.csdn.net/zy0412326/article/details/104280267
Recomendado
Clasificación