抓取网页生成电子书(一步步解析单个页面,得到该页书籍链接列表得到)
优采云 发布时间: 2022-03-13 00:12抓取网页生成电子书(一步步解析单个页面,得到该页书籍链接列表得到)
2. 解析单个页面以获取该页面上的书籍链接列表
3. 转到书页
* 判断是否可以下载
* 如果可以下载,请下载所有格式的书籍
其次,为了获得爬虫的健壮性,我们需要保证每次网页加载成功,文件下载完成,我会在后面的内容中一步一步介绍。
实施过程
Selenium 可以模拟打开浏览器。在此之前,我们需要下载浏览器的驱动程序。在本文中,我们使用的是chrome浏览器,Firefox也是常用的浏览器。步骤类似,不再赘述。
硒的安装:
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三个下载选项。为了模拟点击动作,我们需要获取元素的位置。这时候我们就可以使用chrome的inspect功能了,快捷键是 Ctrl+shift+I ,或者将鼠标悬停在下载上,右键选择inspect,效果如下:
选择右边高亮的代码,右键->复制->复制xpath,可以得到元素的xpath
//*[@id="manualDownload"]/span/b
然后使用webdriver本身的xpath搜索功能获取元素,并模拟点击操作
运行上面这句话,我们可以看到网站确实响应了,支持下载的电子书格式有3种。这一步点击下载按钮是必须的,否则直接点击epub会报 element not visible 的错误。接下来我们演示下载epub,鼠标悬停在epub上,右键查看,可以得到下载epub的xpath,同上
driver.find_element_by_xpath('//*[@id="manualDownload"]/div/div/ul/li[2]/a').click()
这样我们就可以把这本epub电子书下载到我们指定的路径了。
这是 Selenium 的基本应用。它还有一些其他定位元素的方法和模拟操作的功能,比如把网页往下拉,因为有些网站会根据用户的下拉情况来渲染网页,越往下拉,显示的内容越多。详情请查看 selenium 的官方文档。
我们对每一页的每一本书执行上述过程,然后我们可以爬取整个站点的书籍,前提是你的网速够快,运气够好。这是因为在持续爬取过程中会出现一些异常,例如
1. webdriver 将无法打开网页
2. 下载完成前打开下一个网页,导致webdriver负担过重,无法加载网页
3. 网站可能是基于IP地址的反爬虫
下一篇我们将解决以上问题,使用多进程加速(webdriver太慢,无法打开网页)。