使用Selenium实现微博爬虫:预登录、展开全文、翻页
一、区分动态爬虫和静态爬虫
1、静态网页
静态网页是纯粹的HTML,没有后台数据库,不含程序,不可交互,体量较少,加载速度快。静态网页的爬取只需四个步骤:发送请求、获取相应内容、解析内容及保存数据。
2、动态网页
动态网页上的数据会随时间及用户交互发生变化,因此数据不会直接呈现在网页源代码中,数据将以Json的形式保存起来。因此,动态网页比静态网页多了一步,即需渲染获得相关数据。
3、区分动静态网页的方法
加载网页后,点击右键,选中“查看网页源代码”,如果网页上的绝大多数字段都出现源代码中,那么这就是静态网页,否则是动态网页。
二、动态爬虫的两种方法
1.逆向分析爬取动态网页
适用于调度资源所对应网址的数据为json格式,Javascript的触发调度。主要步骤是获取需要调度资源所对应的网址-访问网址获得该资源的数据。(此处不详细讲解)
2.使用Selenium库爬取动态网页
使用Selenium库,该库使用JavaScript模拟真实用户对浏览器进行操作。本案例将使用该方法。
三、安装Selenium库及下载浏览器补丁
1.Selenium库使用pip工具进行安装即可。
2.下载与Chrome浏览器版本匹配的浏览器补丁。
Step1:查看Chrome的版本
Step2:去下载相应版本的浏览器补丁。网址:http://npm.taobao.org/mirrors/chromedriver/
Step3:解压文件,并将之放到与python.exe同一文件下
四、页面打开及预登录
1.导入selenium包
from selenium import webdriver from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.common.by import By import time import pandas as pd
2.打开页面
driver = webdriver.Chrome() print('准备登陆Weibo.cn网站...') #发送请求 driver.get("https://login.sina.com.cn/signup/signin.php") wait = WebDriverWait(driver,5) #重要:暂停1分钟进行预登陆,此处填写账号密码及验证 time.sleep(60)
3.采用交互式运行,运行完上面两段程序,会弹出一个框,这个框就是用来模拟网页的交互。在这个框中完成登录(包括填写登录名、密码及短信验证等)
4.完成预登录,则进入个人主页
五、关键词搜索操作
1.定位上图中的关键词输入框,并在框中输入搜索对象,如“努力学习”
#使用selector去定位关键词搜索框 s_input = driver.find_element_by_css_selector('#search_input') #向搜索框中传入字段 s_input.send_keys("努力学习") #定位搜索键 confirm_btn = driver.find_element_by_css_selector('#search_submit') #点击 confirm_btn.click()
2.当完成上步的代码运行后,会弹出新的窗口,从个人主页跳到微博搜索页。但是driver仍在个人主页,需要人为进行driver的移动,将之移动到微博搜索页。
3.使用switch_to.window()方法移位
#人为移动driver driver.switch_to.window(driver.window_handles[1])
六、识别“展开全文”并爬取数据
1.了解每个元素的Selector,用以定位(重点在于唯一标识性)
2.使用Selector定位元素,并获取相应的数据
comment = [] username = []#抓取节点:每个评论为一个节点(包括用户信息、评论、日期等信息),如果一页有20条评论,那么nodes的长度就为20 nodes = driver.find_elements_by_css_selector('div.card > div.card-feed > div.content')#对每个节点进行循环操作 for i in range(0,len(nodes),1):#判断每个节点是否有“展开全文”的链接flag = Falsetry:nodes[i].find_element_by_css_selector("p>a[action-type='fl_unfold']").is_displayed()flag = True except:flag = False#如果该节点具有“展开全文”的链接,且该链接中的文字是“展开全文c”,那么点击这个要素,并获取指定位置的文本;否则直接获取文本#(两个条件需要同时满足,因为该selector不仅标识了展开全文,还标识了其他元素,没有做到唯一定位)if(flag and nodes[i].find_element_by_css_selector("p>a[action-type='fl_unfold']").text.startswith('展开全文c')):nodes[i].find_element_by_css_selector("p>a[action-type='fl_unfold']").click()comment.append(nodes[i].find_element_by_css_selector('p[node-type="feed_list_content_full"]').text)else:comment.append(nodes[i].find_element_by_css_selector('p[node-type="feed_list_content"]').text)username.append(nodes[i].find_element_by_css_selector("div.info>div:nth-child(2)>a").text)
七、设置翻页
1.使用for循环实现翻页,重点在于识别“下一页”按钮,并点击它
for page in range(49):print(page)# 定位下一页按钮nextpage_button = driver.find_element_by_link_text('下一页')#点击按键driver.execute_script("arguments[0].click();", nextpage_button)wait = WebDriverWait(driver,5)#与前面类似nodes1 = driver.find_elements_by_css_selector('div.card > div.card-feed > div.content')for i in range(0,len(nodes1),1):flag = Falsetry:nodes1[i].find_element_by_css_selector("p>a[action-type='fl_unfold']").is_displayed()flag = Trueexcept:flag = Falseif (flag and nodes1[i].find_element_by_css_selector("p>a[action-type='fl_unfold']").text.startswith('展开全文c')):nodes1[i].find_element_by_css_selector("p>a[action-type='fl_unfold']").click()comment.append(nodes1[i].find_element_by_css_selector('p[node-type="feed_list_content_full"]').text)else:comment.append(nodes1[i].find_element_by_css_selector('p[node-type="feed_list_content"]').text)username.append(nodes1[i].find_element_by_css_selector("div.info>div:nth-child(2)>a").text)
八、保存数据
1.使用DataFrame保存字段
data = pd.DataFrame({'username':username,'comment':comment})
2.导出到Excel
data.to_excel("weibo.xlsx")
九、完整代码
from selenium import webdriver from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.common.by import By from bs4 import BeautifulSoup import time import pandas as pd'''打开网址,预登陆''' driver = webdriver.Chrome() print('准备登陆Weibo.cn网站...') #发送请求 driver.get("https://login.sina.com.cn/signup/signin.php") wait = WebDriverWait(driver,5) #重要:暂停1分钟进行预登陆,此处填写账号密码及验证 time.sleep(60)'''输入关键词到搜索框,完成搜索''' #使用selector去定位关键词搜索框 s_input = driver.find_element_by_css_selector('#search_input') #向搜索框中传入字段 s_input.send_keys("努力学习") #定位搜索键 confirm_btn = driver.find_element_by_css_selector('#search_submit') #点击 confirm_btn.click()#人为移动driver driver.switch_to.window(driver.window_handles[1])'''爬取第一页数据''' comment = [] username = []#抓取节点:每个评论为一个节点(包括用户信息、评论、日期等信息),如果一页有20条评论,那么nodes的长度就为20 nodes = driver.find_elements_by_css_selector('div.card > div.card-feed > div.content')#对每个节点进行循环操作 for i in range(0,len(nodes),1):#判断每个节点是否有“展开全文”的链接flag = Falsetry:nodes[i].find_element_by_css_selector("p>a[action-type='fl_unfold']").is_displayed()flag = True except:flag = False#如果该节点具有“展开全文”的链接,且该链接中的文字是“展开全文c”,那么点击这个要素,并获取指定位置的文本;否则直接获取文本#(两个条件需要同时满足,因为该selector不仅标识了展开全文,还标识了其他元素,没有做到唯一定位)if(flag and nodes[i].find_element_by_css_selector("p>a[action-type='fl_unfold']").text.startswith('展开全文c')):nodes[i].find_element_by_css_selector("p>a[action-type='fl_unfold']").click()comment.append(nodes[i].find_element_by_css_selector('p[node-type="feed_list_content_full"]').text)else:comment.append(nodes[i].find_element_by_css_selector('p[node-type="feed_list_content"]').text)username.append(nodes[i].find_element_by_css_selector("div.info>div:nth-child(2)>a").text)'''循环操作,获取剩余页数的数据''' for page in range(49):print(page)# 定位下一页按钮nextpage_button = driver.find_element_by_link_text('下一页')#点击按键driver.execute_script("arguments[0].click();", nextpage_button)wait = WebDriverWait(driver,5)#与前面类似nodes1 = driver.find_elements_by_css_selector('div.card > div.card-feed > div.content')for i in range(0,len(nodes1),1):flag = Falsetry:nodes1[i].find_element_by_css_selector("p>a[action-type='fl_unfold']").is_displayed()flag = Trueexcept:flag = Falseif (flag and nodes1[i].find_element_by_css_selector("p>a[action-type='fl_unfold']").text.startswith('展开全文c')):nodes1[i].find_element_by_css_selector("p>a[action-type='fl_unfold']").click()comment.append(nodes1[i].find_element_by_css_selector('p[node-type="feed_list_content_full"]').text)else:comment.append(nodes1[i].find_element_by_css_selector('p[node-type="feed_list_content"]').text)username.append(nodes1[i].find_element_by_css_selector("div.info>div:nth-child(2)>a").text)'''保存数据''' data = pd.DataFrame({'username':username,'comment':comment}) data.to_excel("weibo.xlsx")
近期有很多朋友通过私信咨询有关Python学习问题。为便于交流,点击蓝色自己加入讨论解答资源基地
使用Selenium实现微博爬虫:预登录、展开全文、翻页相关推荐
- python爬虫——爬取马蜂窝景点翻页文字评论
python爬虫--爬取马蜂窝景点翻页文字评论 使用Chrome.python3.7.requests库和VSCode进行爬取马蜂窝黄鹤楼的文字评论(http://www.mafengwo.cn/po ...
- 微博爬虫“免登录”技巧详解及Java实现
本文源地址:http://www.fullstackyang.com/...,转发请注明该地址或segmentfault地址,谢谢! 一.微博一定要登录才能抓取? 目前,对于微博的爬虫,大部分是基于模 ...
- 微博爬虫“免登录”技巧详解及 Java 实现(业余草的博客)
一.微博一定要登录才能抓取? 目前,对于微博的爬虫,大部分是基于模拟微博账号登录的方式实现的,这种方式如果真的运营起来,实际上是一件非常头疼痛苦的事,你可能每天都过得提心吊胆,生怕新浪爸爸把你的那些账 ...
- 太大如何翻页固定表头_外行学 Python 爬虫 第六篇 动态翻页
前面几篇文章,初步完成了从网络请求.数据解析.数据存储的整个过程,完成了一个爬虫所需的全部功能.但是通过对数据库中数据的分析会发现数据库中的元件数量比网站上的元件数量少了很多.前面的实现过程通过解析网 ...
- golang微博爬虫-无登录获取cookie抓取微博
使用爬虫框架 gathertool 框架地址: https://github.com/mangenotwork/gathertool 框架下载: go get github.com/mangenotw ...
- python 爬取微博展开全文数据 BeautifulSoup
最近,被逼无奈开始自学python爬虫.爬取微博网页版话题下的发布微博内容数据,发现有的微博需要点击展开全文按钮才能获得全文数据,否则只有部分数据.探索了一下发现大多都是selenium+python ...
- selenium爬虫翻页、刷新+循环的深坑
最近在用selenium开发爬虫,爬取网站就是51job,在爬虫时,总会在翻页后就遇到这类错误: StaleElementReferenceException: Message: stale elem ...
- [Python Scrapy爬虫] 二.翻页爬取农产品信息并保存本地
前面 "Python爬虫之Selenium+Phantomjs+CasperJS" 介绍了很多Selenium基于自动测试的Python爬虫程序,主要利用它的xpath语句,通过分 ...
- selenium翻页获取京东图书名称和价格
selenium翻页获取京东图书名称和价格 案例目的: 通过selenium翻页爬取京东图书名称和价格,介绍如何通过selenium模拟鼠标滑轮,点击,翻页等操作. 案例功能: 输入要爬取的页数,批量 ...
最新文章
- ACMNO.22 C语言-公约公倍2 写两个函数,分别求两个整数的最大公约数和最小公倍数,用主函数调用这两个函数,并输出结果两个整数由键盘输入。 输入 两个数 输出 最大公约数 最小公倍数
- 有关git clone 下载速度变慢的解决方法
- Python实战系列之调用小黄鸡simsimi
- iOS微博项目(一)
- cocos2dx游戏--欢欢英雄传说--添加攻击按钮
- 23种设计模式----------代理模式(一)
- Linux查看文件和日志的常用命令
- StringBuffer,StringBuilder区别是啥
- 基于JAVA+SpringMVC+Mybatis+MYSQL的实验室设备管理系统
- sklearn 数据预处理1: StandardScaler
- java防止浏览器直接打开下载的文件
- git config配置
- word文档在程序未响应的情况下强行关闭未保存怎么恢复?
- 中继器是什么计算机网络,中继器是什么
- java 临时文件_Java临时文件
- 计算机无法连接到手机热点,电脑搜不到手机的热点是为什么_电脑无法发现手机热点的处理方法...
- 有关上拉输入、下了输入、推挽输出、开漏输出、复用开漏输出、复用推挽输出以及、浮空输入、模拟输入区别
- 怎么比较两个字符串的大小?
- 关于设计抗混叠滤波器的三个指导原则
- matplotlib绘制曲线图
热门文章
- 次世代建模是什么?学到什么程度才能接单赚钱
- 普林斯顿和宾大沃顿早申录取公布,常青藤精英教育一举拿下
- 【二次分配问题】基于遗传算法 (GA)、粒子群优化 (PSO) 和萤火虫算法 (FA) 求解二次分配( QAP)问题(MATLAB 实现)
- 基于Android的看小说APP源码Android本科毕业设计Android小说阅读器、小说APP源码
- windows10无线网络未连接打红叉怎么办
- vue 中provide的用法_[转]浅谈vue中provide和inject 用法
- 【076】朴素贝叶斯介绍
- NAS不够快?那就上SSD享受如火箭般的体验吧!
- office2010如何使用excel冻结窗格
- Vosk可以用于Unity的离线语音识别