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 相关文章推荐
python3使用pyqt5制作一个超简单浏览器的实例
Oct 19 Python
Python有序查找算法之二分法实例分析
Dec 11 Python
利用Python yagmail三行代码实现发送邮件
May 11 Python
python操作redis方法总结
Jun 06 Python
在unittest中使用 logging 模块记录测试数据的方法
Nov 30 Python
六行python代码的爱心曲线详解
May 17 Python
python3 图片 4通道转成3通道 1通道转成3通道 图片压缩实例
Dec 03 Python
Django之form组件自动校验数据实现
Jan 14 Python
PageFactory设计模式基于python实现
Apr 14 Python
Python 实现进度条的六种方式
Jan 06 Python
Pandas数据分析的一些常用小技巧
Feb 07 Python
python爬取网页版QQ空间,生成各类图表
Jun 02 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
一个程序下载的管理程序(三)
2006/10/09 PHP
PHP form 表单传参明细研究
2009/07/17 PHP
php天翼开放平台短信发送接口实现方法
2014/12/22 PHP
PHP数据源架构模式之表入口模式实例分析
2020/01/23 PHP
javascript replace()正则替换实现代码
2010/02/26 Javascript
javascript获取隐藏dom的宽高 具体实现
2013/07/14 Javascript
IE6中链接A的href为javascript协议时不在当前页面跳转
2014/06/05 Javascript
逐一介绍Jquery data()、Jquery stop()、jquery delay()函数(详)
2015/11/04 Javascript
JS弹出新窗口被拦截的解决方法
2016/08/09 Javascript
关于JS中二维数组的声明方法
2016/09/24 Javascript
Bootstrap模态框禁用空白处点击关闭
2016/10/20 Javascript
nodejs进阶(6)—连接MySQL数据库示例
2017/01/07 NodeJs
JavaScript实现京东放大镜效果
2019/12/03 Javascript
详细解读Python的web.py框架下的application.py模块
2015/05/02 Python
Python实现的RSS阅读器实例
2015/07/25 Python
python基于隐马尔可夫模型实现中文拼音输入
2016/04/01 Python
python实现人脸识别经典算法(一) 特征脸法
2018/03/13 Python
Python实现的IP端口扫描工具类示例
2019/02/15 Python
Pycharm新手教程(只需要看这篇就够了)
2019/06/18 Python
python 对任意数据和曲线进行拟合并求出函数表达式的三种解决方案
2020/02/18 Python
基于HTML5 Canvas:字符串,路径,背景,图片的详解
2013/05/09 HTML / CSS
香港化妆品经销商:我的公主
2016/08/05 全球购物
美国领先的家庭智能音响系统品牌:Sonos
2018/07/20 全球购物
英国家电购物网站:Sonic Direct
2019/03/26 全球购物
在印度上传处方,在线订购药品:Medlife
2019/03/28 全球购物
Linux如何修改文件和文件夹的权限
2013/09/05 面试题
护士求职推荐信范文
2013/11/23 职场文书
现金会计岗位职责
2013/12/05 职场文书
法警的竞聘演讲稿
2014/01/02 职场文书
信息服务专业毕业生求职信
2014/03/02 职场文书
12岁生日演讲稿
2014/05/14 职场文书
同意报考证明
2015/06/17 职场文书
“5.12”护士节主持词
2015/07/04 职场文书
导游词之新疆尼雅遗址
2019/10/16 职场文书
七年级作文之我的梦想
2019/10/16 职场文书
Django实现在线无水印抖音视频下载(附源码及地址)
2021/05/06 Python