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)

截圖欣賞:

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章