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中用has_key()方法查找键是否存在的教程
May 21 Python
Python DataFrame 设置输出不显示index(索引)值的方法
Jun 07 Python
python覆盖写入,追加写入的实例
Jun 26 Python
Python的matplotlib绘图如何修改背景颜色的实现
Jul 16 Python
python psutil模块使用方法解析
Aug 01 Python
Django中reverse反转并且传递参数的方法
Aug 06 Python
python3常用的数据清洗方法(小结)
Oct 31 Python
python类中super() 的使用解析
Dec 19 Python
Python通过len函数返回对象长度
Oct 22 Python
Python入门基础之数字字符串与列表
Feb 01 Python
Python 实现绘制子图及子图刻度的变换等问题
May 31 Python
Python数据类型最全知识总结
May 31 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+mysql)
2007/11/23 PHP
根据中文裁减字符串函数的php代码
2013/12/03 PHP
curl不使用文件存取cookie php使用curl获取cookie示例
2014/01/26 PHP
php按单词截取字符串的方法
2015/04/07 PHP
PHP文件操作实例总结【文件上传、下载、分页】
2018/12/08 PHP
Javascript 检测、添加、移除样式(className)函数代码
2009/09/08 Javascript
json 实例详细说明教程
2009/10/31 Javascript
整理一些JavaScript的IE和火狐的兼容性注意事项
2011/03/17 Javascript
select、radio表单回显功能实现避免使用jquery载入赋值
2013/06/08 Javascript
Js实现当前点击a标签变色突出显示其他a标签回复原色
2013/11/27 Javascript
javascript函数作用域学习示例(js作用域)
2014/01/13 Javascript
JavaScript charCodeAt方法入门实例(用于取得指定位置字符的Unicode编码)
2014/10/17 Javascript
简述JavaScript对传统文档对象模型的支持
2015/06/16 Javascript
jQuery+php实时获取及响应文本框输入内容的方法
2016/05/24 Javascript
AngularJS ng-template寄宿方式用法分析
2016/11/07 Javascript
js下载文件并修改文件名
2017/05/08 Javascript
利用webstrom调试Vue.js单页面程序的方法教程
2017/06/06 Javascript
JS中判断某个字符串是否包含另一个字符串的五种方法
2018/05/03 Javascript
Vue循环组件加validate多表单验证的实例
2018/09/18 Javascript
js变量声明var使用与不使用的区别详解
2019/01/21 Javascript
原生JS实现的跳一跳小游戏完整实例
2019/01/27 Javascript
IE11下CKEditor在Bootstrap Modal中下拉问题的解决
2019/09/25 Javascript
python回调函数的使用方法
2014/01/23 Python
从Python的源码来解析Python下的freeblock
2015/05/11 Python
解决python删除文件的权限错误问题
2018/04/24 Python
python 美化输出信息的实例
2018/10/15 Python
解决Python获取字典dict中不存在的值时出错问题
2018/10/17 Python
超简单的Python HTTP服务
2019/07/22 Python
解决Atom安装Hydrogen无法运行python3的问题
2019/08/28 Python
Django框架HttpRequest对象用法实例分析
2019/11/01 Python
Python批量修改xml的坐标值全部转为整数的实例代码
2020/11/26 Python
最新版 Windows10上安装Python 3.8.5的步骤详解
2020/11/28 Python
使用html2canvas实现将html内容写入到canvas中生成图片
2020/01/03 HTML / CSS
竞聘报告优秀范文
2014/11/06 职场文书
办公室主任岗位职责范本
2015/03/31 职场文书
阿里云国际版 使用Nginx作为HTTPS转发代理服务器
2022/05/11 Servers