我想为instagram构建一个订婚率计算器

2024-03-29 00:23:20 发布

您现在位置:Python中文网/ 问答频道 /正文

我曾尝试为Instagram编写一个订婚率计算器,但它不能正常工作。计算参与率的公式是:最近12篇帖子(不包括最近一篇)的喜欢和评论的平均数除以关注者的数量。我的计算器循环浏览指定文件中的用户名列表,然后转到Instagram上每个用户的配置文件并计算E.R。然后,它将输出(用户名旁边的E.R.)放置在excel电子表格中,并根据页面的跟随者数量将其分列显示。但我的问题是E.R.是错的,我用的是ninjalitics公司的E.R计算器。com作为参考点。这是我的代码,如果你看到任何可能导致错误结果的东西,请告诉我

from selenium import webdriver
from time import sleep
from selenium.webdriver.common.action_chains import ActionChains
import csv


usr = '' #input username for loging in
pw = '' #input password
file = 'Data' #set the name of the file for the ouput

print('\nstatus: working on it...')
print('\n\n')
    
executable_path = r"C:\Users\Acer\Downloads\Insta proj\Insta proj\dist\chromedriver\chromedriver.exe"


driver = webdriver.Chrome(executable_path=executable_path)
driver.get("https://www.instagram.com/")
sleep(1)
driver.find_element_by_name('username').send_keys(usr)
driver.find_element_by_name('password').send_keys(pw)
driver.find_element_by_name('password').submit()
sleep(6)





names = []

data1 = [] #for 1k- 5k
data2 = [] #for 5k-10k
data3 = [] #for 10k-100k
data4 = [] #for 100kk-1M
data5 = [] #for 1M-10M


with open('totalflw.csv', 'r') as filehandle: #here change the filename to the filename you want to input
    for line in filehandle:
        currentPlace = line[:-1]
        names.append(currentPlace)



for name in names:
    
    
    driver.get(f"https://www.instagram.com/{name}/")
    sleep(2)

    
    print('Analysing',name+'...','\n')
    
    
    flrs = (driver.find_elements_by_class_name('Y8-fY ')[1].text.split(' ')[0])
    if flrs[-1] == 'm':
        flrs = float(flrs[:-1])*1000000
    elif flrs[-1] == 'k':
        flrs = float(flrs[:-1])*1000
    else:
        flrs = int(flrs.replace(',',''))
    count = 0
    element_to_hover_over = driver.find_elements_by_class_name("v1Nh3")
    likes = 0
    cmnts = 0
    if len(element_to_hover_over) > 0:
        for each_elem in element_to_hover_over:
            count+=1
            if count == 1: continue
            if count > 13: break
            hover = ActionChains(driver).move_to_element(each_elem)
            hover.perform()
            val = driver.find_element_by_class_name('qn-0x').text.split('\n')

            if val[0][-1] == 'm':
                likes += float(val[0][:-1])*1000000
            elif val[0][-1] == 'k':
                likes += float(val[0][:-1])*1000
            else:
                likes += int(val[0].replace(',',''))

            try:
                if val[1][-1] == 'm':
                    cmnts += float(val[1][:-1])*1000000
                elif val[1][-1] == 'k':
                    cmnts += float(val[1][:-1])*1000
                else:
                    cmnts += int(val[1].replace(',',''))
            except:
                cmnts += 0

    
                
    er = round(((cmnts + likes)/ flrs), 2)
    
    if flrs >= 1000 and flrs < 5000:

        if (er >= 0.57):
            data1.append([name,er])


    if flrs >= 5000 and flrs < 10000:

        if (er >= 0.4):
            data2.append([name,er])


    if flrs >= 10000 and flrs < 100000:

        if (er >= 0.24):
            data3.append([name,er])


    if flrs >= 100000 and flrs < 1000000:

        if (er >= 0.15):
            data4.append([name,er])
            
    if flrs >= 1000000 and flrs <= 10000000:

        if (er >= 0.8):
            data5.append([name,er])
    
    
lent = max(len(data1),len(data2),len(data3),len(data3),len(data5))

    
def takeSecond(elem):
    return elem[1]

data1.sort(reverse=True,key=takeSecond)
data2.sort(reverse=True,key=takeSecond)
data3.sort(reverse=True,key=takeSecond)
data4.sort(reverse=True,key=takeSecond)
data5.sort(reverse=True,key=takeSecond)

with open(file+".csv",'w', encoding='utf-8',newline='') as csvfile:
    csvwriter = csv.writer(csvfile)
    csvwriter.writerow(['1k-5k','','5k-10k','','10k-100k','','100k-1M','','1M-10M'])
    for i in range(0,lent):
        if i+1>len(data1):
            data1.append(['',None])
        if i+1>len(data2):
            data2.append(['',None])
        if i+1>len(data3):
            data3.append(['',None])
        if i+1>len(data4):
            data4.append(['',None])
        if i+1>len(data5):
            data5.append(['',None])
            
        csvwriter.writerow(data1[i]+data2[i]+data3[i]+data4[i]+data5[i])
        
print('status: Analysed all profiles for their Engagment rates!')

Tags: nameforlenifdrivervalelementfind