zoukankan      html  css  js  c++  java
  • 百度指数

    百度指数数据是拼成图片在客户端显示,要用到OCR识别,在此我了google和百度自带的两张OCR识别

    # !/usr/bin/python3.4
    # -*- coding: utf-8 -*-
    
    
    # 百度指数的抓取
    # 截图教程:http://www.myexception.cn/web/2040513.html
    #
    # 登陆百度地址:https://passport.baidu.com/v2/?login&tpl=mn&u=http%3A%2F%2Fwww.baidu.com%2F
    # 百度指数地址:http://index.baidu.com
    
    import time
    from selenium import webdriver
    from selenium.webdriver.common.action_chains import ActionChains
    from PIL import Image
    import pytesseract
    from aip import AipOcr
    import os
    import re
    import threading
    from queue import Queue
    import json
    import codecs
    
    
    # 打开浏览器
    def openbrowser():
        global browser
    
        # https://passport.baidu.com/v2/?login
        url = 'http://index.baidu.com/?tpl=trend&word=%D5%BD%C0%C7'
        # 打开谷歌浏览器
        # Firefox()
        # Chrome()
        browser = webdriver.Chrome()
        # 输入网址
        browser.get(url)
        # 打开浏览器时间
        # print("等待10秒打开浏览器...")
        # time.sleep(10)
    
        # 找到id="TANGRAM__PSP_3__userName"的对话框
        # 清空输入框
        # TANGRAM__PSP_4__userName
        # TANGRAM__PSP_4__password
        browser.find_element_by_id("TANGRAM__PSP_4__userName").clear()
        browser.find_element_by_id("TANGRAM__PSP_4__password").clear()
    
        # 输入账号密码
        # 输入账号密码
        account = []
        try:
            fileaccount = open("../baidu/account.txt", encoding='UTF-8')
            accounts = fileaccount.readlines()
            for acc in accounts:
                account.append(acc.strip())
            fileaccount.close()
        except Exception as err:
            print(err)
            input("请正确在account.txt里面写入账号密码")
            exit()
        browser.find_element_by_id("TANGRAM__PSP_4__userName").send_keys(account[0])
        browser.find_element_by_id("TANGRAM__PSP_4__password").send_keys(account[1])
    
        # 点击登陆登陆
        # id="TANGRAM__PSP_3__submit"
        browser.find_element_by_id("TANGRAM__PSP_4__submit").click()
    
        # 等待登陆10秒
        # print('等待登陆10秒...')
        # time.sleep(10)
        print("等待网址加载完毕...")
    
        # select = input("请观察浏览器网站是否已经登陆(y/n):")
        select = 'y'
        while 1:
            if select == "y" or select == "Y":
                print("登陆成功!")
                print("准备打开新的窗口...")
                # time.sleep(1)
                # browser.quit()
                break
    
            elif select == "n" or select == "N":
                selectno = input("账号密码错误请按0,验证码出现请按1...")
                # 账号密码错误则重新输入
                if selectno == "0":
    
                    # 找到id="TANGRAM__PSP_3__userName"的对话框
                    # 清空输入框
                    browser.find_element_by_id("TANGRAM__PSP_4__userName").clear()
                    browser.find_element_by_id("TANGRAM__PSP_4__password").clear()
    
                    # 输入账号密码
                    account = []
                    try:
                        fileaccount = open("../baidu/account.txt", encoding='UTF-8')
                        accounts = fileaccount.readlines()
                        for acc in accounts:
                            account.append(acc.strip())
                        fileaccount.close()
                    except Exception as err:
                        print(err)
                        input("请正确在account.txt里面写入账号密码")
                        exit()
    
                    browser.find_element_by_id("TANGRAM__PSP_4__userName").send_keys(account[0])
                    browser.find_element_by_id("TANGRAM__PSP_4__password").send_keys(account[1])
                    # 点击登陆sign in
                    # id="TANGRAM__PSP_3__submit"
                    browser.find_element_by_id("TANGRAM__PSP_4__submit").click()
    
                elif selectno == "1":
                    # 验证码的id为id="ap_captcha_guess"的对话框
                    input("请在浏览器中输入验证码并登陆...")
                    select = input("请观察浏览器网站是否已经登陆(y/n):")
    
            else:
                print("请输入“y”或者“n”!")
                select = input("请观察浏览器网站是否已经登陆(y/n):")
    
    
    def getindex(keyword, day):
        try:
            openbrowser()
            time.sleep(3)
    
            # try:
            # 这里开始进入百度指数
            # 要不这里就不要关闭了,新打开一个窗口
            # http://blog.csdn.net/DongGeGe214/article/details/52169761
            # 新开一个窗口,通过执行js来新开一个窗口
            js = 'window.open("http://index.baidu.com");'
            browser.execute_script(js)
            # 新窗口句柄切换,进入百度指数
            # 获得当前打开所有窗口的句柄handles
            # handles为一个数组
            handles = browser.window_handles
            # print(handles)
            # 切换到当前最新打开的窗口
            browser.switch_to_window(handles[-1])
            # 在新窗口里面输入网址百度指数
            # 清空输入框
            # time.sleep(1)
            browser.find_element_by_id("search-input-word").clear()
            # time.sleep(1)
            # 写入需要搜索的百度指数
            browser.find_element_by_id("search-input-word").send_keys(keyword)
            # 点击搜索
            # <input type="submit" value="" id="searchWords" onclick="searchDemoWords()">
            browser.find_element_by_id("searchWords").click()
            # time.sleep(2)
            # 最大化窗口
            browser.maximize_window()
            time.sleep(5)
            # 构造天数
            sel = '//a[@rel="' + str(day) + '"]'
            browser.find_element_by_xpath(sel).click()
            # 太快了
            time.sleep(2)
            # 滑动思路:http://blog.sina.com.cn/s/blog_620987bf0102v2r8.html
            # 滑动思路:http://blog.csdn.net/zhouxuan623/article/details/39338511
            # 向上移动鼠标80个像素,水平方向不同
            # ActionChains(browser).move_by_offset(0,-80).perform()
            # <div id="trend" class="R_paper" style="height:480px;_background-color:#fff;"><svg height="460" version="1.1" width="954" xmlns="http://www.w3.org/2000/svg" style="overflow: hidden; position: relative; left: -0.5px;">
            # <rect x="20" y="130" width="914" height="207.66666666666666" r="0" rx="0" ry="0" fill="#ff0000" stroke="none" opacity="0" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0); opacity: 0;"></rect>
            # xoyelement = browser.find_element_by_xpath('//rect[@stroke="none"]')
            # xoyelement = browser.find_elements_by_css_selector("#trend rect")[2]
            xoyelement = browser.find_element_by_xpath('//div[@id="trend"]')
    
            print('xoyelement:%s' % xoyelement)
            num = 0
            # 获得坐标长宽
            # x = xoyelement.location['x']
            # y = xoyelement.location['y']
            # width = xoyelement.size['width']
            # height = xoyelement.size['height']
            # print(x,y,width,height)
            # 常用js:http://www.cnblogs.com/hjhsysu/p/5735339.html
            # 搜索词:selenium JavaScript模拟鼠标悬浮
            x_0 = 30
            y_0 = 248
    
            if day == "all":
                day = 1000000
    
            # 储存数字的数组
            index = []
            try:
                # webdriver.ActionChains(driver).move_to_element().click().perform()
                # 只有移动位置xoyelement[2]是准确的
                for i in range(day):
                    # 坐标偏移量???
                    ActionChains(browser).move_to_element_with_offset(xoyelement, x_0, y_0).perform()
                    # ActionChains(browser).move_to_element(xoyelement, x_0, y_0).perform()
                    time.sleep(2)
    
                    # 构造规则
                    if day == 7:
                        x_0 = x_0 + 202
                    elif day == 30:
                        # x_0 = x_0 + 41.68
                        x_0 = x_0 + 40
                    elif day == 90:
                        x_0 = x_0 + 13.64
                    elif day == 180:
                        x_0 = x_0 + 6.78
                    elif day == 1000000:
                        x_0 = x_0 + 3.37222222
                    # <div class="imgtxt" style="margin-left:-117px;"></div>
                    imgelement = browser.find_element_by_xpath('//div[@id="viewbox"]')
                    imgelement_index = browser.find_element_by_xpath('//div[@id="trend"]')
                    # imgelement = browser.find_element_by_xpath('//div[@id="trend"]')
                    print('imgelement:%s' % imgelement)
                    # 找到图片坐标
                    locations = imgelement.location
                    locations_index = imgelement_index.location
                    print('locations_index:%s' % locations_index)
                    print('locations:%s' % locations)
                    time.sleep(1)
                    # 跨浏览器兼容
                    scroll = browser.execute_script("return window.scrollY;")
                    print('scroll:%s' % scroll)
                    top = locations['y'] - scroll
                    # 找到图片大小
                    sizes = imgelement.size
                    print('sizes:%s' % sizes)
                    # 构造关键词长度
                    add_length = (len(keyword) - 2) * sizes['width'] / 15
                    # 构造指数的位置
                    rangle = (
                        int(locations['x'] + sizes['width'] / 4 + add_length), int(top + sizes['height'] / 2),
                        int(locations['x'] + sizes['width'] * 2 / 3), int(top + sizes['height']))
    
                    # 构造指数图片位置
                    rangle_index = (
                        int(locations_index['x']), int(locations_index['y']),
                        int(int(locations_index['x']) + 1256), int(int(locations_index['y']) + 365))
    
                    # 截取当前浏览器
                    path = "../baidu/" + str(num)
                    browser.save_screenshot(str(path) + ".png")
                    # 打开截图切割
                    img = Image.open(str(path) + ".png")
                    jpg = img.crop(rangle)
                    jpg.save(str(path) + ".jpg")
                    jpg_index = img.crop(rangle_index)
                    jpg_index.save(str(path) + str(time.strftime('%Y-%m-%d', time.localtime(time.time()))) + ".jpg")
    
                    # 将图片放大一倍
                    # 原图大小73.29
                    jpgzoom = Image.open(str(path) + ".jpg")
                    (x, y) = jpgzoom.size
                    x_s = x * 2
                    y_s = y * 3
                    out = jpgzoom.resize((x_s, y_s), Image.ANTIALIAS)
                    out.save(path + 'zoom.jpg', 'png', quality=95)
    
                    # 图像识别
                    try:
                        # 调用goggle图像识别
                        image = Image.open(str(path) + "zoom.jpg")
                        code = pytesseract.image_to_string(image)
    
                        # # 调用百度识别接口
                        # """ 你的 APPID AK SK """
                        # APP_ID = '10913815'
                        # API_KEY = 'oLZyPe7PwKzeWhHw7d81oLzy'
                        # SECRET_KEY = 'KK5BotVGvbsgDI8Sy29ir5gVwEdXB5oM'
                        #
                        # client = AipOcr(APP_ID, API_KEY, SECRET_KEY)
                        #
                        # """ 读取图片 """
                        #
                        # def get_file_content(filePath):
                        #     with open(filePath, 'rb') as fp:
                        #         return fp.read()
                        #
                        # # image = get_file_content('29zoom.jpg')
                        # print('str(path) + "zoom.jpg":%s'%(str(path) + "zoom.jpg"))
                        # image = get_file_content(str(path) + "zoom.jpg")
                        #
                        # """ 调用通用文字识别, 图片参数为本地图片 """
                        # data = client.basicGeneral(image);
                        # code = data['words_result'][0]['words']
                        #
                        # print(data['words_result'][0]['words'])
                        # 创建储存字段
                        data_list = {}
                        data_list['keyword'] = keyword
                        data_list['current_time'] = int(time.time()) - 86400
                        if code:
                            # index.append(code)
                            print('type(code):%s' % type(code))
    
                            # 去掉非字母和数字
                            data_initial = re.findall(r"[w]+", code)
                            data = ''.join(data_initial)
                            print(data)
    
                            # 数据中的字母提前出来
                            letters = re.findall(r"[a-zA-Z]+", data)
                            print(letters)
                            print(type(letters))
                            num = 0
                            # 字母用数值替换
                            if letters:
                                for letter in letters:
                                    num += 1
                                    print(num)
                                    if letter == 'T' or 't':
                                        data = data.replace(letter, '7')
    
                                    elif letter == 'B' or 'b':
                                        data = data.replace(letter, '8')
    
                                    else:
                                        data = data.replace(letter, '这个数据匹配有问题')
    
                            data_list['index'] = data
                            print(data_list)
                            # 数据保存json格式
                            data_json = json.dumps(data_list, ensure_ascii=False) + ",
    "
                            print('*' * 100)
                            print('data_json:%s' % data_json)
                            print('*' * 100)
                            print(type(data_json))
                            with open("index.json", "ab") as fi:
                                fi.write(data_json.encode('utf-8'))
    
                            # data_json = json.dump(data_list, ensure_ascii=False)
                            # print(type(data_json))
                            # with open("index.json", "wb", encoding='UTF-8') as f:
                            #     f.write(data_json.encode("utf-8") + "
    ")
                            # # json.dump(data_list, codecs.open('data.json', 'a', 'utf-8'), ensure_ascii=False, indent=2)
    
                            print(data)
                            index.append(data)
    
    
    
                        else:
                            index.append("数据获取没有成功")
                            data_list['index'] = '数据获取没有成功'
                            print(data_list)
    
                            data_json = json.dumps(data_list, ensure_ascii=False) + ",
    "
                            print(type(data_json))
                            with open("error.json", "ab") as f:
                                f.write(data_json.encode('utf-8'))
    
    
                    except Exception as f:
                        index.append("数据获取没有成功")
                        data_list['index'] = '数据获取没有成功'
                        print(data_list)
    
                        data_json = json.dumps(data_list, ensure_ascii=False) + ",
    "
                        print(type(data_json))
                        with open("error.json", "ab") as f:
                            f.write(data_json.encode('utf-8'))
                        print('*' * 20)
                        print(f)
    
                    finally:
                        num = num + 1
                        os.remove(str(path) + "zoom.jpg")
                        os.remove(str(path) + ".jpg")
                        os.remove(str(path) + ".png")
                        os.remove(str(path) + "index.jpg")
    
    
    
            except Exception as err:
                print('err:%s' % err)
                print('num:%s' % num)
    
            finally:
                print(index)
                browser.quit()
                # 日期也是可以图像识别下来的
                # 只是要构造rangle就行,但是我就是懒
                file = open("../baidu/index.txt", "w")
                for item in index:
                    file.write(str(item) + "
    ")
                file.close()
                time.sleep(2)
        except Exception as err:
            print(err)
            browser.quit()
    
    
    if __name__ == "__main__":
    
        # 每个字大约占横坐标12.5这样
        # 按照字节可自行更改切割横坐标的大小rangle
        # keyword = input("请输入查询关键字:")
        # sel = int(input("查询7天请按0,30天请按1,90天请按2,半年请按3,全部请按4:"))
        # day = 0
        # if sel == 0:
        #     day = 7
        # elif sel == 1:
        #     day = 30
        # elif sel == 2:
        #     day = 90
        # elif sel == 3:
        #     day = 180
        # elif sel == 4:
        #     day = "all"
    
        # 读取文件的数据
        file = open('TVB电视剧名.txt', 'r', encoding='UTF-8')
        line = file.readlines()
        # line = ['战狼', '小雨', '大雨']
        # # 取出文件并去掉换行符号
        thread_list = []
        for i in line:
            data_initial = re.findall(r"[u4e00-u9fa5,0-9,a-z,A-Z]+", i)
            keyword_data = ''.join(data_initial)
            getindex(keyword_data, 7)
        #     # data_initial = re.findall(r"[w]+", i)
        #     # data = ''.join(data_initial)
        #     thread = threading.Thread(target=getindex, args=[keyword, 30])
        #     # 执行线程
        #     thread.start()
        #     # 将所有线程存到列表里
        #     thread_list.append(thread)
        #     time.sleep(10)
        #
        # for thread in thread_list:
        #     # 让父线程等待所有的子线程结束,自己再结束
        #     thread.join()
        #
        # #     print(a)
        # # print(type(line))
        # #
        # # print(line)
        #
        # # file.close()
        #
        # # getindex('战狼', 30)
    

      

  • 相关阅读:
    HTML元素 绑定href属性
    form提交不刷新,不跳转页面
    使用MVCPager做AJAX分页所需要注意的地方
    docker基础命令,常用操作
    docker基础
    redis持久化 RDB与AOF
    redis哨兵功能
    redis主从同步
    redis不重启,切换到RDB备份到AOF备份
    redis-cluster(集群)
  • 原文地址:https://www.cnblogs.com/yoyo1216/p/10147734.html
Copyright © 2011-2022 走看看