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的Flask框架中实现登录用户的个人资料和头像的教程
Apr 20 Python
Python基于time模块求程序运行时间的方法
Sep 18 Python
对python sklearn one-hot编码详解
Jul 10 Python
利用Python如何批量更新服务器文件
Jul 29 Python
利用django+wechat-python-sdk 创建微信服务器接入的方法
Feb 20 Python
python实现两张图片的像素融合
Feb 23 Python
基于python2.7实现图形密码生成器的实例代码
Nov 05 Python
Python如何将图像音视频等资源文件隐藏在代码中(小技巧)
Feb 16 Python
Django查询优化及ajax编码格式原理解析
Mar 25 Python
解决python使用list()时总是报错的问题
May 05 Python
python 19个值得学习的编程技巧
Aug 15 Python
python 网络编程要点总结
Jun 18 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
关于session在PHP5的配置文件中的详细设置参数说明
2011/04/20 PHP
php自定义函数call_user_func和call_user_func_array详解
2011/07/14 PHP
php实现建立多层级目录的方法
2014/07/19 PHP
php按单词截取字符串的方法
2015/04/07 PHP
php实现获取近几日、月时间示例
2019/07/06 PHP
Thinkphp 在api开发中异常返回依然是html的解决方式
2019/10/16 PHP
网站导致浏览器崩溃的原因总结(多款浏览器) 推荐
2010/04/15 Javascript
js中window.open()的所有参数详细解析
2014/01/09 Javascript
用jquery.sortElements实现table排序
2014/05/04 Javascript
微信浏览器内置JavaScript对象WeixinJSBridge使用实例
2015/05/25 Javascript
JS实现的表格操作类详解(添加,删除,排序,上移,下移)
2015/12/22 Javascript
理解javascript中DOM事件
2015/12/25 Javascript
用JS实现图片轮播效果代码(一)
2016/06/26 Javascript
百度多文件异步上传控件webuploader基本用法解析
2016/11/07 Javascript
JSP防止网页刷新重复提交数据的几种方法
2016/11/19 Javascript
15个非常实用的JavaScript代码片段
2016/12/18 Javascript
使用 Node.js 对文本内容分词和关键词抽取
2017/05/27 Javascript
深入探究AngularJs之$scope对象(作用域)
2017/07/20 Javascript
基于Vue2-Calendar改进的日历组件(含中文使用说明)
2019/04/14 Javascript
改变layer confirm弹窗按钮的颜色方法
2019/09/12 Javascript
微信小程序实现多选框全选与反全选及购物车中删除选中的商品功能
2019/12/17 Javascript
jQuery+css实现的点击图片放大缩小预览功能示例【图片预览 查看大图】
2020/05/29 jQuery
Python获取本机所有网卡ip,掩码和广播地址实例代码
2018/01/22 Python
解决pycharm界面不能显示中文的问题
2018/05/23 Python
使用python telnetlib批量备份交换机配置的方法
2019/07/25 Python
Python使用pickle进行序列化和反序列化的示例代码
2020/09/22 Python
制药工程专业应届生求职信
2013/09/24 职场文书
总经理职责
2013/12/22 职场文书
项目计划书范文
2014/01/09 职场文书
班组长安全工作职责
2014/07/15 职场文书
亲子运动会的活动方案
2014/08/17 职场文书
群众路线党员个人整改措施
2014/10/27 职场文书
保送生自荐信
2015/03/06 职场文书
【海涛解说】史上最给力比赛,挑战DOTA极限
2022/04/01 DOTA
Python OpenCV超详细讲解读取图像视频和网络摄像头
2022/04/02 Python
linux目录管理方法介绍
2022/06/01 Servers