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 ip正则式
May 07 Python
pycharm中连接mysql数据库的步骤详解
May 02 Python
python分治法求二维数组局部峰值方法
Apr 03 Python
利用Django-environ如何区分不同环境
Aug 26 Python
win10 64bit下python NLTK安装教程
Sep 19 Python
Pycharm2017版本设置启动时默认自动打开项目的方法
Oct 29 Python
Python3将jpg转为pdf文件的方法示例
Dec 13 Python
python读取dicom图像示例(SimpleITK和dicom包实现)
Jan 16 Python
python实现录制全屏和选择区域录屏功能
Feb 05 Python
详解Python中openpyxl模块基本用法
Feb 23 Python
python中pandas.read_csv()函数的深入讲解
Mar 29 Python
MATLAB 全景图切割及盒图显示的实现步骤
May 14 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
PR值查询 | PageRank 查询
2006/12/20 PHP
PHP读取MySQL数据代码
2008/06/05 PHP
第4章 数据处理-php正则表达式-郑阿奇(续)
2011/07/04 PHP
thinkPHP交易详情查询功能详解
2016/12/02 PHP
PHP swoole和redis异步任务实现方法分析
2019/08/12 PHP
js 弹出菜单/窗口效果
2011/10/30 Javascript
简单几行JS Code实现IE邮件转发新浪微博
2013/07/03 Javascript
js螺旋动画效果的具体实例
2013/11/15 Javascript
js预加载图片方法汇总
2015/06/15 Javascript
Bootstrap面板(Panels)的简单实现代码
2017/03/17 Javascript
mui框架 页面无法滚动的解决方法(推荐)
2018/01/25 Javascript
Vue组件之自定义事件的功能图解
2018/02/01 Javascript
JS获取指定月份的天数两种实现方法
2018/06/22 Javascript
JavaScript读写二进制数据的方法详解
2018/09/09 Javascript
微信小程序select下拉框实现效果
2019/05/15 Javascript
javascript的this关键字详解
2019/05/20 Javascript
JavaScript实现五子棋游戏的方法详解
2019/07/08 Javascript
解决layui table表单提示数据接口请求异常的问题
2019/09/24 Javascript
浅谈微信小程序列表埋点曝光指南
2019/10/15 Javascript
[58:32]EG vs Liquid 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/19 DOTA
详解Python中映射类型(字典)操作符的概念和使用
2015/08/19 Python
在 Python 应用中使用 MongoDB的方法
2017/01/05 Python
Android 兼容性问题:java.lang.UnsupportedOperationException解决办法
2017/03/19 Python
python 3.0 模拟用户登录功能并实现三次错误锁定
2017/11/01 Python
解决Pycharm下面出现No R interpreter defined的问题
2018/10/29 Python
python生成器与迭代器详解
2019/01/01 Python
使用matplotlib绘制图例标签中带有公式的图
2019/12/13 Python
在HTML5中使用MathML数学公式的简单讲解
2016/02/19 HTML / CSS
法国家具及室内配件店:home24
2017/01/21 全球购物
世界首屈一指的在线男士内衣权威:HisRoom
2017/08/05 全球购物
英国最受欢迎的母婴精品品牌:JoJo Maman BéBé
2021/02/17 全球购物
中学家长会邀请函
2014/02/03 职场文书
合作意向书模板
2014/03/31 职场文书
中秋晚会策划方案
2014/06/12 职场文书
应届毕业生求职简历自我评价
2015/03/02 职场文书
如何利用React实现图片识别App
2022/02/18 Javascript