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

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

1.登录微博

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

from selenium import webdriver
from time import sleep
import json
from selenium.webdriver.common.by import Byif __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的cookiesjsonCookies = 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里添加cookiesfor 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')

登录后的页面如下图

2.3搜索内容并且爬取

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

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

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

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

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

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

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

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

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("已经搜索过")continueelse:print("还没搜索过")# 每次都向下滑动400像素,大致符合一条微博的高度changepage(400)# sleep(0.5)newpage = a[i].get_attribute("href")# 打印hrefprint(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 = Falseexcept:t = Trueprint(t)while t:try:browser.find_element(By.XPATH, '//div[@class="Bottom_text_1kFLe"]')t = Falseexcept:t = TrueWebDriverWait(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:continueelse: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 Keystext = []
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里添加cookiesfor 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("已经搜索过")continueelse:print("还没搜索过")# 每次都向下滑动400像素,大致符合一条微博的高度changepage(400)# sleep(0.5)newpage = a[i].get_attribute("href")# 打印hrefprint(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 = Falseexcept:t = Trueprint(t)while t:try:browser.find_element(By.XPATH, '//div[@class="Bottom_text_1kFLe"]')t = Falseexcept:t = TrueWebDriverWait(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:continueelse:print(comment)text.append(comment)sleep(0.1)changepage(600)if __name__ == "__main__":# 打开浏览器进入微博登录页面browser = browser_initial()# 使用cookie登录微博log_csdn(browser)# 爬取相关用户的评论search("杭州地铁")

里面的数据处理还没做,大家可以自己打印出来后根据自己的需要进行处理。

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

  1. 【selenium爬虫】用selenium自动化爬虫爬取海贼王动漫图片

    以下内容为本人原创,欢迎大家观看学习,禁止用于商业用途,转载请说明出处,谢谢合作! ·作者:@Yhen ·原文网站:CSDN ·原文链接:https://blog.csdn.net/Yhen1/art ...

  2. Python高级特性与网络爬虫(二):使用Selenium自动化测试工具爬取一号店商品信息

    上一篇介绍了Ajax动态渲染的页面的分析和爬取,通过JavaScript动态渲染的页面的方式不只有ajax这一种,还有很多其他的方式,分析他们的网页结构和加密参数难度非常大,为了解决这样的页面的数据爬 ...

  3. python爬取微博内容_Python 爬虫如何机器登录新浪微博并抓取内容?

    最近为了做事件分析写了一些微博的爬虫,两个大V总共爬了超70W的微博数据. 官方提供的api有爬取数量上限2000,想爬取的数据大了就不够用了... 果断撸起袖子自己动手!先简单说一下我的思路: 一. ...

  4. python爬取“微博”移动端评论数据

    目的 爬取微博移动端的评论数据(如下图),然后将数据保存到.txt文件和.xlsl文件中. 实现过程 实现的方法很简单,就是模拟浏览器发送ajax请求,然后获取后端传过来的json数据. 一.找到获取 ...

  5. scrapy多cookies+ip代理稳定爬取微博m站评论以及子评论

    为了以后的深度学习可以爬取更多更好的语料以及其他资源,先拿weibo移动端试了下手(果然一进就全是坑-) 1.分析weibo登陆以获取cookies 1)预请求获取服务器信息 2)构建请求登陆url ...

  6. Selenium自动化|爬取公众号全部文章,就是这么简单

    大家好,今天我们来讲点Selenium自动化,你是否有特别喜欢的公众号?你有思考过如何将一个公众号历史文章全部文章爬下来学习吗?现在我们以早起Python为例,使用Selenium来实现 下面就来详细 ...

  7. 爬取微博全部一级评论(简单有效)

    要爬取的 import requests,json from lxml import etree import xlwt wookbook=xlwt.Workbook(encoding='utf-8' ...

  8. python爬取微博内容_请问该如何通过python调用新浪微博的API来爬取数据?

    1:安装python(这个不多说啦) 2:下载新浪微博SDK的python包,解压为weibopy目录 3:申请AppKey, 流程: 1:通过oAuth认证 按我的理解简化如下: 用户在新浪微博给的 ...

  9. 如何使用python简单的爬取微博搜索的内容

    UI界面输入关键词用python爬取微博内容 第一步:创建main.py文件,用来作为主类. 在main.py文件中进行以下操作. 一.程序入口,明白接下来进行的操作 1.加载UI界面. 2.爬取网页 ...

  10. python爬取微博指定内容_python3.5爬虫-爬取微博某博主微博内容

    想要爬取某个博主的微博数据.在网络上寻找了很多关于爬取微博内容的教程,发现有些教程比较老旧了,已经无法再用,有些教程在我这里出现一些问题,比如爬取移动端的微博需要获取登陆cookie,而我的谷歌浏览器 ...

最新文章

  1. 【组队学习】【35期】深入浅出Pytorch
  2. 《软件设计精要与模式》前言
  3. activexobject对象不能创建_面向对象设计方法(Object oriented)
  4. 如何编写java请求_如何避免将Java请求从Java Web服务器发送到自身?
  5. matplotlib —— 添加文本信息(text)
  6. 为什么要学习Python?怎么学?
  7. 小心了!这18位数字一泄漏,支付宝账户就可能会被他人盗刷!
  8. windows中的凭据管理
  9. DirectShow 在 VS2010 中开发环境的设置
  10. python turtle画阴阳_Python turtle绘制阴阳太极图代码解析
  11. Linux下的tar命令
  12. cpc专利电子申请客户端安装教程以及常见错误
  13. java-net-php-python-jsp安利达物流公司管理系统计算机毕业设计程序
  14. 漫画:从今天开始,我不再买书了!
  15. Oracle进阶(六)包(Package)和包体
  16. 屏幕不光只看尺寸 各材质屏幕实战解析
  17. 抖音电商的带货情况究竟如何,抖音电商带货前景如何
  18. vue验证手机号、密码验证码、时间、机型、图片类型等
  19. 第996号互联网世界终结了
  20. HINSTANCE/HWND/CWnd/HANDLE 的区别

热门文章

  1. php.ini文件中的 session.save_path是个坑爹的玩意!
  2. 常见不等式考察(一)——Jensen不等式
  3. 51单片机学习——1天学完普中基本实验例程,走马观花式学习,大家切勿效仿。
  4. 理论物理考研攻略!!!
  5. LinkedIn领英上的几度人脉是什么意思?如何突破领英人脉限制高效率开发客户?
  6. 传动系统结构简图_液压传动系统结构示意图画图技巧(攻略)
  7. 思科模拟器Cisco Packet Tracer 的安装与使用(汉化教程)
  8. dede织梦CMS采集过滤规则
  9. RubyOnRails 学习网站
  10. 解决Win10 /Win11 Fastboot驱动问题