python+selenium爬取腾讯视频数据

这两天学习了python的selenium爬取,简单来讲就是通过前端元素,获取内容值,这里用腾讯视频账户数据练习一下

爬取目标:

1> 第一步:搜索到账户“横店一哥

Java selenium 可以抓包吗 selenium抓取数据_selenium


2

具体实现过程

  • python+selenium爬取腾讯视频数据
  • selenium环境配置
  • 1、创建Chrome实例 。
  • 业务代码实现
  • 写在最后


selenium环境配置

1> selenium环境配置,这个的话,就是下载个selenium包就可以

2> 浏览器配置:我用的是谷歌浏览器,所以这里介绍谷歌的配置

谷歌浏览器需要下载对应版本的驱动,比如我的浏览器版本是83的,那么就下载83版本的驱动

Java selenium 可以抓包吗 selenium抓取数据_Java selenium 可以抓包吗_02


驱动:(附上下载地址:chromedriver.storage.googleapis.com/index.html)

Java selenium 可以抓包吗 selenium抓取数据_html_03


到这里开始测试是否可以正常将百度打开:

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])  # 假设此时只有两个窗口,那么就切换到了第二个窗口

元素是否存在的判断:

可能有的用户不存在,可以用元素是否存在的方法来判断(没有相关用户的元素)

Java selenium 可以抓包吗 selenium抓取数据_数据_04

判断元素是否存在的代码:

# 判断元素是否存在
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:

Java selenium 可以抓包吗 selenium抓取数据_Java selenium 可以抓包吗_05


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(账户数据)

Java selenium 可以抓包吗 selenium抓取数据_html_06


result.txt(测试了几个,这里贴一下格式):

Java selenium 可以抓包吗 selenium抓取数据_selenium_07