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复制与引用用法分析
Apr 08 Python
使用Python编写提取日志中的中文的脚本的方法
Apr 30 Python
详解python 发送邮件实例代码
Dec 22 Python
Tensorflow 训练自己的数据集将数据直接导入到内存
Jun 19 Python
Python OpenCV处理图像之图像直方图和反向投影
Jul 10 Python
浅析python继承与多重继承
Sep 13 Python
python pickle存储、读取大数据量列表、字典数据的方法
Jul 07 Python
pygame实现烟雨蒙蒙下彩虹雨
Nov 11 Python
python3 图片 4通道转成3通道 1通道转成3通道 图片压缩实例
Dec 03 Python
jupyter notebook 多行输出实例
Apr 09 Python
Python计算信息熵实例
Jun 18 Python
简述python&pytorch 随机种子的实现
Oct 07 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 配置open_basedir 让各虚拟站点独立运行
2009/11/12 PHP
php解压文件代码实现php在线解压
2014/02/13 PHP
Thinkphp将二维数组变为标签适用的一维数组方法总结
2014/10/30 PHP
php文件夹的创建与删除方法
2015/01/24 PHP
php简单操作mysql数据库的类
2015/04/16 PHP
PHP进程通信基础之信号量与共享内存通信
2017/02/19 PHP
PHP CodeIgniter分页实例及多条件查询解决方案(推荐)
2017/05/20 PHP
JavaScript检查弹出窗口是否被阻拦的方法技巧
2015/03/13 Javascript
javascript文件加载管理简单实现方法
2015/07/25 Javascript
Angular.js 实现数字转换汉字实例代码
2016/07/14 Javascript
NodeJS使用formidable实现文件上传
2016/10/27 NodeJs
进阶之初探nodeJS
2017/01/24 NodeJs
nodejs socket实现的服务端和客户端功能示例
2017/06/02 NodeJs
解决vue中虚拟dom,无法实时更新的问题
2018/09/15 Javascript
layui自己添加图片按钮并点击跳转页面的例子
2019/09/14 Javascript
js实现鼠标拖拽div左右滑动
2020/01/15 Javascript
JavaScript进制转换实现方法解析
2020/01/18 Javascript
Vue props中Object和Array设置默认值操作
2020/07/30 Javascript
PyQt5 pyqt多线程操作入门
2018/05/05 Python
python环境路径配置以及命令行运行脚本
2019/04/02 Python
扩展Django admin的list_filter()可使用范围方法
2019/08/21 Python
如何在python中写hive脚本
2019/11/08 Python
解决pandas展示数据输出时列名不能对齐的问题
2019/11/18 Python
使用python+poco+夜神模拟器进行自动化测试实例
2020/04/23 Python
Python使用正则表达式实现爬虫数据抽取
2020/08/17 Python
特罗佩亚包官方网站:Tropea
2017/01/03 全球购物
莱德杯高尔夫欧洲官方商店:Ryder Cup Shop
2019/08/14 全球购物
database面试题
2013/03/28 面试题
茶叶生产计划书
2014/01/10 职场文书
洗发水广告词
2014/03/13 职场文书
道德大讲堂实施方案
2014/05/14 职场文书
经典毕业生求职信
2014/07/12 职场文书
入股合作协议书
2014/10/12 职场文书
先进人物事迹材料
2014/12/29 职场文书
《中华上下五千年》读后感3篇
2019/11/29 职场文书
话题作文之呼唤
2019/12/18 职场文书