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生成日历实例解析
Aug 21 Python
分析Python的Django框架的运行方式及处理流程
Apr 08 Python
Django中模版的子目录与include标签的使用方法
Jul 16 Python
Python正则抓取网易新闻的方法示例
Apr 21 Python
对numpy数据写入文件的方法讲解
Jul 09 Python
基于Python函数和变量名解析
Jul 19 Python
Python一行代码解决矩阵旋转的问题
Nov 30 Python
Python基于BeautifulSoup爬取京东商品信息
Jun 01 Python
使用python把xmind转换成excel测试用例的实现代码
Oct 12 Python
python实现三阶魔方还原的示例代码
Apr 28 Python
python多次执行绘制条形图
Apr 20 Python
python数字图像处理之图像自动阈值分割示例
Jun 28 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
不用iconv库的gb2312与utf-8的互换函数
2006/10/09 PHP
Apache启动报错No space left on device: AH00023该怎么解决
2015/10/16 PHP
Laravel使用Caching缓存数据减轻数据库查询压力的方法
2016/03/15 PHP
php实现的debug log日志操作类实例
2016/07/12 PHP
javascript里的条件判断
2007/02/27 Javascript
Track Image Loading效果代码分析
2007/08/13 Javascript
ExtJS Store的数据访问与更新问题
2010/04/28 Javascript
jqeury eval将字符串转换json的方法
2011/01/20 Javascript
js关闭模态窗口刷新父页面或跳转页面
2012/12/13 Javascript
很好用的js日历算法详细代码
2013/03/07 Javascript
JS滚轮事件onmousewheel使用介绍
2013/11/01 Javascript
JavaScript设计模式之代理模式介绍
2014/12/28 Javascript
jQuery及JS实现循环中暂停的方法
2015/02/02 Javascript
基于JavaScript实现图片点击弹出窗口而不是保存
2016/02/06 Javascript
angularjs表格ng-table使用备忘录
2016/03/09 Javascript
js a标签点击事件
2017/03/30 Javascript
JavaScript闭包的简单应用
2017/09/01 Javascript
AngularJS实现与后台服务器进行交互的示例讲解
2018/08/13 Javascript
jQuery实现为动态添加的元素绑定事件实例分析
2018/09/07 jQuery
React router动态加载组件之适配器模式的应用详解
2018/09/12 Javascript
详解Vue 匿名、具名和作用域插槽的使用方法
2019/04/22 Javascript
NUXT SSR初级入门笔记(小结)
2019/12/16 Javascript
JavaScript实现指定数量的并发限制的示例代码
2020/03/10 Javascript
vue抽出组件并传值实例
2020/07/31 Javascript
[02:16]2018年度CS GO最具人气选手-完美盛典
2018/12/16 DOTA
Python实现ElGamal加密算法的示例代码
2020/06/19 Python
python可视化 matplotlib画图使用colorbar工具自定义颜色
2020/12/07 Python
trivago美国:全球最大的酒店价格比较网站
2018/01/18 全球购物
日本乐天官方海外转运服务:Rakuten Global Express
2018/11/30 全球购物
化验室技术员岗位职责
2013/12/24 职场文书
维修工先进事迹
2014/05/29 职场文书
小学师德师风整改措施
2014/10/27 职场文书
2015年幼师工作总结
2015/04/28 职场文书
领导激励员工的演讲稿,各种会上用得到,建议收藏
2019/08/13 职场文书
SpringBoot2 参数管理实践之入参出参与校验的方式
2021/06/16 Java/Android
在Windows Server 2012上安装 .NET Framework 3.5 所遇到的问题
2022/04/29 Servers