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简单实现安全开关文件的两种方式
Sep 19 Python
基于python实现在excel中读取与生成随机数写入excel中
Jan 04 Python
对python中的for循环和range内置函数详解
Apr 17 Python
python实现列表中由数值查到索引的方法
Jun 27 Python
django从请求到响应的过程深入讲解
Aug 01 Python
Python爬虫beautifulsoup4常用的解析方法总结
Feb 25 Python
Python实现Linux监控的方法
May 16 Python
python字典一键多值实例代码分享
Jun 14 Python
python使用if语句实现一个猜拳游戏详解
Aug 27 Python
Python结合Window计划任务监测邮件的示例代码
Aug 05 Python
Python OpenCV中的numpy与图像类型转换操作
Dec 11 Python
pycharm 的Structure界面设置操作
Feb 05 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
PHP5权威编程阅读学习笔记 附电子书下载
2012/07/05 PHP
教你如何解密 “ PHP 神盾解密工具 ”
2014/06/20 PHP
PHP实现自动对图片进行滚动显示的方法
2015/03/12 PHP
PHP使用Memcache时模拟命名空间及缓存失效问题的解决
2016/02/27 PHP
PHP常用工具函数小结【移除XSS攻击、UTF8与GBK编码转换等】
2019/04/27 PHP
chrome调试javascript详解
2015/10/21 Javascript
使用jQuery制作浮动工具栏的实例分享
2016/05/13 Javascript
基于JS实现checkbox全选功能实例代码
2016/10/31 Javascript
BootStrap3中模态对话框的使用
2017/01/06 Javascript
详解VueJs前后端分离跨域问题
2017/05/24 Javascript
three.js实现3D视野缩放效果
2017/11/16 Javascript
JS实现图片居中悬浮效果
2017/12/25 Javascript
12条写出高质量JS代码的方法
2018/01/07 Javascript
JavaScript中严格判断NaN的方法
2018/02/16 Javascript
详解如何构建一个Angular6的第三方npm包
2018/09/07 Javascript
vue环形进度条组件实例应用
2018/10/10 Javascript
浅谈webpack+react多页面开发终极架构
2018/11/11 Javascript
vue代码分割的实现(codesplit)
2018/11/13 Javascript
微信小程序实现省市区三级地址选择
2020/06/21 Javascript
JavaScript如何实现图片处理与合成
2020/05/29 Javascript
Postman动态获取返回值过程详解
2020/06/30 Javascript
解决vue路由name同名,路由重复的问题
2020/08/05 Javascript
[01:24]2014DOTA2 TI第二日 YYF表示这届谁赢都有可能
2014/07/11 DOTA
[01:34]完美“圣”典宣传片震撼发布,12.17与你不见不散
2016/12/16 DOTA
对python产生随机的二维数组实例详解
2018/12/13 Python
django实现将后台model对象转换成json对象并传递给前端jquery
2020/03/16 Python
jupyter note 实现将数据保存为word
2020/04/14 Python
matplotlib 三维图表绘制方法简介
2020/09/20 Python
西班牙国家航空官方网站:Iberia
2017/11/16 全球购物
生产副总岗位职责
2013/11/28 职场文书
高三高考决心书
2014/03/11 职场文书
核心价值观演讲稿
2014/05/13 职场文书
思想纪律作风整顿剖析材料
2014/10/11 职场文书
心理学培训心得体会
2016/01/22 职场文书
2019企业文化管理制度范本!
2019/08/06 职场文书
Pycharm连接远程服务器并远程调试的全过程
2021/06/24 Python