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

简介

我最近在看关于计算机的一些书籍,发现了这个电子书清单:计算机开放电子书汇总, 和大家分享一下. 我在下载其中的书籍时被导向了这个很好的计算机电子书网站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标签页了, 如下图所示:

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

选中右边高亮的代码,右键->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打开网页实在太慢).

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

  1. python抓取文献关键信息,python爬虫——使用selenium爬取知网文献相关信息

    python爬虫--使用selenium爬取知网文献相关信息 写在前面: 本文章限于交流讨论,请不要使用文章的代码去攻击别人的服务器 如侵权联系作者删除 文中的错误已经修改过来了,谢谢各位爬友指出错误 ...

  2. python爬虫代码房-Python爬虫一步步抓取房产信息

    原标题:Python爬虫一步步抓取房产信息 前言 嗯,这一篇文章更多是想分享一下我的网页分析方法.玩爬虫也快有一年了,基本代码熟悉之后,我感觉写一个爬虫最有意思的莫过于研究其网页背后的加载过程了,也就 ...

  3. 通过Python爬虫按关键词抓取相关的新闻

    前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途 如今各大网站的反爬机制已经可以说是到了丧心病狂的程度,比如大众点评的字符加密.微博的登录验证等.相比较而言,新闻网站的反爬机制 ...

  4. python 爬虫学习:抓取智联招聘网站职位信息(二)

    在第一篇文章(python 爬虫学习:抓取智联招聘网站职位信息(一))中,我们介绍了爬取智联招聘网站上基于岗位关键字,及地区进行搜索的岗位信息,并对爬取到的岗位工资数据进行统计并生成直方图展示:同时进 ...

  5. python爬虫关键词抓手机号_通过Python爬虫按关键词抓取相关的新闻

    前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 如今各大网站的反爬机制已经可以说是到了丧心病狂的程度,比如大众点评的字符加 ...

  6. Python爬虫项目:抓取智联招聘信息

    来自https://mp.weixin.qq.com/s/0SzLGqv2p0-IWSN3r8bOHA ''' Python爬虫之五:抓取智联招聘基础版 该文件运行后会产生一个代码,保存在这个Pyth ...

  7. python爬虫——使用selenium爬取微博数据(一)

    python爬虫--使用selenium爬取微博数据(二) 写在前面 之前因为在组里做和nlp相关的项目,需要自己构建数据集,采用selenium爬取了几十万条微博数据,学习了很多,想在这里分享一下如 ...

  8. python爬虫妹子图抓取

    python爬虫妹子图抓取 目标网址:图片地址 我的github地址:超链接 可以自行感受一下,我就不说了,重点是学习代码,不是图片 #! /usr/bin/python3 # -*- coding: ...

  9. python抓取网页内容到excel_Python实现抓取网页生成Excel文件的方法示例

    本文实例讲述了Python实现抓取网页生成Excel文件的方法.分享给大家供大家参考,具体如下: Python抓网页,主要用到了PyQuery,这个跟jQuery用法一样,超级给力 示例代码如下: # ...

最新文章

  1. 使用Python和OpenCV构建图像金字塔
  2. 使用迭代器从map或vector中删除元素
  3. QPS、TPS、RT、并发量、 吞吐量
  4. liferay 在css 中,引入图片的写法
  5. Jquery ajax 学习笔记
  6. 源码安装NASM,无root权限
  7. STM32使用IIC总线通讯协议在OLED屏幕上显示字符串、汉字、图像(硬件IIC)
  8. Java笔记06-Map集合
  9. Sudoku-Java
  10. 区域增长 matlab,图像分割 区域增长
  11. PHP将日期转换为时间戳方式,php日期转换为时间戳的方法
  12. 残差网络resnet网络原理详解
  13. 用Prolog解决爱因斯坦斑马问题
  14. 计算机系统应用软件的核心是什么,计算机系统软件的核心是什么?
  15. hdu4415 Assassin’s Creed (贪心)
  16. java满天星星代码_java实现满天星swingawt
  17. Android基于Facebook Rebound的动画效果框架Backboard demo (非常炫酷)
  18. 【使用老电脑win7下载miniconda】
  19. mysql 简述pk uk fk 的区别和对数据库性能的影响_SQL Server 数据库中PK,UK, DF, CK, FK是什么意思?...
  20. 非常时期的情人节,只能云表白了

热门文章

  1. 进度条上的小圆点怎么做_傲视网:【AE教程】如何制作环形进度条(第一讲)...
  2. 公安计算机技能测试题库,2018公安文职考试题库:行政职业能力测验
  3. 知识图谱论文阅读(二十三)【SIGIR2020】Multi-behavior Recommendation with Graph Convolutional Networks
  4. 深入浅出排序学习:写给程序员的算法系统开发实践
  5. 机器学习】LDA线性判别分析
  6. Android官方开发文档Training系列课程中文版:布局性能优化之ListView的优化
  7. 大数据建模、分析、挖掘技术应用研修班的通知
  8. excel保存超过15位数据不变科学计数法的方法
  9. java对List的优雅排序
  10. (数据科学学习手札45)Scala基础知识