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文档生成工具pydoc使用介绍
Jun 02 Python
Python简明入门教程
Aug 04 Python
[原创]教女朋友学Python(一)运行环境搭建
Nov 29 Python
获取python的list中含有重复值的index方法
Jun 27 Python
Python 删除连续出现的指定字符的实例
Jun 29 Python
python画柱状图--不同颜色并显示数值的方法
Dec 13 Python
pycharm配置pyqt5-tools开发环境的方法步骤
Feb 11 Python
python中列表的切片与修改知识点总结
Jul 23 Python
python实现的自动发送消息功能详解
Aug 15 Python
Python日志syslog使用原理详解
Feb 18 Python
python中数字是否为可变类型
Jul 08 Python
Python如何导出导入所有依赖包详解
Jun 08 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扩展模块Pecl、Pear以及Perl的区别
2014/04/09 PHP
使用PHP similar text计算两个字符串相似度
2015/11/06 PHP
总结PHP中DateTime的常用方法
2016/08/11 PHP
总结PHP内存释放以及垃圾回收
2018/03/29 PHP
PHP实现的一致性Hash算法详解【分布式算法】
2018/03/31 PHP
基于OO的动画附加插件,可以实现弹跳、渐隐等动画效果 分享
2013/06/24 Javascript
JS 获取浏览器和屏幕宽高等信息的实现思路及代码
2013/07/31 Javascript
eclipse导入jquery包后报错的解决方法
2014/02/17 Javascript
JS的get和set使用示例
2014/02/20 Javascript
jQuery mobile类库使用时加载导航历史的方法简介
2015/12/04 Javascript
plupload+artdialog实现多平台上传文件
2016/07/19 Javascript
jquery-mobile基础属性与用法详解
2016/11/23 Javascript
使用jsonp实现跨域获取数据实例讲解
2016/12/25 Javascript
使用微信内嵌H5网页解决JS倒计时失效问题
2017/01/13 Javascript
JS与jQuery实现子窗口获取父窗口元素值的方法
2017/04/17 jQuery
原生js jquery ajax请求以及jsonp的调用方法
2017/08/04 jQuery
Vue.js 利用v-for中的index值实现隔行变色
2018/08/01 Javascript
layui获取选中行数据的实例讲解
2018/08/19 Javascript
JavaScript代码调试方法实例小结
2019/01/05 Javascript
Vue 组件复用多次自定义参数操作
2020/07/27 Javascript
JavaScript中EventBus实现对象之间通信
2020/10/18 Javascript
JavaScript实现点击图片换背景
2020/11/20 Javascript
[01:09:24]Ti4开幕式
2014/07/19 DOTA
[02:12]打造更好的电竞完美世界:完美盛典回顾篇
2018/12/19 DOTA
python使用标准库根据进程名如何获取进程的pid详解
2017/10/31 Python
Python编程把二叉树打印成多行代码
2018/01/04 Python
Python 实现Windows开机运行某软件的方法
2018/10/14 Python
详解CSS3 Media Queries中媒体属性的使用
2016/02/29 HTML / CSS
html5使用canvas绘制太阳系效果
2014/12/15 HTML / CSS
乐高西班牙官方商店:LEGO Shop ES
2019/12/01 全球购物
大专生自荐信
2013/10/04 职场文书
通息工程毕业生自荐信
2013/10/16 职场文书
项目采购员岗位职责
2014/04/15 职场文书
Go语言读取txt文档的操作方法
2022/01/22 Golang
PYTHON基于Pyecharts绘制常见的直角坐标系图表
2022/04/28 Python
python双向链表实例详解
2022/05/25 Python