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 15 Python
python插入排序算法实例分析
Jul 03 Python
Python内置的HTTP协议服务器SimpleHTTPServer使用指南
Mar 30 Python
小白如何入门Python? 制作一个网站为例
Mar 06 Python
Python脚本完成post接口测试的实例
Dec 17 Python
Python控制台实现交互式环境执行
Jun 09 Python
基于PyTorch的permute和reshape/view的区别介绍
Jun 18 Python
在Python中实现字典反转案例
Dec 05 Python
python opencv常用图形绘制方法(线段、矩形、圆形、椭圆、文本)
Apr 12 Python
浅谈Python中的函数(def)及参数传递操作
May 25 Python
总结Python变量的相关知识
Jun 28 Python
python实现简单的聊天小程序
Jul 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脚本数据库功能详解(中)
2006/10/09 PHP
Ajax PHP分页演示
2007/01/02 PHP
遍历echsop的region表形成缓存的程序实例代码
2016/11/01 PHP
php事务回滚简单实现方法示例
2017/03/28 PHP
让您的菜单不离网站
2006/10/03 Javascript
js 浮动层菜单收藏
2009/01/16 Javascript
jquery 多级下拉菜单核心代码
2010/05/21 Javascript
设置iframe的document.designMode后仅Firefox中其body.innerHTML为br
2012/02/27 Javascript
JavaScript中Function详解
2015/02/27 Javascript
理解js对象继承的N种模式
2016/01/25 Javascript
浅谈js之字面量、对象字面量的访问、关键字in的用法
2016/11/20 Javascript
js 性能优化之算法和流程控制
2017/02/15 Javascript
微信小程序实现图片轮播及文件上传
2017/04/07 Javascript
浅谈React Event实现原理
2018/09/20 Javascript
js基础之事件捕获与冒泡原理
2019/10/09 Javascript
在项目vue中使用echarts的操作步骤
2020/09/07 Javascript
简单谈谈offsetleft、offsetTop和offsetParent
2020/12/04 Javascript
[52:44]VGJ.T vs infamous Supermajor小组赛D组败者组第一轮 BO3 第一场 6.3
2018/06/04 DOTA
python处理csv数据的方法
2015/03/11 Python
Python计算一个文件里字数的方法
2015/06/15 Python
python实现学生信息管理系统
2020/04/05 Python
python线程中同步锁详解
2018/04/27 Python
浅谈python中np.array的shape( ,)与( ,1)的区别
2018/06/04 Python
PyCharm配置mongo插件的方法
2018/11/30 Python
Python 正则表达式匹配字符串中的http链接方法
2018/12/25 Python
python3使用print打印带颜色的字符串代码实例
2019/08/22 Python
Python如何用wx模块创建文本编辑器
2020/06/07 Python
解决python对齐错误的方法
2020/07/16 Python
Python爬虫之Spider类用法简单介绍
2020/08/04 Python
详解Python爬虫爬取博客园问题列表所有的问题
2021/01/18 Python
几道数据库的概念性面试题
2014/05/30 面试题
新闻编辑自荐信
2013/11/03 职场文书
企业演讲比赛主持词
2014/03/18 职场文书
负责人任命书范本
2014/06/04 职场文书
事业单位工作人员岗前培训心得体会
2016/01/08 职场文书
如何理解PHP核心特性命名空间
2021/05/28 PHP