使用selenium自动化工具爬取微博内容和评论

这篇具有很好参考价值的文章主要介绍了使用selenium自动化工具爬取微博内容和评论。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

任务需求是爬取微博的内容和评论。一开始我是准备直接用正常的爬虫来做,但是发现微博上的内容几乎都是动态加载生成的。所以了解了一下就学习使用·selenium自动化测试工具来爬取相关数据。

首先是不登录微博,发现只能查看最多二十条数据,这自然限制太大所以还是需要实现登录后再爬取。

1.登录微博

由于微博现在的登录不能只输入账号密码,所以通过查找了一些方法后选用了注入cookie来实现自动登录。而想要注入的cookie需要自己先登录获得。这里直接使用了各位大佬给出的方法。实现扫码登录后获取cookie。

from selenium import webdriver
from time import sleep
import json
from selenium.webdriver.common.by import By

if __name__ == '__main__':
    driver = webdriver.Chrome()
    driver.maximize_window()
    driver.get('https://weibo.com/login.php')
    sleep(6)
    a = driver.find_element(By.XPATH, '//*[@id="pl_login_form"]/div/div[1]/div/a[2]')
    a.click()
    sleep(10)
    dictCookies = driver.get_cookies()  # 获取list的cookies
    jsonCookies = json.dumps(dictCookies)  # 转换成字符串保存
    with open('微博_cookies.txt', 'w') as f:
        f.write(jsonCookies)
    print('cookies保存成功!')

2.通过获取到的cookie实现自动登录然后爬取用户微博内容和评论

2.1打开浏览器,进入到登录页面。这里我最大化窗口了。

# 打开浏览器,进入到微博登录页面
def browser_initial():
    browser = webdriver.Chrome()
    browser.maximize_window()
    browser.get('https://weibo.com/login.php')
    return browser

2.2实现自动化登录

# 将已经登录获得的cookie写入,实现自动登录
def log_csdn(browser):
    with open('微博_cookies.txt', 'r', encoding='utf8') as f:
        listCookies = json.loads(f.read())

    # 往browser里添加cookies
    for cookie in listCookies:
        cookie_dict = {
            'domain': '.weibo.com',
            'name': cookie.get('name'),
            'value': cookie.get('value'),
            "expires": '',
            'path': '/',
            'httpOnly': False,
            'HostOnly': False,
            'Secure': False
        }
        #print(cookie_dict)
        browser.add_cookie(cookie_dict)
    sleep(1)
    browser.get('https://weibo.com/login.php')

登录后的页面如下图

 

微博评论爬取,爬虫,selenium,自动化,测试工具,爬虫,新浪微博

2.3搜索内容并且爬取

这时候需要在左上角的搜索框输入自己需要搜索的用户,然后通过按回车来实现搜索

微博评论爬取,爬虫,selenium,自动化,测试工具,爬虫,新浪微博

 得到新的页面里可以看到最上方会显示相关的账户,找到相关元素并点击即可

微博评论爬取,爬虫,selenium,自动化,测试工具,爬虫,新浪微博

最后进入到用户的完整页面

微博评论爬取,爬虫,selenium,自动化,测试工具,爬虫,新浪微博

这时侯就可以开始爬取用户的微博信息和评论了。由于微博的内容是动态加载的,通过F12可以看到一开始是仅展示六条内容的元素

微博评论爬取,爬虫,selenium,自动化,测试工具,爬虫,新浪微博

通过滑动,元素会逐渐增加,但是上限是12个,并且后面会出现元素顺序和微博内容顺序不符的情况。如果单单爬取微博的内容,不爬评论那还好,只需要定位到每一个元素块,获取其内部的text文本然后处理一下就可以获得自己想要的信息。但是由于还要爬取相应的评论内容,并且评论还要和微博内容相对应,所以不能直接进行爬取。

这里我选择微博内容里的时间元素里的href

 

微博评论爬取,爬虫,selenium,自动化,测试工具,爬虫,新浪微博

 通过点击这个a标签,可以跳转到该条微博的详情页面

微博评论爬取,爬虫,selenium,自动化,测试工具,爬虫,新浪微博

这时候就可以分块爬起微博的内容以及转发数、评论数、点赞数和评论的内容了。要注意的是这里的转发数评论数这些可能存在多个,比如此图里是转发他人微博,他人微博里也有转发数这些。还有就是评论的内容有可能是开启精选后的,和普通的评论内容要做判断。 爬取完微博内容和评论后点击上方的返回按钮,回到之前的页面。

hrefs = []

# 搜索内容
def search(username):
    # 等待元素出现再进行下一步
    WebDriverWait(browser, 15).until(EC.presence_of_element_located((By.CLASS_NAME, "woo-pop-ctrl")))
    # 获取搜索框元素
    searchinput = browser.find_element(By.CLASS_NAME, 'woo-input-main')
    # 将要搜索的内容写入搜索框
    searchinput.send_keys(username)
    # 等待0.5秒后按回车
    sleep(0.2)
    searchinput.send_keys(Keys.ENTER)
    # 转移句柄到新的页面
    new_window = browser.window_handles[-1]
    # 关闭原来的页面
    browser.close()
    # 窗口转移到新的页面
    browser.switch_to.window(new_window)
    # 等待
    WebDriverWait(browser, 15).until(EC.presence_of_element_located((By.CLASS_NAME, "card-wrap")))
    # 定位用户微博头像并点击
    weibo = browser.find_element(By.XPATH, '//div[@class="card card-user-b s-brt1 card-user-b-padding"]/div/a')
    weibo.click()
    new_window = browser.window_handles[-1]
    browser.switch_to.window(new_window)
    WebDriverWait(browser, 15).until(EC.presence_of_element_located((By.CLASS_NAME, "vue-recycle-scroller__item-view")))

    # 微博一次最多给12条内容的元素,并且给出的元素不保证顺序。
    # 所以第一次进入页面的时候获取所有的内容元素,a标签里的href唯一,所以将其提取出来
    for t in range(3):
        a = browser.find_elements(By.XPATH, '//div[@class="woo-box-item-flex head_main_3DRDm"]/div/div[2]/a')
        # 在获取到的列表里进行筛选,已经爬取过的微博就跳过
        for i in range(len(a)):
            if a[i].get_attribute("href") in hrefs:
                print("已经搜索过")
                continue
            else:
                print("还没搜索过")
                # 每次都向下滑动400像素,大致符合一条微博的高度
                changepage(400)
                # sleep(0.5)
                newpage = a[i].get_attribute("href")
                # 打印href
                print(newpage)
                hrefs.append(newpage)
                # print(comments)
                # 打印已经搜索的微博内容数
                print(len(hrefs))
                # 使用js脚本来点击元素,否则可能出现元素不在网页上,无法交互的报错
                # a[i].click()
                browser.execute_script("arguments[0].click();", a[i])
                # 不要直接用href去请求,否则点击返回的时候会直接回到微博首页面
                # browser.get(newpage)
                sleep(0.5)
                # 爬取具体内容页面的内容和评论
                findall()
                sleep(0.2)
                # 找到返回按钮并点击
                WebDriverWait(browser, 15).until(EC.presence_of_element_located((By.XPATH,
                                            '//div[@class="woo-box-flex woo-box-alignCenter Bar_left_2J3kl Bar_hand_2VAG1"]/i')))
                back = browser.find_element(By.XPATH,
                                            '//div[@class="woo-box-flex woo-box-alignCenter Bar_left_2J3kl Bar_hand_2VAG1"]/i')
                back.click()

 

text = []

# 将页面向下滑动px像素
def changepage(px):
    browser.execute_script("window.scrollBy(0, {})".format(px))

# 爬取微博的内容和评论
def findall():
    # 等待页面元素加载
    WebDriverWait(browser, 15).until(EC.presence_of_element_located((By.CLASS_NAME, "Feed_body_3R0rO")))
    body = browser.find_element(By.CLASS_NAME, 'Feed_body_3R0rO')
    # 通过换行来划分内容
    bodytext = body.text.split("\n")
    print(bodytext)
    # 找到转发评论点赞的元素,但是如果有微博内容为转发他人的微博,则存在两个footer元素,
    # 所以寻找多个,然后取最后那一个
    footer = browser.find_elements(By.TAG_NAME, 'footer')
    footertext = footer[-1].text.split("\n")
    print(footertext[1])
    WebDriverWait(browser, 15).until(EC.presence_of_element_located((By.CLASS_NAME, "Detail_box_3Jeom")))
    try:
        prompt = browser.find_element(By.CLASS_NAME, "RepostCommentList_tip_2O5W-")
        print(prompt.text)
        t = False
    except:
        t = True
    print(t)
    while t:
        try:
            browser.find_element(By.XPATH, '//div[@class="Bottom_text_1kFLe"]')
            t = False
        except:
            t = True
            WebDriverWait(browser, 15).until(
                EC.presence_of_element_located((By.XPATH, '//div[@class="vue-recycle-scroller__item-wrapper"]')))
            pagecomment = browser.find_elements(By.XPATH, '//div[@class="vue-recycle-scroller__item-view"]')
            for i in pagecomment:
                comment = i.text.split("\n")
                if comment in text:
                    continue
                else:
                    print(comment)
                    text.append(comment)
        sleep(0.1)
        changepage(600)

 最后爬取内容和评论的总的代码如下:

from selenium import webdriver
from time import sleep
import json
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys

text = []
hrefs = []

# 打开浏览器,进入到微博登录页面
def browser_initial():
    browser = webdriver.Chrome()
    browser.maximize_window()
    browser.get('https://weibo.com/login.php')
    return browser


# 将已经登录获得的cookie写入,实现自动登录
def log_csdn(browser):
    with open('微博_cookies.txt', 'r', encoding='utf8') as f:
        listCookies = json.loads(f.read())

    # 往browser里添加cookies
    for cookie in listCookies:
        cookie_dict = {
            'domain': '.weibo.com',
            'name': cookie.get('name'),
            'value': cookie.get('value'),
            "expires": '',
            'path': '/',
            'httpOnly': False,
            'HostOnly': False,
            'Secure': False
        }
        #print(cookie_dict)
        browser.add_cookie(cookie_dict)
    sleep(1)
    browser.get('https://weibo.com/login.php')
    #print(browser.get_cookies())
    #browser.refresh()  # 刷新网页,cookies才成功

# 搜索内容
def search(username):
    # 等待元素出现再进行下一步
    WebDriverWait(browser, 15).until(EC.presence_of_element_located((By.CLASS_NAME, "woo-pop-ctrl")))
    # 获取搜索框元素
    searchinput = browser.find_element(By.CLASS_NAME, 'woo-input-main')
    # 将要搜索的内容写入搜索框
    searchinput.send_keys(username)
    # 等待0.5秒后按回车
    sleep(0.2)
    searchinput.send_keys(Keys.ENTER)
    # 转移句柄到新的页面
    new_window = browser.window_handles[-1]
    # 关闭原来的页面
    browser.close()
    # 窗口转移到新的页面
    browser.switch_to.window(new_window)
    # 等待
    WebDriverWait(browser, 15).until(EC.presence_of_element_located((By.CLASS_NAME, "card-wrap")))
    # 定位用户微博头像并点击
    weibo = browser.find_element(By.XPATH, '//div[@class="card card-user-b s-brt1 card-user-b-padding"]/div/a')
    weibo.click()
    new_window = browser.window_handles[-1]
    browser.switch_to.window(new_window)
    WebDriverWait(browser, 15).until(EC.presence_of_element_located((By.CLASS_NAME, "vue-recycle-scroller__item-view")))

    # 微博一次最多给12条内容的元素,并且给出的元素不保证顺序。
    # 所以第一次进入页面的时候获取所有的内容元素,a标签里的href唯一,所以将其提取出来
    for t in range(3):
        a = browser.find_elements(By.XPATH, '//div[@class="woo-box-item-flex head_main_3DRDm"]/div/div[2]/a')
        # 在获取到的列表里进行筛选,已经爬取过的微博就跳过
        for i in range(len(a)):
            if a[i].get_attribute("href") in hrefs:
                print("已经搜索过")
                continue
            else:
                print("还没搜索过")
                # 每次都向下滑动400像素,大致符合一条微博的高度
                changepage(400)
                # sleep(0.5)
                newpage = a[i].get_attribute("href")
                # 打印href
                print(newpage)
                hrefs.append(newpage)
                # print(comments)
                # 打印已经搜索的微博内容数
                print(len(hrefs))
                # 使用js脚本来点击元素,否则可能出现元素不在网页上,无法交互的报错
                # a[i].click()
                browser.execute_script("arguments[0].click();", a[i])
                # 不要直接用href去请求,否则点击返回的时候会直接回到微博首页面
                # browser.get(newpage)
                sleep(0.5)
                # 爬取具体内容页面的内容和评论
                findall()
                sleep(0.2)
                # 找到返回按钮并点击
                WebDriverWait(browser, 15).until(EC.presence_of_element_located((By.XPATH,
                                            '//div[@class="woo-box-flex woo-box-alignCenter Bar_left_2J3kl Bar_hand_2VAG1"]/i')))
                back = browser.find_element(By.XPATH,
                                            '//div[@class="woo-box-flex woo-box-alignCenter Bar_left_2J3kl Bar_hand_2VAG1"]/i')
                back.click()

# 将页面向下滑动px像素
def changepage(px):
    browser.execute_script("window.scrollBy(0, {})".format(px))

# 爬取微博的内容和评论
def findall():
    # 等待页面元素加载
    WebDriverWait(browser, 15).until(EC.presence_of_element_located((By.CLASS_NAME, "Feed_body_3R0rO")))
    body = browser.find_element(By.CLASS_NAME, 'Feed_body_3R0rO')
    # 通过换行来划分内容
    bodytext = body.text.split("\n")
    print(bodytext)
    # 找到转发评论点赞的元素,但是如果有微博内容为转发他人的微博,则存在两个footer元素,
    # 所以寻找多个,然后取最后那一个
    footer = browser.find_elements(By.TAG_NAME, 'footer')
    footertext = footer[-1].text.split("\n")
    print(footertext[1])
    WebDriverWait(browser, 15).until(EC.presence_of_element_located((By.CLASS_NAME, "Detail_box_3Jeom")))
    try:
        prompt = browser.find_element(By.CLASS_NAME, "RepostCommentList_tip_2O5W-")
        print(prompt.text)
        t = False
    except:
        t = True
    print(t)
    while t:
        try:
            browser.find_element(By.XPATH, '//div[@class="Bottom_text_1kFLe"]')
            t = False
        except:
            t = True
            WebDriverWait(browser, 15).until(
                EC.presence_of_element_located((By.XPATH, '//div[@class="vue-recycle-scroller__item-wrapper"]')))
            pagecomment = browser.find_elements(By.XPATH, '//div[@class="vue-recycle-scroller__item-view"]')
            for i in pagecomment:
                comment = i.text.split("\n")
                if comment in text:
                    continue
                else:
                    print(comment)
                    text.append(comment)
        sleep(0.1)
        changepage(600)

if __name__ == "__main__":
    # 打开浏览器进入微博登录页面
    browser = browser_initial()
    # 使用cookie登录微博
    log_csdn(browser)
    # 爬取相关用户的评论
    search("杭州地铁")

里面的数据处理还没做,大家可以自己打印出来后根据自己的需要进行处理。文章来源地址https://www.toymoban.com/news/detail-784235.html

到了这里,关于使用selenium自动化工具爬取微博内容和评论的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 如何使用自动化测试工具Selenium?

    哈喽,大家好,我是小浪。那么有一段时间没有更新了,还是在忙实习和秋招的事情,那么今天也是实习正式结束啦,开始继续更新我们的学习博客,后期主要是开发和测试的学习博客内容巨多,感兴趣的小伙伴们可以一键三连支持一下欧~ 目录 一、什么是自动化测试? 二、

    2024年02月11日
    浏览(42)
  • selenium自动化测试教程——java爬取数据

    selenium 是一个用于自动化测试 Web 应用的工具集 ,它可以模拟用户自动去浏览器网页上进行点击、输入、选择下拉值复选框、鼠标移动、任意 JavaScript 执行等等操作。 selenium 有三个产品: Selenium WebDriver:基于浏览器的回归自动化套件和测试,你可以使用 Java、Python、JavaScri

    2024年02月14日
    浏览(41)
  • Web测试自动化工具Selenium的使用

    Selenium是一个Web应用测试的自动化工具,它通过模拟点击实现对Web应用的功能测试。测试时,除了Selenium,还需要对应的浏览器驱动,如在Chrome实现自动点击,则需要chromedriver。 Selenium支持多种语言和多种浏览器,本文仅记录python+chrome的使用。 1. 安装python 略 2. 安装Selenium 注

    2024年01月16日
    浏览(74)
  • Selenium自动化工具集 - 完整指南和使用教程

    Selenium 是一个用于自动化浏览器操作的工具集。它通过模拟用户在浏览器中的行为,如点击、输入、表单提交等,来实现自动化测试和网页数据抓取等功能。Selenium 针对不同的浏览器提供了不同的 WebDriver 接口,如 ChromeDriver、GeckoDriver(Firefox)、WebDriver(Safari)等。 以下是基

    2024年02月11日
    浏览(25)
  • Python自动化测试工具selenium使用指南

    概述 selenium 是网页应用中最流行的自动化测试工具,可以用来做自动化测试或者浏览器爬虫等。官网地址为:相对于另外一款web自动化测试工具QTP来说有如下优点: 免费开源轻量级,不同语言只需要一个体积很小的依赖包 支持多种系统,包括Windows,Mac,Linux 支持多种浏览器

    2024年02月04日
    浏览(49)
  • 自动化测试工具 —— selenium介绍及基本使用方法

    Selenium是一个开源、免费、简单、灵活,对Web浏览器支持良好的自动化测试工具,在UI自动化、爬虫等场景下是十分实用的,能够熟练掌握并使用Selenium工具可以大大的提高效率。 Selenium简介 Selenium支持多平台、多浏览器、多语言去实现自动化测试,是一个开源和可移植的Web测

    2024年02月05日
    浏览(48)
  • 【0基础学爬虫】爬虫基础之自动化工具 Selenium 的使用

    大数据时代,各行各业对数据采集的需求日益增多,网络爬虫的运用也更为广泛,越来越多的人开始学习网络爬虫这项技术,K哥爬虫此前已经推出不少爬虫进阶、逆向相关文章,为实现从易到难全方位覆盖,特设【0基础学爬虫】专栏,帮助小白快速入门爬虫,本期为自动化

    2023年04月20日
    浏览(38)
  • 自动化测试工具Selenium的基本使用方法,软件测试基础

    browser.find_element(By.ID,‘kw’).send_keys(“美女”) browser.find_element_by_id(‘kw’).send_keys(‘性感’) 2.通过标签name属性进行定位 browser.find_element_by_name(“wd”).send_keys(“Linux”) browser.find_element(By.NAME,‘wd’).send_keys(“美女”) 3.通过标签名进行定位 browser.find_element_by_tag_name(“input”).

    2024年04月22日
    浏览(48)
  • python自动化测试工具selenium使用指南 ,绝对能帮到你

    目录 概述 python+selenium环境安装 使用selenium启动浏览器 selenium页面加载等待和检测 使用time.sleep()等待 使用implicitly_wait设置最长等待时间 使用WebDriverWait设置等待条件 检测document是否加载完成 selenium元素定位和读取 查找元素 dom元素交互 查找元素失败处理 selenium交互控制 Actio

    2024年02月08日
    浏览(41)
  • 测试员进阶必看系列 “ python自动化测试工具selenium使用指南 ”

    概述 python+selenium环境安装 使用selenium启动浏览器 selenium页面加载等待和检测 使用time.sleep()等待 使用implicitly_wait设置最长等待时间 使用WebDriverWait设置等待条件 检测document是否加载完成 selenium元素定位和读取 查找元素 dom元素交互 查找元素失败处理 selenium交互控制 ActionChains动

    2024年02月05日
    浏览(96)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包