随着短视频的兴起,公司需要找很多up主谈合作,有些是自己公司签约的up主。签约的up主我们需要每个月统计他的粉丝增长量去报账,以前都是获取粉丝量即可,后面公司规定需要图片来佐证。于是从飞瓜获取截图(飞瓜查询免费用户只能查询10次,如果是免费账户,多注册几个即可)。我使用的是selenium来获取的截图
流程就是 解析本地excel中需要爬的用户信息->用户登录->用户查询->点击详情->定位截图->截图保存
1:解析excel中的用户信息,本地excel将不同平台的数据保存在了不同的sheet中,调用的时候传入对应的sheet名字即可
# 获取主播的名字、url
def get_ks_name(sheet):
cases = []
workbook = xlrd.open_workbook('粉丝分类数据.xlsx')
tale = workbook.sheet_by_name(sheet)
# 获取总行
nrows = tale.nrows
# 从第二行开始
for j in range(0, nrows):
row = tale.row_values(j)
cases.append(
{
'name': row[0],
'type': row[1],
"pingtai": row[2],
'url': row[3]
}
)
return cases
2:初始化浏览器
def driver_init():
driver = webdriver.Chrome()
return driver
3:用户登录,刚开始使用的xpath,一直定位不到登录,后来发现直接使用css定位即可,点击详情页进行截图的时候会打开一个新的页面,所以需要切换页面,然后进行截图,截图调用screenshot即可,截图完成关闭当前页面,返回到原来的页面即可
# 获取快手的信息
def get_ks_info():
driver = driver_init()
driver.get('https://ks.feigua.cn/')
time.sleep(1)
# 点击登陆按钮
driver.find_element_by_xpath('/html/body/div[1]/div[1]/div/div[2]/a').click()
time.sleep(2)
# 点击手机账号登陆
driver.find_element_by_css_selector('#div_qrcode > div.login-code > ul > li:nth-child(2) > a').click()
# 输入账号密码
driver.find_element_by_xpath('//*[@id="div_qrcode"]/div[2]/form/div[1]/input').send_keys('xxxxxx')
driver.find_element_by_xpath('//*[@id="div_qrcode"]/div[2]/form/div[2]/input').send_keys('xxxxx')
# 点击登陆
driver.find_element_by_css_selector('#div_qrcode > div.phone-login > a').click()
time.sleep(3)
# 去掉更新弹窗
driver.find_element_by_css_selector('#js-btn-close').click()
# 点击弹窗确定
# driver.find_element_by_css_selector('#notice-pop > div > div.notice-pop-footer > a').click()
# 去掉续费按钮
# driver.find_element_by_css_selector('#js-btn-close-DashBoard').click()
# 输入主播的名字
case_info= get_ks_name('快手')
firstwin = driver.current_window_handle # 当前的窗体 即第一个页面窗口
for i in range(len(case_info)):
name = case_info[i]['name']
driver.find_element_by_xpath('//*[@id="txtOverallKeyword"]').send_keys(name)
time.sleep(8)
try:
pic = driver.find_element_by_css_selector('#js-overall-container > div:nth-child(2)')
item_info = driver.find_element_by_xpath('//*[@id="js-overall-container"]/div[2]/div[1]/div[1]/em').text
if '搜索到0个结果' == item_info:
name = name + '-没找到-快手'
with open('log.txt', 'a+') as fp:
fp.write(name + '\n')
else:
title = driver.find_element_by_xpath('//*[@id="js-overall-container"]/div[2]/div[1]/div[2]/div[1]/div/div/div[1]').text
if name in title:
# 点击详情
driver.find_element_by_xpath('//*[@id="js-overall-container"]/div[2]/div[1]/div[2]/div[1]/a').click()
time.sleep(6)
allwindows = driver.window_handles
print(len(allwindows))
# 选择注册窗口
for win in allwindows:
if win != firstwin:
driver.switch_to_window(win)
print("切换成功")
time.sleep(1)
pic_info = driver.find_element_by_xpath('//*[@id="content"]/div[4]/div/div[1]')
pic_info.screenshot(name + '快手' + '.png')
time.sleep(1)
driver.close()
for win in allwindows:
if win == firstwin:
driver.switch_to_window(win)
print("回到原来界面")
except Exception as e:
pass
# pic.screenshot(name + '快手' + '.png')
driver.find_element_by_xpath('//*[@id="txtOverallKeyword"]').clear()
4:截图完成将图片分类到不同的文件夹即可
file_path = os.listdir('.')
for i in file_path:
if '快手.png' in i:
shutil.copy(i, '快手'+ '/' + i)
备注:我很多地方调用了time.sleep()函数,其实换一个等待更好,就是常说的显式等待和隐式等待,具体下次写一篇文章