python selenium 爬必应搜索高清大图--多线程

必应搜索国内版 https://cn.bing.com/images ,这里搜索到的图片质量还不错。

程序运行画面
python selenium 爬必应搜索高清大图--多线程_第1张图片
以搜索关键词建立文件夹存放图片
python selenium 爬必应搜索高清大图--多线程_第2张图片
python selenium 爬必应搜索高清大图--多线程_第3张图片

全部代码

from selenium import webdriver
from selenium.webdriver.common import keys
from bs4 import BeautifulSoup
import requests
import os
import re
import time
import threading

headers = {
    'User-Agent': 'Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Mobile Safari/537.36'
}

keyword = ''

# 获取页面所有的图片地址
def getallurl():
    global keyword  # 声明全局变量
    keyword = input('请输入搜索关键词:')

    if len(keyword) > 0:
        browser = webdriver.Chrome()
        browser.get('https://cn.bing.com/images')
        time.sleep(1)

        browser.find_element_by_xpath('//*[@id="sb_form_q"]').send_keys(keyword, keys.Keys.ENTER)  # 输入关键词
        time.sleep(1)

        browser.find_element_by_class_name("fltIdtTit").click()  # 点击筛选
        time.sleep(1)

        browser.find_element_by_class_name("ftrLi").click()  # 点击图片尺寸
        time.sleep(1)

        browser.find_element_by_xpath('//*[@id="ftrB"]/ul/li[1]/div/div/a[5]').click()  # 选择特大
        time.sleep(1)

        i = 0
        while i <= 2:  #滚动页面次数
            js = "var q=document.documentElement.scrollTop=10000"
            browser.execute_script(js)  # 下拉滚动条
            i = i + 1
            time.sleep(5)  # 等待页面加载5秒

        allhtml = browser.page_source  # 获取页面源代码
        browser.quit()  # 拿到页面源代码后关闭浏览器

        bs = BeautifulSoup(allhtml, 'lxml')
        list01 = bs.find_all('a', class_='iusc')  # 获取所有class='iusc'的标签
        src_list = re.findall(r'\"murl\"\:\"(.*?)\"\,\"', str(list01))  # 正则匹配图片地址

        return src_list  # 返回函数值
    else:
        print('我的世界一片空白^_^')
        getallurl()


# 下载图片
semaphore = threading.BoundedSemaphore(3)  # 最多允许3个线程同时运行(带宽够大的话可以开多几个线程,确保下载成功率)
def saveimg(src, keyword):
    semaphore.acquire()  # 加锁
    savepath = 'd://cnbing//' + keyword  # 保存路径,以关键词分类做文件夹名
    name = src.split('/')[-1]  # 截取图片地址‘/’右边第一段做文件名
    filename = savepath + '//' + name  # 拼接成保存图片的绝对路径
    # print(filename)
    try:
        if not os.path.exists(savepath):
            os.makedirs(savepath)  # 创建多级目录 os.makedirs  | 创建单个目录 os.mkdir
        if not os.path.exists(filename):
            r = requests.get(src, headers=headers, timeout=(3, 7))  # timeout(3,7)表示的连接时间是3秒,响应时间是7秒
            with open(filename, 'wb') as f:  # 保存图片
                f.write(r.content)
                print(src + '  下载完成 ')
    except:
        print('保存出错')
    semaphore.release()  # 解锁


# 程序入口
def main():
    src_list = getallurl()  # 获取函数返回的值
    start_time = time.time()

    # 多线程调用函数saveimg 保存图片
    ts = []
    for src in src_list:
        t = threading.Thread(target=saveimg, args=(src, keyword))  # 创建线程
        t.start()  # 启动线程
        ts.append(t)  # 把线程追加到列表
    for x in ts:  # 等待所有线程结束
        x.join()

    alltime = time.time()- start_time
    print('耗时:',alltime)

    '''
    #单线程调用函数saveimg 保存图片
    for src in src_list:
        saveimg(src,keyword)  #循环调用保存图片函数  
    '''


if __name__ == '__main__':
    main()


python selenium 爬必应搜索高清大图--多线程_第4张图片

你可能感兴趣的:(python)