python使用selenium爬虫知乎的方法示例


Posted in Python onOctober 28, 2020

说起爬虫一般想到的情况是,使用 python 中都通过 requests 库获取网页内容,然后通过 beautifulSoup 进行筛选文档中的标签和内容。但是这样有个问题就是,容易被反扒机制所拦住。

反扒机制有很多种,例如知乎:刚开始只加载几个问题,当你往下滚动时才会继续往下面加载,而且在往下滚动一段距离时就会出来一个登陆的弹框。

这样的机制对于通过获取服务器返回内容的爬虫方式进行了限制,我们只能获得前几个回答,而没办法或许后面的回答。

所以需要使用 selenium 模拟真实浏览器进行操作。

最终实现效果如下:

python使用selenium爬虫知乎的方法示例

前提是需要自行搜索教程安装:

  • chromeDriver
  • selenium 库

想要使用下面代码的可以直接修改 driver.get() 里的地址,然后爬取结果最终会存在message.txt文件中

代码如下:

from selenium import webdriver # 从selenium导入webdriver
from selenium.webdriver.common.by import By # 内置定位器策略集
from selenium.webdriver.support.wait import WebDriverWait # 用于实例化一个Driver的显式等待
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.action_chains import ActionChains
import time

option = webdriver.ChromeOptions()
option.add_argument("headless")
driver = webdriver.Chrome() # chrome_options=option 这个参数设置之后可以隐藏浏览器
driver.get('https://www.zhihu.com/question/22110581') #修改这里的地址
file = open("./messages.txt", "w")


def waitFun():
  js = """
  let equalNum = 0;
  window.checkBottom = false;
  window.height = 0;
  window.intervalId = setInterval(()=>{
    let currentHeight = document.body.scrollHeight;
    if(currentHeight === window.height){
      equalNum++;
      if(equalNum === 2){
        clearInterval(window.intervalId);
        window.checkBottom = true;
      }
    }else{
      window.height = currentHeight;
      window.scrollTo(0,window.height);
      window.scrollTo(0,window.height-1000);
    }
  },1500)"""
  # 这个暂停一下是因为要等待页面将下面的内容加载出,这个 1500 可以根据自己的网络快慢进行适当的调节
  # 这里需要往上移动一下,因为不往上移动一下发现不会加载。
  driver.execute_script(js)

# selenium 可以获取 浏览器中 js 的变量。调用的js return
def getHeight(nice):
  # 这里获取 js 中的 checkBottom 变量,作为到底部时进行停止。
  js = """
  return window.checkBottom;
  """
  return driver.execute_script(js)


try:
  # 先触发登陆弹窗。
  WebDriverWait(driver, 40, 1).until(EC.presence_of_all_elements_located(
    (By.CLASS_NAME, 'Modal-backdrop')), waitFun())

  # 点击空白关闭登陆窗口
  ActionChains(driver).move_by_offset(200, 100).click().perform()
  # 当滚动到底部时
  WebDriverWait(driver, 40, 3).until(getHeight, waitFun())
  # 获取回答
  answerElementArr = driver.find_elements_by_css_selector('.RichContent-inner')
  for answer in answerElementArr:
    file.write('==================================================================================')
    file.write('\n')
    file.write(answer.text)
    file.write('\n')
  print('爬取成功 '+ str(len(answerElementArr)) +' 条,存入到 message.txt 文件内')
finally:
  driver.close()  #close the driver

这套代码实现了打开知乎,然后自动向下滑动,当弹出登陆框时,自动点击左上角关闭登陆框。然后继续向下滑动,加载页面,直到滑动到底部。然后将内容写在 message.txt 文件里面。

selenium 功能非常强大, 可以模拟人为在浏览器的操作,进行输入、点击、滑动、播放、暂停等等操作,因此也可以用来写一些脚本,用来刷学时,抢课等等。

到此这篇关于python使用selenium爬虫知乎的方法示例的文章就介绍到这了,更多相关python selenium爬虫知乎内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
Python 字符串大小写转换的简单实例
Jan 21 Python
python用装饰器自动注册Tornado路由详解
Feb 14 Python
Python微信库:itchat的用法详解
Aug 14 Python
pandas pivot_table() 按日期分多列数据的方法
Nov 16 Python
PyCharm设置每行最大长度限制的方法
Jan 16 Python
python实现上传文件到linux指定目录的方法
Jan 03 Python
python encrypt 实现AES加密的实例详解
Feb 20 Python
python数据分析:关键字提取方式
Feb 24 Python
Python3中的f-Strings增强版字符串格式化方法
Mar 04 Python
python GUI编程(Tkinter) 创建子窗口及在窗口上用图片绘图实例
Mar 04 Python
python多线程实现同时执行两个while循环的操作
May 02 Python
pandas 数据类型转换的实现
Dec 29 Python
怎么解决pycharm license Acti的方法
Oct 28 #Python
python如何快速拼接字符串
Oct 28 #Python
Python实现简单的猜单词小游戏
Oct 28 #Python
Python中openpyxl实现vlookup函数的实例
Oct 28 #Python
PyCharm最新激活码(2020/10/27全网最新)
Oct 27 #Python
Python下使用Trackbar实现绘图板
Oct 27 #Python
python openCV自制绘画板
Oct 27 #Python
You might like
基于PHP Web开发MVC框架的Smarty使用说明
2013/04/19 PHP
php微信公众平台开发之获取用户基本信息
2015/08/17 PHP
一个简单至极的PHP缓存类代码
2015/10/23 PHP
Javascript 构造函数,公有,私有特权和静态成员定义方法
2009/11/30 Javascript
js 点击按钮弹出另一页,选择值后,返回到当前页
2010/05/26 Javascript
基于jquery的拖动布局插件
2011/11/25 Javascript
jQuery循环滚动展示代码 可应用到文字和图片上
2012/05/11 Javascript
javascript操作JSON的要领总结
2012/12/09 Javascript
Jquery显示、隐藏元素以及添加删除样式
2013/08/09 Javascript
JQuery操作单选按钮以及复选按钮示例
2013/09/23 Javascript
js中通过父级进行查找定位元素
2014/06/15 Javascript
Jquery实现textarea根据文本内容自适应高度
2015/04/03 Javascript
基于vue.js实现侧边菜单栏
2017/03/20 Javascript
详解Vuejs2.0 如何利用proxyTable实现跨域请求
2017/08/03 Javascript
解决vue-cli webpack打包开启Gzip 报错问题
2019/07/24 Javascript
解决layer.open后laydate失效的问题
2019/09/06 Javascript
Vue如何获取数据列表展示
2019/12/11 Javascript
Layui弹框中数据表格中可双击选择一条数据的实现
2020/05/06 Javascript
浅谈vue单页面中有多个echarts图表时的公用代码写法
2020/07/19 Javascript
小程序实现点击tab切换左右滑动
2020/11/16 Javascript
python实现数据预处理之填充缺失值的示例
2017/12/22 Python
python3.6.3安装图文教程 TensorFlow安装配置方法
2020/06/24 Python
使用python的pexpect模块,实现远程免密登录的示例
2019/02/14 Python
pandas DataFrame 交集并集补集的实现
2019/06/24 Python
Python 运行.py文件和交互式运行代码的区别详解
2019/07/02 Python
django框架面向对象ORM模型继承用法实例分析
2019/07/29 Python
详解django中Template语言
2020/02/22 Python
Python统计文本词汇出现次数的实例代码
2020/02/27 Python
django日志默认打印request请求信息的方法示例
2020/05/17 Python
python文件编写好后如何实践
2020/07/07 Python
中国最大隐形眼镜网上商城:视客眼镜网
2016/10/30 全球购物
Booking.com缤客中国:全球酒店在线预订网站
2020/05/03 全球购物
村捐赠仪式答谢词
2014/01/21 职场文书
2015最新学生自我评价范文
2015/03/03 职场文书
《浅水洼里的小鱼》教学反思
2016/02/16 职场文书
Pytest中skip和skipif的具体使用方法
2021/06/30 Python