Python爬虫用Selenium抓取js生成的文件(一)

    • 简介
    • 任务简述
    • 实现过程

简介

我最近在看关于计算机的一些书籍,发现了这个电子书清单:计算机开放电子书汇总, 和大家分享一下. 我在下载其中的书籍时被导向了这个很好的计算机电子书网站KanCloud看云,里面有非常多的实用的编程方面的电子书,很多是该网站自己用html生成的,格式多样,包括pdf,epub,mobi. 在此表示感谢,强烈推荐.

于是,我准备用之前的静态网页爬虫来批量下载,发现书籍的链接是javascript生成的,而且难以解析(我还会写一篇抓取可以解析js的网站的博客). 这时我们可以用selenium来模拟浏览器的动作,例如下拉或者点击button之类的. 然后在看云网站里模拟下载.

要得到一个可以稳健运行的爬虫, 需要考虑一些细节问题, 因此分两篇来说,本篇先给出一个示例,了解工作的过程.

任务简述

进入网站后,看云网站界面如下图所示:

首页

要下载全部电子书,我们需要抓取70个page, 每个page有12本书,每本书有一个单独的页面,而且有的书籍不提供下载,有的可以下载多种格式.

不能下载

可以下载

因此, 我们的任务如下:
1. 解析首页,得到最大页码
2. 解析单个页面,得到该页书籍链接列表
3. 进入书籍页面
* 判断是否可以下载
* 可以下载则下载所有格式的书籍

其次, 为了获得爬虫的鲁棒性, 我们要保证每次网页都加载成功,文件下载都完成了,在下面的内容里我会一步步介绍.

实现过程

Selenium可以模拟打开浏览器,在这之前我们要下载浏览器的驱动器.在本文里,我们使用chrome浏览器,Firefox也是常用的浏览器,使用步骤差不多,不再赘述.

Selenium的安装:
sudo pip install selenium
然后下载chrome的webdriver, 直接保存在本地,例如/usr/bin, 然后设置selenium的基本设置

import re#正则表达式
import random#随机选择
import subprocess# 执行bash命令
from multiprocessing import Pool#建立线程池,并行爬取加快速度
from selenium import webdriver# set chromedriver path and download path
chromeOptions = webdriver.ChromeOptions()dl_path="~/Downloads/KanCloud"#设置下载路径
chromedriver="/usr/bin/chromedriver"#修改为你的chromedriver路径prefs = {"download.default_directory" : dl_path}
chromeOptions.add_experimental_option("prefs",prefs)#可以为webdriver设置代理,自动获得代理IP地址下面会解释,这里注释掉
#PROXY='1.82.216.134:80'
#chromeOptions.add_argument('--proxy-server=%s' % PROXY)# url_start='http://www.kancloud.cn/explore/top'#建立一个webdriver对象
driver = webdriver.Chrome(chrome_options=chromeOptions)
driver.get('http://www.kancloud.cn/digest/ios-mac-study')#用chrome打开这个网页

运行上面的代码就可以打开一个chrome标签页了, 如下图所示:

示例1

点击下载按钮,我们看到有三个可以下载的选项PDF, epub, mobi. 要模拟click action, 我们需要得到该element的位置. 这时我们可以借助chrome的inspect功能, 快捷键是Ctrl+shift+I, 或者把鼠标悬浮在下载上,点击右键选择inspect,效果如下图:

示例2

选中右边高亮的代码,右键->copy->copy xpath,即可得到该element的xpath

//*[@id="manualDownload"]/span/b

再利用webdriver本身的xpath搜索功能得到该element,并模拟click操作

driver.find_element_by_xpath('//*[@id="manualDownload"]/span/b').click()

运行上面这句话,我们看到网站的确响应了,出现了支持下载的3种电子书格式. 这一步的点击下载按钮是必须的,否则直接click epub会报element not visible的错误. 接下来我们示范下载epub, 将鼠标悬浮在epub上,右键查看,即可得到下载epub的xpath,同上操作

driver.find_element_by_xpath('//*[@id="manualDownload"]/div/div/ul/li[2]/a').click()

这样我们就可以把这个epub电子书下载到我们指定的路径了.

Selenium的基本应用就是这样了. 它还有一些其它的定位element的方法和模拟操作的功能, 例如常用的把网页往下拖, 因为有的网站会根据用户下拉的情况来渲染网页,越往下拉显示的内容越多. 具体请看selenium的官方文档.

我们将以上过程针对每一个page每一本书执行,即可爬取全站的书籍了,前提是你的网速足够快,运气足够好. 这是因为在连续爬取时,会出现一些异常,例如
1. webdriver打开网页会失败
2. 下载还没完成就打开下一个网页,造成webdriver负担过大从而加载网页失败
3. 网站可能会根据IP地址反爬虫

在下一篇中我们会解决以上问题,并用多进程加快速度(webdriver打开网页实在太慢).

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/488043.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

golang 升级到新版本_Scikit-learn新版本发布,一行代码秒升级

十三 发自 凹非寺 量子位 报道 | 公众号 QbitAIScikit-learn,这个强大的Python包,一直深受机器学习玩家青睐。而近日,scikit-learn 官方发布了 0.22 最终版本。此次的更新修复了许多旧版本的bug,同时发布了一些新功能。安装最新版…

重磅:2020年度获国家科学技术奖励提名的材料项目汇总

来源:http://www.nosta.gov.cn/upload/2020slxmgb/showProject.html转自:材料人2020年3月24日,科学技术部发布了《国家科学技术奖励工作办公室公告第95号》文件。这份文件对2020年国家自然科学奖、国家技术发明奖通用项目、国家科学技术进步奖…

完全理解Android中的RemoteViews

一、什么是RemoteViewsRemoteViews翻译过来就是远程视图.顾名思义,RemoteViews不是当前进程的View,是属于SystemServer进程.应用程序与RemoteViews之间依赖Binder实现了进程间通信.二、RemoteViews的用法RemoteViews使用最多的场合是通知栏和桌面小插件. 以通知栏为例,讲解下它…

各大媒体优劣对比_吉利星瑞特别版对比朗逸,亮点只有性价比?

据悉,吉利汽车推出了星瑞特别版车型——星瑞设计师推荐款,新车已于10月11日的11:00开启抢购,限量3000辆,抢购价格为13.77万元。其中值得注意的是,新车的抢购流程有所不同,想参与抢购的消费者需要先完成吉利…

【推广】实用命令——tldr

碎碎念如题,通常遇到一个新的命令需要查询其帮助的时候,一般使用command -h或者man command来查询,但是,有时候仅仅想知道这个命令怎么用,并不想知道具体含义啊(这个命令可能不常用,没有必要仔细阅读手册)&…

Nature重大突破!将皮肤细胞直接转化成感光细胞让小鼠重见光明!

图片来源:https://cn.bing.com本文系生物谷原创编译,欢迎分享,转载须授权!研究人员发现了一种直接将皮肤细胞重新编程成用于视觉的光敏杆状感光器的技术。实验室制造的杆状体使失明的老鼠能够在细胞移植到眼睛后探测到光线。这项研…

时间组件选择一个时间段_衡南(光伏支架组件安装)施工队

衡南(光伏支架组件安装)施工队光伏支架安装本行业的技术人员应该了解,本发明不受上述实施例的限制,上述实施例和说明书中描述的只是说明本发明的原理,在不脱离本发明精神和范围的前提下,本发明还会有各种变化和改进,安…

DNA存储,拯救人类数据危机的良方?

来源:脑极体开一个脑洞:如果地球正在面临一场马上到来的毁灭性星际灾害,人类又想尽可能地保存地球的生命和文明,在现有条件下,该怎么办?像大刘一样让地球停止自转然后逃离太阳系,这恐怕来不及了…

oracle数据库dblink创建语句_「运维实验」——达梦数据库DBlink连接Oracle配置

经过昨天达梦数据库间DBlink配置(具体操作可回看上一篇文章),今天做延伸实验。实验环境说明Oracle数据库1:192.168.80.40 ora11g RHEL 6.5 64位达梦数据库1:192.168.80.41 DMSERVER2 RHEL 6.5 64位oracle数据库版本&am…

智能经济的动力,从人工智能到超级智能

作者:刘锋前言:本文是根据研讨会发言形成的探讨性文章,主要阐述了智能经济的产生本质上是科技生态发生重大变化后的产物。提出智能经济运转的动力除了人工智能,人类的智能,互联网大脑模型的超级智能也是新出现的要素。…

损失函数_SRGAN损失函数(目标函数)详解

概要SRGAN的特点之一就是引进了损失感知函数,由此提升了超分辨率之后的细节信息。本文主要像您介绍SRGAN使用的损失函数,及其Keras实现。损失函数公式这是原文中给出的损失函数。容易看出,此损失函数包括两部分,第一部分是感知损失…

PHP获取本月起始和终止时间戳

一、本月起始和结束 //获取本月开始的时间戳 $beginThismonthmktime(0,0,0,date(m),1,date(Y)); //获取本月结束的时间戳 $endThismonthmktime(23,59,59,date(m),date(t),date(Y)); View Code二、上月起始和结束 写法一: $m date(Y-m-d, mktime(0,0,0,date(m)-1,1,…

人工智能细分领域龙头企业排行榜单

来源:互联网周刊2020年3月4日,中共中央政治局常务委员会召开会议,提出要发力于科技端的基础设施建设,人工智能成为“新基建”七大版块中的重要一项。“新基建”不同于传统思路,其本质是信息数字化的基础设施建设&#…

基于原版Hadoop的YDB部署(转)

YDB依赖环境准备 一、硬件环境 硬件如何搭配,能做到比较高的性价比,不存在短板。合理的硬件搭配,对系统的稳定性也很关键。 1.CPU不是核数越高越好,性价比才是关键。 经常遇到很多的企业级客户,他们机器配置非常高&…

物联网基石,五大领域对智能传感器的需求暴涨

来源:仪商网 传感器好比人的眼耳口鼻,但又不仅仅只是人的感官那么简单,它甚至能够采集到更多的有用信息。既然如此,就可说这些传感器是整个物联网系统工作的基础,正是因为有了传感器,物联网系统才有内容传递…

c6011取消对null指针的引用_C/C++学习笔记——C提高:指针强化

指针是一种数据类型指针变量指针是一种数据类型,占用内存空间,用来保存内存地址。void test01(){ int* p1 0x1234; int*** p2 0x1111; printf("p1 size:%d\n",sizeof(p1)); printf("p2 size:%d\n",sizeof(p2)); //指针是变…

现在的人工智能只是“窄AI”?

来源丨The Next Web编辑丨科技行者1956年,由数学系年轻的助理教授John McCarthy领导的科学家小组齐聚新罕布什尔州的达特茅斯学院,计划进行一个为期六周且雄心勃勃的项目:创建一种能够“使用语言、形式抽象与概念,帮助人类解决各类…

需要单机还是集群部署_单机、集群和分布式(微服务结构)的区别

一、单机单机就是所有的业务全部写在一个项目中,部署服务到一台服务器上,所有的请求业务都由这台服务器处理。显然,当业务增长到一定程度的时候,服务器的硬件会无法满足业务需求。自然而然地想到一个程序不行就部署多个喽&#xf…

查询 oracle_ORACLE数据库查询语句

Oracle数据库————SQL基本查询一、涉及内容1.掌握SELECT 语句的基本语法。2.掌握常用函数的使用。二、具体操作(一)使用Scott方案下的emp表和dept表,完成以下操作:1.查询部门编号是20的员工信息。2.查询工作为CLERK的员工号、员工名和部门号&#xff…

2020年中国新基建产业报告(收藏)

来源:董秘君未来智能实验室的主要工作包括:建立AI智能系统智商评测体系,开展世界人工智能智商评测;开展互联网(城市)云脑研究计划,构建互联网(城市)云脑技术和企业图谱&a…