说起爬虫一般想到的情况是,使用 python 中都通过 requests 库获取网页内容,然后通过 beautifulSoup 进行筛选文档中的标签和内容。但是这样有个问题就是,容易被反扒机制所拦住。

反扒机制有很多种,例如知乎:刚开始只加载几个问题,当你往下滚动时才会继续往下面加载,而且在往下滚动一段距离时就会出来一个登陆的弹框。

这样的机制对于通过获取服务器返回内容的爬虫方式进行了限制,我们只能获得前几个回答,而没办法或许后面的回答。

所以需要使用 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爬虫知乎内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

__init__在python中的用法知乎_python使用selenium爬虫知乎的方法示例相关推荐

  1. python selenium爬虫实例_python使用selenium爬虫知乎的方法示例

    说起爬虫一般想到的情况是,使用 python 中都通过 requests 库获取网页内容,然后通过 beautifulSoup 进行筛选文档中的标签和内容.但是这样有个问题就是,容易被反扒机制所拦住. ...

  2. __init__在python中的用法知乎_python中对_init_的理解及实例解析 python为什么要有一个init函数 知乎...

    Python中"__init__"的意义是什么? Python中__init__的意义依偎着你心跳声如此频繁,就算世界末日小编也会嚣张的笑. 测试人员学python时,应该如何理解 ...

  3. python中get和set使用_Python对象属性的set和get方法

    属性的set和get方法 如果有一个对象,当需要对其进行修改属性时,有2种方法: 1.对象名.属性名 = 数据 -->直接修改 2.对象名.方法名() -->间接修改 为了更好的保存属性安 ...

  4. python中map用法详解_Python:map函数用法详解

    一个简单的例子:将一个list中所有元素平方,常规的做法如下图所示,虽然实现了这个功能,但并没有给人一目了然的感觉.若换成map来实现,则会好很多. 常规方法 map函数 1.map函数介绍及其简单使 ...

  5. python辗转相除法求最大公约数最小公倍数_Python基于辗转相除法求解最大公约数的方法示例...

    本文实例讲述了Python基于辗转相除法求解最大公约数的方法.分享给大家供大家参考,具体如下: 之前总结过一次高德纳TAOCP中的最大公约数求解,其实课后题中的算法修改要求实现的是辗转相除法求解最大公 ...

  6. Python中self用法详解

    Python中self用法详解 https://blog.csdn.net/CLHugh/article/details/75000104 首页 博客 学院 下载 图文课 论坛 APP 问答 商城 V ...

  7. 简单介绍Python中异常处理用法

    这篇文章主要给大家分享的是 Python中异常处理用法,为了保证程序的健壮性与容错性,即在遇到错误时候程序不会崩溃,我们需要对异常进行处理,下面来看看文章对此的用法,需要的朋友可以参考一下 为了保证程 ...

  8. python中 的用法_详解python中@的用法

    python中@的用法 @是一个装饰器,针对函数,起调用传参的作用. 有修饰和被修饰的区别,@function作为一个装饰器,用来修饰紧跟着的函数(可以是另一个装饰器,也可以是函数定义). 代码1 结 ...

  9. python讲解-详解python中@的用法

    python中@的用法 @是一个装饰器,针对函数,起调用传参的作用. 有修饰和被修饰的区别,"@function"作为一个装饰器,用来修饰紧跟着的函数(可以是另一个装饰器,也可以是 ...

最新文章

  1. LeetCode Guess Number Higher or Lower II(动态规划)
  2. DSP学习 -- C语言实现 SHA-1、MD5、UUID、AES128、base64
  3. 为什么不应该用Stream forEach替换for循环的3个原因
  4. Oracle 学习----:查看当前时间与Sqlserver语句不一样了
  5. 【问题解决方案】关于Python中的语句 ‘ %matplotlib inline ‘
  6. Git 版本控制 在 WIN 下的一些使用方法
  7. 免费的用户界面设计工具、工具包和资源备忘
  8. 网页调用智能IC卡读写器的解决方案
  9. 线性同余法产生均匀随机数C语言,利用线性同余法产生随机数进行同步计算
  10. 网站上传服务器及安装包,如何上传安装包到服务器
  11. R安装时出现辑程包不存在,解决方法
  12. AtCoder Beginner Contest 158 D.String Formation
  13. 计算机开机配置失败6,win7开机配置windows update失败怎么跳过?-win7配置update失败,安全模式还是配置失败...
  14. GIS-空间分析(4)
  15. 你喜欢天长地久,还是曾经拥有?
  16. 第24集丨人生的智慧:做人之道“成色”比“斤两”更重要
  17. 教资考试中计算机知识常考点,教师资格证笔试:初中美术必背考点汇总(3)...
  18. 秒 毫秒 微秒 纳秒 皮秒
  19. 西北工业大学计算机考研资料汇总
  20. 最短路径-迪杰斯特拉(Dijkstra)

热门文章

  1. 细思极恐的2016智能交通!怎么回事?
  2. CentOS查看CPU、内存、网络流量和磁盘 I/O
  3. 浅析主键自增长的优缺点
  4. 解密jQuery事件核心 - 绑定设计(一)
  5. WebView宽度自适应
  6. 《编程匠艺》读书笔记之十四
  7. nChain再获数字货币安全专利,助力BCH更加安全可靠
  8. 比特币前核心开发者Mike Hearn三年前的预测一一应验
  9. 微信小程序项目,实现图书搜索组件完善
  10. runloop源代码