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创建只读属性对象的方法(ReadOnlyObject)
Feb 10 Python
详细探究Python中的字典容器
Apr 14 Python
python常用知识梳理(必看篇)
Mar 23 Python
Python虚拟环境项目实例
Nov 20 Python
Python标准库inspect的具体使用方法
Dec 06 Python
Python----数据预处理代码实例
Mar 20 Python
python多线程分块读取文件
Aug 29 Python
Python对Excel按列值筛选并拆分表格到多个文件的代码
Nov 05 Python
Python打包模块wheel的使用方法与将python包发布到PyPI的方法详解
Feb 12 Python
python pymysql链接数据库查询结果转为Dataframe实例
Jun 05 Python
OpenCV 使用imread()函数读取图片的六种正确姿势
Jul 09 Python
详解python datetime模块
Aug 17 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/12/05 PHP
PHP采用get获取url汉字出现乱码的解决方法
2014/11/13 PHP
smarty内置函数config_load用法实例
2015/01/22 PHP
php微信开发接入
2016/08/27 PHP
PHP实现表单提交时去除斜杠的方法
2016/12/26 PHP
PHP实现随机生成水印图片功能
2017/03/22 PHP
Yii2.0框架behaviors方法使用实例分析
2019/09/30 PHP
JQuery Tab选项卡效果代码改进版
2010/04/01 Javascript
Extjs4 关于Store的一些操作(加载/回调/添加)
2013/04/18 Javascript
jquery实现的图片点击滚动效果
2014/04/29 Javascript
jQuery使用prepend()方法在元素前添加内容用法实例
2015/03/26 Javascript
浅谈js 闭包引起的内存泄露问题
2015/06/22 Javascript
JS实现浏览器状态栏文字从右向左弹出效果代码
2015/10/27 Javascript
javascript js 操作数组 增删改查的简单实现
2016/06/20 Javascript
js中new一个对象的过程
2017/02/20 Javascript
Javascript面试经典套路reduce函数查重
2017/03/23 Javascript
解析Vue2 dist 目录下各个文件的区别
2017/11/22 Javascript
基于openlayers4实现点的扩散效果
2020/08/17 Javascript
Vue+Express实现登录注销功能的实例代码
2019/05/05 Javascript
微信小程序中如何计算距离某个节日还有多少天
2019/07/15 Javascript
Javascript实现贪吃蛇小游戏(含详细注释)
2020/10/23 Javascript
Python中的time模块与datetime模块用法总结
2016/06/30 Python
python 性能优化方法小结
2017/03/31 Python
Python使用cx_Oracle模块操作Oracle数据库详解
2018/05/07 Python
python 中文件输入输出及os模块对文件系统的操作方法
2018/08/27 Python
深入浅析Python2.x和3.x版本的主要区别
2018/11/30 Python
关于pytorch处理类别不平衡的问题
2019/12/31 Python
CSS3实现时间轴特效
2020/11/02 HTML / CSS
解决H5的a标签的download属性下载service上的文件出现跨域问题
2019/07/16 HTML / CSS
纽约的奢华内衣店:Journelle
2016/07/29 全球购物
ECCO爱步加拿大官网:北欧丹麦鞋履及皮具品牌
2017/07/08 全球购物
日本亚马逊官方网站:Amazon.co.jp
2020/04/14 全球购物
AJAX的全称是什么
2012/11/06 面试题
安全生产月演讲稿
2014/05/09 职场文书
卫生厅领导班子党的群众路线教育实践活动整改措施
2014/09/20 职场文书
灵能百分百第三季什么时候来?
2022/03/15 日漫