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的Django框架部署的一些建议
Apr 09 Python
Android模拟器无法启动,报错:Cannot set up guest memory ‘android_arm’ Invalid argument的解决方法
Jul 01 Python
Python+OpenCV人脸检测原理及示例详解
Oct 19 Python
python实现寻找最长回文子序列的方法
Jun 02 Python
对python 自定义协议的方法详解
Feb 13 Python
使用python list 查找所有匹配元素的位置实例
Jun 11 Python
详解Python用三种方式统计词频的方法
Jul 29 Python
Python Pandas数据中对时间的操作
Jul 30 Python
Python求正态分布曲线下面积实例
Nov 20 Python
使用pandas 将DataFrame转化成dict
Dec 10 Python
简单了解django文件下载方式
Feb 10 Python
python处理json数据文件
Apr 11 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学习资源和链接.
2006/12/05 PHP
PHP通过session id 实现session共享和登录验证的代码
2012/06/03 PHP
PHP导入导出Excel代码
2015/07/07 PHP
PHP实现的统计数据功能详解
2016/12/06 PHP
理解Javascript_09_Function与Object
2010/10/16 Javascript
深入理解JavaScript系列(6):S.O.L.I.D五大原则之单一职责SRP
2012/01/15 Javascript
JS命名空间的另一种实现
2013/08/09 Javascript
event对象获取方法总结在google浏览器下测试
2013/11/03 Javascript
原生js制作简单的数字键盘
2015/04/24 Javascript
JQuery中层次选择器用法实例详解
2015/05/18 Javascript
javascript中undefined与null的区别
2015/08/16 Javascript
简单的js表格操作
2016/09/24 Javascript
angular.js指令中的controller、compile与link函数的不同之处
2017/05/10 Javascript
浅谈js的解析顺序 作用域 严格模式
2017/10/23 Javascript
react中使用css的7中方式(最全总结)
2019/02/11 Javascript
微信小程序点击列表跳转到对应详情页过程解析
2019/09/26 Javascript
Node.js API详解之 querystring用法实例分析
2020/04/29 Javascript
Element Carousel 走马灯的具体实现
2020/07/26 Javascript
[01:51]DAC趣味视频-如何成为职业选手.mp4
2017/04/02 DOTA
[00:10]神之谴戒
2019/03/06 DOTA
线程和进程的区别及Python代码实例
2015/02/04 Python
在Django中进行用户注册和邮箱验证的方法
2016/05/09 Python
Python多线程中阻塞(join)与锁(Lock)使用误区解析
2018/04/27 Python
PyCharm设置每行最大长度限制的方法
2019/01/16 Python
画pytorch模型图,以及参数计算的方法
2019/08/17 Python
如何理解python中数字列表
2020/05/29 Python
用python写爬虫简单吗
2020/07/28 Python
Pycharm-community-2020.2.3 社区版安装教程图文详解
2020/12/08 Python
在weblogic中发布ejb需涉及到哪些配置文件
2012/01/17 面试题
中专毕业个人的自荐信格式
2013/09/21 职场文书
电子信息专业自荐书
2014/02/04 职场文书
2014年学习部工作总结
2014/11/12 职场文书
岗位职责范本大全
2015/02/26 职场文书
2016春季小学开学寄语
2015/12/03 职场文书
python process模块的使用简介
2021/05/14 Python
Oracle安装TNS_ADMIN环境变量设置参考
2021/11/01 Oracle