selenium+python如何爬取简书网站

这篇文章介绍的内容是selenium+python如何爬取简书网站 ,有着一定的参考价值,现在分享给大家,有需要的朋友可以参考一下

页面加载逻辑

当你兴致勃勃地从网上学习了基本的爬虫知识后就像找个目标实践下,拥有大量文章的简书包含了大量的有价值信息,所以自然成为了你的选择目标,如果你尝试之后会发现并没有想象的那么简单,因为里面包含了很多js相关的数据传输。 让我先使用传统的爬虫演示一下吧: >

打开简书首页,似乎没有什么特别的

selenium+python如何爬取简书网站

jianshu首页

打开chrome的开发者模式,发现文章的标题,href都在a标签里,似乎也没有什么不一样的

selenium+python如何爬取简书网站

a.png

接下来就是寻找页面上所有的a标签,但是且慢如果你仔细观察就会发现滑轮滚到一半的时候页面就会加载更多,这样的步骤会重复三次知道底部出现阅读更多的按钮

selenium+python如何爬取简书网站

滑轮

不仅如此底部的阅读更多的href并没有告诉我们加载剩下的页面信息,唯一的办法是不断点击阅读更多这个按钮

selenium+python如何爬取简书网站

load_more.png

什么,将滑轮重复三次滑倒页面的中央并且不断点击按钮这种操作http请求可做不到,这更像是js操作?没错,简书的文章并不是常规的http请求,我们不能根据不同url不断重定向,而是页面的一些动作来加载页面信息。

selenium+python如何爬取简书网站

selenium介绍

selenium是一个web自动化测试工具,支持很多种语言,我们在这里可以使用python的selenium做爬虫使用,爬取简书的过程中,它的工作原理是不断注入js代码,让页面源源不断的加载,最后再提取所有的a标签。首先你得在python中下载selenium包

>>> pip3 install selenium

登录后复制

chromedriver

selenium必须搭载浏览器使用,这里我使用的是chromedriver,Chrome的开源测试版,它可以使用headless模式不需要显示前段来访问网页,算是最大特性了。

python中操作

在写代码之前一定要把chromedriver同一文件夹内,因为我们需要引用PATH,这样方便点。首先我们的第一个任务是刷出加载更多的按钮,需要做3次将滑轮重复三次滑倒页面的中央,这里方便起见我滑到了底部

from selenium import webdriverimport timebrowser = webdriver.Chrome("./chromedriver")browser.get("https://www.jianshu.com/")for i in range(3):    browser.execute_script("window.scrollTo(0, document.body.scrollHeight);") // execute_script是插入js代码的    time.sleep(2) //加载需要时间,2秒比较合理

登录后复制

看看效果

selenium+python如何爬取简书网站

刷出了按钮

接下来就是不断点击按钮加载页面,继续加入刚才的py文件之中

for j in range(10):  //这里我模拟10次点击        try:         button = browser.execute_script("var a = document.getElementsByClassName('load-more'); a[0].click();")        time.sleep(2)    except:        pass''' 上面的js代码说明一下 var a = document.getElementsByClassName('load-more');选择load-more这个元素 a[0].click(); 因为a是一个集合,索引0然后执行click()函数'''

登录后复制

这个我就不贴图了,成功之后就是不断地加载页面 ,知道循环完了为止,接下来的工作就简单很多了,就是寻找a标签,get其中的text和href属性,这里我直接把它们写在了txt文件之中.

titles = browser.find_elements_by_class_name("title")with open("article_jianshu.txt", "w", encoding="utf-8") as f:    for t in titles:        try:            f.write(t.text + " " + t.get_attribute("href"))            f.write("")        except TypeError:            pass

登录后复制

最终结果

selenium+python如何爬取简书网站

简书文章

headless模式

不断加载页面肯定也很烦人,所以我们测试成功之后并不想把浏览器显示出来,这需要加上headless模式

options = webdriver.ChromeOptions()options.add_argument('headless')browser = webdriver.Chrome("./chromedriver", chrome_options=options) //把上面的browser加入chrome_options参数

登录后复制

总结

当我们没办法使用正常的http请求爬取时,可以使用selenium操纵浏览器来抓取我们想要的内容,这样有利有弊,比如

优点

可以暴力爬虫

简书并不需要cookie才能查看文章,不需要费劲心思找代理,或者说我们可以无限抓取并且不会被ban

首页应该为ajax传输,不需要额外的http请求

缺点

爬取速度太满,想象我们的程序,点击一次需要等待2秒那么点击600次需要1200秒, 20分钟…

附加

这是所有完整的代码

from selenium import webdriverimport timeoptions = webdriver.ChromeOptions()options.add_argument('headless')browser = webdriver.Chrome("./chromedriver", chrome_options=options)browser.get("https://www.jianshu.com/")for i in range(3):    browser.execute_script("window.scrollTo(0, document.body.scrollHeight);")    time.sleep(2)# print(browser)for j in range(10):    try:        button = browser.execute_script("var a = document.getElementsByClassName('load-more'); a[0].click();")        time.sleep(2)    except:        pass#titles = browser.find_elements_by_class_name("title")with open("article_jianshu.txt", "w", encoding="utf-8") as f:    for t in titles:        try:            f.write(t.text + " " + t.get_attribute("href"))            f.write("")        except TypeError:            pass

登录后复制

相关推荐:

[python爬虫] Selenium爬取新浪微博内容及用户信息

[Python爬虫]利用Selenium等待Ajax加载及模拟自动翻页,爬取东方财富网公司公告

Python爬虫:Selenium+ BeautifulSoup 爬取JS渲染的动态内容(雪球网新闻)

以上就是selenium+python如何爬取简书网站的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2264101.html

(0)
上一篇 2025年2月27日 07:59:28
下一篇 2025年2月27日 07:59:51

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • Python简单计算文件MD5值的方法示例

    这篇文章主要介绍了python简单计算文件md5值的方法,涉及python文件读取、hash运算及md5加密等相关操作技巧,需要的朋友可以参考下 本文实例讲述了Python简单计算文件MD5值的方法。分享给大家供大家参考,具体如下: 一 代…

    编程技术 2025年2月27日
    000
  • python环境下如何配置pydev插件

    这篇文章介绍的内容是python环境下配置pydev插件,有着一定的参考价值,现在分享给大家,有需要的朋友可以参考一下 一、安装eclipse 1、安装jdk以及配置环境变量 2、下载Eclipse IDE for Java EE Deve…

    2025年2月27日
    200
  • 在Windows环境下搭建Python编译环境

    这篇文章介绍的内容是在Windows环境下搭建Python编译环境,有着一定的参考价值,现在分享给大家,有需要的朋友可以参考一下 Windows系统并非都默认安装了Python,因此你可能需要下载并安装它,再下载并安装一个文本编辑器(用之前…

    2025年2月27日
    200
  • 关于Python中的中文编码问题

    这篇文章介绍的内容是关于python中的中文编码问题,有着一定的参考价值,现在分享给大家,有需要的朋友可以参考一下 1.python中的中文编码问题 1.1 .py文件中的编码   Python 默认脚本文件都是 ANSCII 编码的,当文…

    编程技术 2025年2月27日
    200
  • 交叉验证以及python代码实现

    这篇文章介绍的内容是关交叉验证以及python代码实现 ,有着一定的参考价值,现在分享给大家,有需要的朋友可以参考一下 模型选择的两种方法:正则化(典型方法)、交叉验证。 这里介绍交叉验证及其python代码实现。 交叉验证 如果给定样本数…

    编程技术 2025年2月27日
    200
  • python之装饰器的理解

    这篇文章介绍的内容是关于python之装饰器的理解 ,有着一定的参考价值,现在分享给大家,有需要的朋友可以参考一下 1、必备 核心:函数即“变量”定义:本质就是函数,是为了给其他函数添加附加功能原则:      1、不修改原函数的源代码  …

    编程技术 2025年2月27日
    200
  • Python放射的代码实现

    这篇文章介绍的内容是python放射的代码实现,有着一定的参考价值,现在分享给大家,有需要的朋友可以参考一下 ”’放射hasattr(obj, name_str):判断一个对象obj里是否有对应的name_str字符串的方法getattr…

    编程技术 2025年2月27日
    200
  • Python中的array数组模块相关使用

    数组并不是python中内置的标配数据结构,不过拥有array模块我们也可以在python中使用数组结构,下面我们就来详解详解python中的array数组模块相关使用 初始化array实例化可以提供一个参数来描述允许那种数据类型,还可以有…

    编程技术 2025年2月27日
    200
  • 对python中的for循环和range内置函数

    下面就为大家分享一篇对python中的for循环和range内置函数详解,具有很好的参考价值,希望对大家有所帮助。一起过来看看吧 如下所示: 1.for循环和range内置函数配合使用 立即学习“Python免费学习笔记(深入)”; ran…

    2025年2月27日
    200
  • python中找出numpy array数组的最值及其索引方法

    下面为大家分享一篇python中找出numpy array数组的最值及其索引方法,具有很好的参考价值,希望对大家有所帮助。一起过来看看吧 在list列表中,max(list)可以得到list的最大值,list.index(max(list)…

    编程技术 2025年2月27日
    200

发表回复

登录后才能评论