python3爬虫:通过关键词列表采集必应图片并整理成html导入wordpress站点

最近有一个任务,就是要采集必应的一些图片,并要对图片进行个性化描述,然后把图片导入wordpress站点,成为一个图片站。这个任务分二部分,第一部分就是采集,通过关键词搜索,采集图片,这个没有什么好说的。第二个任务就是要整理,把采集到的图片真理成html代码。这个任务最好玩的地方是,通过微软的识图接口,为每一张图片添加特定的描述。不啰嗦,直接上代码:

from selenium import webdriver
import time,bs4,os,csv,json,re,requests
from selenium.webdriver.chrome.options import Options

'''把关键词转化为小短线链接形式'''
def key_ss(key):
    key_s=re.sub(' +','_',key)
    return key_s
def key_imgs(key):
    key_img=re.sub(' +','-',key)
    return key_img

def to_url(key):
    #url = 'https://cn.bing.com/images/search?&q='+key+'&qft=+filterui:photo-photo+filterui:imagesize-large&FORM=IRFLTR'
    url='https://cn.bing.com/images/search?sp=-1&pq='+key+'&sc=0-18&sk=&cvid=1CAF0B3BD39E45DA87946D04BA398F6F&q='+key+'&qft=+filterui:imagesize-large&FORM=BESBTB&ensearch=1'
    return url

def connect(url):#链接网络,获得html
    
    opt = webdriver.ChromeOptions()
    #opt.set_headless() #老版本设置无头
    opt.add_argument("--headless") #新版本设置无头
    opt.add_argument("--disable-gpu")
    driver = webdriver.Chrome(executable_path='C:\Program Files (x86)\Google\Chrome\Application\chromedriver.exe',options=opt) #驱动器路径
    m=0
    while m<3:
        m=m+1
        driver.set_page_load_timeout(10)
        try:
            driver.get(url)
            a=0
            while a<1:
                #下拉鼠标
                driver.execute_script("window.scrollTo(0, document.body.scrollHeight); var lenOfPage=document.body.scrollHeight; return lenOfPage;")
                time.sleep(2)
                html=driver.page_source
                a=a+1
            break
        except:
            print(time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(time.time())),'链接失败,重试',m,'次')
            print('')
            html=''
    if m>=2:
        print(time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(time.time())),'没找到页面内容,跳过此条')
        html=''
    time.sleep(1)
    driver.quit()
    return html
    

def img_urls(html):#获取图片url列表
    if html=='':
        imgs=[]
        return imgs
    else:
        bs=bs4.BeautifulSoup(html,'html.parser')    
        prourls=bs.select('.iusc')
        #driver.quit()
        n=1
        imgs=[]
        for prourl in prourls:
            prourl=json.loads(prourl.get('m'))['murl']
            imgs.append(prourl)#把多张图片变成图片列表
            n=n+1
        return imgs
    
def shitu(imgurl):
    if imgurl=='':
        return ''
    else:
        #https://www.captionbot.ai/ 在线识图工具
        url='https://captionbot.azurewebsites.net/api/messages?language=en-US'
        data={
            "Type":"CaptionRequest",
            "Content":imgurl
            }
        m=0
        while m<3:
            m=m+1
            try:
                r=requests.post(url,data=data,timeout=3)
                r.encoding='utf-8'
                des=r.text
                break
            except:
                print(time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(time.time())),'识图失败,重试中。。。。')
                time.sleep(3)
                print('')
                des=''
        #des1=re.sub('我无法完全理解这副图片,但是我看到了|。|我觉得这是','',des) #中文版
        des1=re.sub('I am not really confident, but I think it \'s a|I think it\'s a ','',des)
        es1=re.sub('I can’t really describe line drawings :\(','A beautiful line painting',des1)
        des1=re.sub('I am not really confident, but','',des1)
        return des1

def dow_img(img,n,key_img):#传入图片地址,命名参数,下载图片
    
    url=img
    m=0
    while m<3:
        m=m+1
        try:
            imgf=requests.get(url,timeout=10)
            imgf.encoding='utf-8'
            with open(img_path+key_img+str(n)+".jpg","wb")as f:
                print(time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(time.time())),'下载图片:',img)
                f.write(imgf.content)
                print(time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(time.time())),'图片存入:',img_path+key_img+str(n)+".jpg")
            break
        except:
            print(time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(time.time())),'下载',img,' ',m,'次')
            time.sleep(3)

def des_files(key_img,key,des):
    #构建文章内容
    headfile=['post_id','post_name','post_author','post_date','post_type','post_status','post_title','post_content','post_category','post_tags','custom_field']
    post_id=''
    post_name=key_img
    post_author='admin'
    post_date=''
    post_type='post'
    post_status='publish'
    post_title=key+' '+'Beautiful '+key+' pictures'
    post_content=','.join(des)
    post_category='fruits'
    post_tags=''
    custom_field=''
    file=[post_id,post_name,post_author,post_date,post_type,post_status,post_title,post_content,post_category,post_tags,custom_field]
    #写入csv
    return headfile,file


'''把内容保存为CSV格式'''
def writer_pro(headfile,file):
    n=0
    while n<3:
        n=n+1
        try:
            global csvf #申明csvf为全局变量
            csvf=open(csv_path,'a',newline='')#newline=''去除空格
            size=os.path.getsize(csv_path)
            writer=csv.writer(csvf)
            if size==0:
                writer.writerow(headfile)
                writer.writerow(file)
                csvf.close()
            else:
                writer.writerow(file)
                csvf.close()
            break
        except:
            print(time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(time.time())),'写入失败,重试第',n,'次')
            csvf.close()
            time.sleep(3)
        print('')

'''主程序开始'''
global key_path,img_path,csv_path,post_n
#设置关键词位置
key_path=r'D:\Backup\桌面\T恤\dsnkeynext.txt' #关键词
#设置图片存储位置
img_path='D:/Backup/桌面/T恤/dsnkeynext/' #设置图片存储位置,winds下用'/',记得!
#设置CSV文件存储位置
csv_path='D:/Backup/桌面/T恤/dsnkeynext.csv'#设置csv文件保存位置winds下用'/',记得!
#设置每篇文章的图片数量
post_n=10

with open(key_path, 'r', encoding='utf-8') as f:
    for line in f:
        key=line[:-1] #去掉换行符
        print(time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(time.time())),':开始采集关键词',key)

        #把关键词变成下划线链接的字符串
        key_s=key_ss(key)
        key_img=key_imgs(key)

        #把关键词拼接成url
        url=to_url(key_s)

        #链接网络
        html=connect(url)

        #获取图片列表
        imgs=img_urls(html)
        if imgs==[]:
            print(time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(time.time())),'没有发现图片,跳过:',key)
            print('')
            continue
        
        #设置每篇文章的图片数量
        if len(imgs)>post_n:
            imgs=imgs[:post_n]
        else:
            imgs=imgs

        #取出每一张图片进行识图处理,得出每一张图片的描述,并把描述整理成列表
        print(time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(time.time())),':下载和识别图片')
        des=[]
        n=1
        for img in imgs:
            d=shitu(img)#得出这张图片的描述
            imgpj=key_img+str(n)
            de='<img class="wp-image-10 size-full" src="http://customfw.com/wp-content/uploads/2020/01/'+imgpj+'.jpg" alt='+d+' width="500" height="472" /> '+d+''
            des.append(de)#把多段描述整理成列表
            #site='D:/Backup/桌面/T恤/0120-1-21/' #设置图片存储位置,winds下用'/',记得!
            dow_img(img,n,key_img)#下载这张图片
            n=n+1
        print(time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(time.time())),':整理成CSV内容')
        des_file=des_files(key_img,key,des) #得出CSV内容
        headfile=des_file[0]
        file=des_file[1]
        try:
            writer_pro(headfile,file)#写入CSV文本
        except:
            print(time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(time.time())),'写入失败,跳过此条')
                
print(time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(time.time())),':采集完毕')

'''主程序结束'''
发表在 python3爬虫 | 标签为 , | 留下评论

python3爬虫:输入关键词采集必应上的图片并识别图片内容

要做一个图片网站,需要导入很多图片。从SEO角度来讲,就需要给每一张图片添加文字说明。然而图片太多,人工做这件事情就会变得特别枯燥无味了。我又想到了python3。基本思路是,首先找到一个识图IPI,然后一张一张的提交图片过去,然后读取识别的内容。具体代码如下:

from selenium import webdriver
import time,bs4,os,csv,json,re,requests
from selenium.webdriver.chrome.options import Options

def to_url(key):
    key=re.sub(' +','_',key)
    url = 'https://cn.bing.com/images/search?&q='+key+'&qft=+filterui:photo-photo+filterui:imagesize-large&FORM=IRFLTR'
    return url

def pro_urls(url):
    opt = webdriver.ChromeOptions()
    #opt.set_headless() #老版本设置无头
    opt.add_argument("--headless") #新版本设置无头
    opt.add_argument("--disable-gpu")
    driver = webdriver.Chrome(executable_path='C:\Program Files (x86)\Google\Chrome\Application\chromedriver.exe',options=opt) #驱动器路径
    while True:
        try:
            print('...')
            driver.get(url)
            break
        except:
            print('链接失败,重试中。。。')
            print('')

    time.sleep(1)
    a=0
    while a<3:
        #下拉鼠标
        driver.execute_script("window.scrollTo(0, document.body.scrollHeight); var lenOfPage=document.body.scrollHeight; return lenOfPage;")
        time.sleep(2)
        a=a+1

    html=driver.page_source    
    bs=bs4.BeautifulSoup(html,'html.parser')    
    prourls=bs.select('.iusc')
    driver.quit()
    for prourl in prourls:
        prourl=json.loads(prourl.get('m'))['murl']
        shitu(prourl)
        #print(prourl)

def shitu(imgurl):
    #https://www.captionbot.ai/ 在线识图工具
    url='https://captionbot.azurewebsites.net/api/messages?language=en-US'
    data={
        "Type":"CaptionRequest",
        "Content":imgurl
        }
    while True:
        try:
            print('......')
            r=requests.post(url,data=data)
            break
        except:
            print('识图失败,重试中。。。。')
            print('')
    des=r.text
    #des1=re.sub('我无法完全理解这副图片,但是我看到了|。|我觉得这是','',des) #中文版
    des1=re.sub('I am not really confident, but I think it \'s a|I think it\'s a ','',des)
    
    #print('原文:',des)
    print('图片URL:',imgurl)
    print('这张图片的内容是:',des1)
        

key=input('请输入关键词:')
key=str(key)
url=to_url(key)
pro_urls(url)
发表在 python3爬虫 | 标签为 , | 留下评论