python+selenium爬取腾讯视频数据
这两天学习了python的selenium爬取,简单来讲就是通过前端元素,获取内容值,这里用腾讯视频账户数据练习一下
爬取目标:
1> 第一步:搜索到账户“横店一哥”
2
selenium环境配置
1> selenium环境配置,这个的话,就是下载个selenium包就可以
2> 浏览器配置:我用的是谷歌浏览器,所以这里介绍谷歌的配置
谷歌浏览器需要下载对应版本的驱动,比如我的浏览器版本是83的,那么就下载83版本的驱动
驱动:(附上下载地址:chromedriver.storage.googleapis.com/index.html)
到这里开始测试是否可以正常将百度打开:
1、创建Chrome实例 。
driver = webdriver.Chrome()
# 浏览器最大化
driver.maximize_window()
# 2、driver.get方法将定位在给定的URL的网页 。
driver.get(“www.baidu.com”) # 网址
业务代码实现
实现的过程中涉及到几方面的知识:
1> 文件读取和写入:
文件读取(循环每一行读取)
with open("account.txt", "r", encoding='gbk', errors='ignore') as f:
for line in f.readlines():
#这里写自己的处理逻辑
文件写入(追加):
with open("results.txt", "a+") as f:
f.write(result)
2> 业务逻辑上需要考虑的点:
打开另一个窗口时,driver的获取:
# 获取所有窗口的句柄
handles = driver.window_handles
driver.switch_to.window(handles[1]) # 假设此时只有两个窗口,那么就切换到了第二个窗口
元素是否存在的判断:
可能有的用户不存在,可以用元素是否存在的方法来判断(没有相关用户的元素)
判断元素是否存在的代码:
# 判断元素是否存在
def isElementExist(driver,xpathstr):
'''
:param driver:
:param xpathstr: xpath路径
:return: True or False
'''
flag=True
try:
driver.find_element_by_xpath(xpathstr)
return flag
except:
flag=False
return flag
还有一个是用户发的视频数据可能为0:
3> 完整代码如下:
import time
from selenium import webdriver
# 判断元素是否存在
def isElementExist(driver,xpathstr):
'''
:param driver:
:param xpathstr: xpath路径
:return: True or False
'''
flag=True
try:
driver.find_element_by_xpath(xpathstr)
return flag
except:
flag=False
return flag
if __name__ == "__main__":
url = "https://v.qq.com/x/search/?q=dagdth&stag=0&smartbox_ab="
# 1、创建Chrome实例 。
driver = webdriver.Chrome()
# 浏览器最大化
driver.maximize_window()
# 2、driver.get方法将定位在给定的URL的网页 。
driver.get(url) # 网址腾讯视频
time.sleep(1)
with open("account.txt", "r", encoding='gbk', errors='ignore') as f:
for line in f.readlines():
# print(line[:-1])
# user = line[:-1]
user = line.replace('\n','')
# 获取搜索框
search_ele = driver.find_element_by_id("keywords")
# 清空
search_ele.clear()
search_ele.send_keys(user)
# search_ele.send_keys("afsgs")
# 查询按钮
select_ele = driver.find_element_by_xpath("/html/body/div[1]/div[2]/div[1]/div[2]/form/button")
# 点击查询
select_ele.click()
xpathstr = "/html/body/div[2]/div[2]/div[3]/div[1]/div[2]/div/div/div/a[1]"
# 相关用户(筛选掉相关游戏)
xpathstr2 = "/html/body/div[2]/div[2]/div[3]/div[1]/div[1]/div/h3"
# driver.find_element_by_xpath(xpathstr)
flag = isElementExist(driver,xpathstr)
flag2 = isElementExist(driver, xpathstr2)
print(flag)
if flag == True and flag2 == True:
xgtxt_ele = driver.find_element_by_xpath(xpathstr2)
xgtxt = xgtxt_ele.text
print(xgtxt)
if xgtxt == "相关用户":
user_ele = driver.find_element_by_xpath(xpathstr)
user_ele.click()
# 获取所有窗口的句柄
handles = driver.window_handles
driver.switch_to.window(handles[1]) # 假设此时只有两个窗口,那么就切换到了第二个窗口
# 过滤掉视频为0的
count_str_ele = driver.find_element_by_xpath("/html/body/div[2]/div[2]/div[2]/div[1]/span")
count_str = count_str_ele.text
print(count_str)
if count_str == "0":
driver.close()
time.sleep(1)
driver.switch_to.window(handles[0]) # 切回原窗口
else:
first_title_ele = driver.find_element_by_xpath("/html/body/div[4]/div/div[2]/div[1]/div/div[2]/div[1]/div[2]/a")
date_ele = driver.find_element_by_xpath("/html/body/div[4]/div/div[2]/div[1]/div/div[2]/div[3]/div[3]/span[2]")
title = first_title_ele.text
date = date_ele.text
print(title)
print(date)
result = '\n' + user + " " + title + " " + date
with open("results.txt", "a+") as f:
f.write(result)
time.sleep(1)
driver.close()
time.sleep(1)
driver.switch_to.window(handles[0]) # 切回原窗口
# driver.close()
这个算是个比较简单的selenium爬虫操作
数据:
account.txt(账户数据)
result.txt(测试了几个,这里贴一下格式):
写在最后
如果觉得代码可以进一步优化,或者交流的,Q:3459067873