Python爬虫实战- 爬取整个网站112G-8000本pdf epub格式电子书下载
(整个代码附在最后)
目录:
- 爬虫准备 - 某电子书网站内容架构分析
- 爬虫前奏 - 网站Html代码分析,如何获取需要的链接?
- 爬虫高潮 - 测试是否有反爬虫措施,测试是否能正常下载一个sample
- 爬虫论剑 - 根据需求编写爬虫函数代码,如正则表达式等。
- 爬虫测试 – 开始爬虫,根据问题点优化代码bug
- 爬虫总结 – 总结爬虫过程,记录问题点,分享爬虫经验等。
- 爬虫代码 - 白浪介绍以及分享整个爬虫代码
注:
- 本文档仅供学习Python之用,任何非法的活动引起的法律纠纷与本人无关。本人享有该文档最终解释权。
- 爬虫道德提醒:别人建一个网站也不容易,请不要用多线程爬虫,分分钟弄爆服务器可不是开玩笑的。
本文档适合Python初学者,以及有一定Python经验的人。代码注释很详细,不用担心看不懂。
1.爬虫准备 - 某电子书网站内容架构分析
爬取的目标网站有很多英文电子书,平时根据需求一本本下载太慢,担心哪天网站关了就下不到资料,于是Python爬虫技术就派上用场了。
网站内容介绍:网站首页如下:初步估算电子书达一万多本,涵盖IT的各行各业。
涉及的方向有:
Web技术, 各种编程语言(C,C++,Python,Java,CUDA…),数据库,大数据,图形图像设计,操作系统,网络与云计算,工商管理,各种证书认证,电脑与新技术,创业事业,游戏开发,硬件与DIY,市场SEO,网络安全黑客,各种软件使用(如PS等)
从硬件,DIY,树莓派,STM,嵌入式驱动到操作系统,Android,windows,linux,Mac等都有。再到应用层的开发,涉及各种编程语言,再到云计算,大数据等。还有适合产品经理,企业高管,创业者,学生考试认证,工程师考试认证等各个方面的资料。
总而言之,我非常喜欢的一个网站,没有广告,各种资料点击进去就能下载。
1.2 如,点击第一本《Learn Java with Math》
如图,介绍了该版本书籍的出版年份,页数231页,文档格式支持pdf以及epub格式的下载,还有书籍的简述。非常的赞。
点击下方的 Download 就能下载pdf格式的文档,或者epub格式的文档。
2. 爬虫前奏 - 网站Html代码分析
2.1 网站下方有页码,一共840页,每页10本书。
url的页数命名也很简单: www.****.org/gage/2 ,每一页就改变后面的数字
2.2 每一页Html代码分析:
如下图为第2页,每页10本书,浏览器按 F12按键,可以查看html代码,一级一级的解析,可以看到每本书介绍页面对应的URL。
2.3 每本书页面的HTML代码代码而分析:
选取第一本书页面作为分析,按下F12,一级一级解析,可以看到该pdf本书对应的下载地址以及 epub书籍对应的下载地址。
2.4 至此该网站的HTML代码分析完了。如何在爬虫时候正则匹配这些URL也是非常关键的地方。
网站HTML总结一下:
3. 爬虫高潮 – 编写代码测试是否能正常下载一个sample
第二节已经详细分析了该网站的架构以及HTML代码,下面就编写一个函数用来测试是否能正常根据URL下载pdf文档。(整个代码在最后)
该pdf下载测试函数主要分为两部分,一个是建立文件夹,一个是根据文档的URL下载地址看看是否能下载。若不能下载,修改 header 文件。通过测试,该header可以正常访问服务器资源,说明该网站没有什么反爬虫措施。
关于具有反爬虫措施导致的异常error问题,后续相关的文章会继续介绍。
4. 爬虫论剑 - 编写各个爬虫函数代码
4.1 import模块
import os
import requests
import re
from bs4 import BeautifulSoup
import time
import logging
4.2 logging模块
记得用log,因为你永远不知道你的爬虫程序会遇到什么bug,记录log是个非常好的习惯,当爬虫遇到bug异常时候,log能够帮助你分析问题。
#--------------------log记录---------------
# 创建一个logger
logger = logging.getLogger(__name__)
logger.setLevel(level = logging.INFO)
# 创建一个handler,用于写入日志文件
handler = logging.FileHandler("log.txt")
handler.setLevel(logging.INFO)
'''
# 再创建一个handler,用于输出到控制台
ch = logging.StreamHandler()
ch.setLevel(logging.DEBUG)'''# 定义handler的输出格式
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
handler.setFormatter(formatter)# 给logger添加handler
logger.addHandler(handler)#logger.addHandler(ch)
4.3 Pdf文件下载函数
根据每个pdf文件的URL来下载文件。
# 下载文件
def DownloadPdf(url):#print("1")try:filename = url.split('/')[-1] #以/为分割符保留最后一段#如果文件不存在if (not os.path.exists(filename)):r = requests.get(url, headers = header1)f = open(filename,"wb")f.write(r.content)f.close()print("download ok")logger.info("download ok") #log记录else:print("文件已经存在,跳过下载")logger.info("文件已经存在,跳过下载") #log记录except Exception as reason:logger.info("出错原因:%s" %str(reason)) #log记录print("出错原因:%s" %str(reason))
4.4 爬虫重点程序(重点注意事项都在代码里)
getPage(url):用来解析每个URL界面,返回HTML代码。
getPdfPage(bookurl):获取每本书介绍页面的pdf下载地址,然后调用DownloadPdf()函数来下载书籍。
getPageList(html):获取每个页面10本书的 URL地址,然后调用getPdfPage()函数。
makedir(dirNum):创建文件夹,文件太多,该函数很有用。
Main(): 主函数完成840页的循环,每一页里面调用getPageList()函数。
程序逻辑:main()- getPageList()- getPdfPage()- DownloadPdf()
# books网站一共840页面
def getPage(url):try:page = requests.get(url, headers = header1) #获取每一页的html,每一页的html没有pdf文档html = page.contentreturn htmlexcept e as reason:logger.info("出错原因:%s" %str(reason)) #log记录#获取每本书页面的pdf
def getPdfPage(bookurl):html2 = getPage(bookurl)#print(html) soup2 = BeautifulSoup(html2,"lxml",from_encoding='utf-8') #网页为lxml格式#查找pdf文件下载的节点tags2 = soup2.find_all('span', class_="download-links") logger.info("pdf tags:%s" %str(tags2)) #log记录#print(tags2)#move_list = []#re测试'''print("re测试")for list2 in tags2:move = list2.a.span.text.strip()move_list.append(move)print(move_list)'''for list2 in tags2:try:herf2 = list2.find_all('a')#正则匹配,每本书介绍页面的urlbookDownloadUr = str(re.findall("http?://(?:[-\w.])+/(?:[-\w.])+/(?:[-\w.,'\s.])+", str(herf2)))print(bookDownloadUr)logger.info(bookDownloadUr) #log记录#移除字符串首尾的[]'"bookDownloadUrl = bookDownloadUr.strip("[']")bookDownloadUrl = bookDownloadUrl.strip('"')except Exception as reason:logger.info("出错原因:%s" %str(reason)) #log记录#匹配 pdf文档if '.pdf' in bookDownloadUrl:if '.epub' in bookDownloadUrl:print('')else:print("下载书籍网址:"+bookDownloadUrl)logger.info("下载书籍网址:%s" %str(bookDownloadUrl)) #log记录DownloadPdf(bookDownloadUrl)#return bookDownloadUrlelse:print('epub文件,跳过下载')logger.info('epub文件,跳过下载') #log记录#获取每页的10本书的url
def getPageList(html):soup = BeautifulSoup(html,"lxml",from_encoding='utf-8') #网页为html格式#查找所有有关的节点tags = soup.find_all('h2', class_="entry-title")#tags = soup.find('h2', class_="entry-title")for list1 in tags:try:herf = list1.find_all('a')bookname = herf[0].string #每页书籍的名称logging.info("书籍名称:%s" %str(bookname))#正则匹配,每本书介绍页面的urlbooku = str(re.findall('http?://(?:[-\w.])+/(?:[-\w.])+', str(herf)))#移除字符串首尾的[]bookurl = booku.strip("[']")getPdfPage(bookurl)except Exception as reason:logger.info("出错原因:%s" %str(reason)) #log记录#bookurl = re.findall('https?://(?:[-\w.]|(?:%[\da-fA-F]{2}))+', str(herf))#print(bookurl)#print(herf[0].string) #每页书籍的名称#每次休眠4秒钟,防止对方服务器崩溃。time.sleep(4)#创建文件夹
def makedir(dirNum):#路径归为os.chdir(cp) #切换原始路径filepathName = str(dirNum)isExists = os.path.exists(filepathName)if not isExists:os.mkdir(filepathName)print(filepathName + '文件夹创建成功')logger.info(filepathName + '文件夹创建成功') file = '\%s' %filepathName #刚刚创建的那个文件夹的相对路径 path = os.path.join(cp+file) #刚刚创建的那个文件夹的绝对路径os.chdir(path) #切换路径def main():print('----爬虫下载程序----')url = "http://www.allitebooks.org/page/"#第一页目录dirNum = 1mkdir(dirNum)#os.chdir(os.path.join(cp+ '\%s'%dirNum)) #切换路径 '''测试记录:5页ok,6-31 linux下载''' for pageNum in range(1,840): #从第1页到第2页,有840页。每页10本书'''创建文件夹,每5页,即50本书创建一个文件夹'''if pageNum%5 == 0:dirNum = dirNum+1makedir(dirNum) #爬虫网址print("pageNum = " + str(pageNum))logger.info("pageNum = " + str(pageNum))urlNew = url + str(pageNum)getPageList(getPage(urlNew)) #testSavePdf()
if __name__=="__main__":main()
5. 开始爬虫
上述代码爬虫,秀一下爬虫结果。前面几个文件夹文件比较多,后面每个文件夹约50本书。有些书籍是upub文件,代码中设置了跳过下载,共有7700多本pdf资料。112G资料。建议硬盘空间够大再爬,或者只爬取一部分。
6.爬虫总结:
关注公众号可获取该次爬虫的pdf经验文档,以及爬虫代码。相关的书籍资料也可以加微信我会发给你。
白浪介绍(Geekxiaobai):
(1)关于射频、微波、天线、无线通信、智能硬件、软件编程、渗透安全、人工智能、区块链、大数据、Java、Android、C/C++、python等综合能力的培养提升。
(2)各种学习资料、学习软件分享。
========******=========******====END====******=========******==========
Python爬虫实战- 爬取整个网站112G-8000本pdf epub格式电子书下载相关推荐
- Python爬虫实战爬取租房网站2w+数据-链家上海区域信息(超详细)
Python爬虫实战爬取租房网站-链家上海区域信息(过程超详细) 内容可能有点啰嗦 大佬们请见谅 后面会贴代码 带火们有需求的话就用吧 正好这几天做的实验报告就直接拿过来了,我想后面应该会有人用的到吧 ...
- python爬虫实战-爬取视频网站下载视频至本地(selenium)
#python爬虫实战-爬取视频网站下载视频至本地(selenium) import requests from lxml import etree import json from selenium ...
- python爬虫实战---爬取大众点评评论
python爬虫实战-爬取大众点评评论(加密字体) 1.首先打开一个店铺找到评论 很多人学习python,不知道从何学起. 很多人学习python,掌握了基本语法过后,不知道在哪里寻找案例上手. 很多 ...
- python爬虫实战-爬取微信公众号所有历史文章 - (00) 概述
http://efonfighting.imwork.net 欢迎关注微信公众号"一番码客"获取免费下载服务与源码,并及时接收最新文章推送. 最近几年随着人工智能和大数据的兴起,p ...
- 初次尝试python爬虫,爬取小说网站的小说。
本次是小阿鹏,第一次通过python爬虫去爬一个小说网站的小说. 下面直接上菜. 1.首先我需要导入相应的包,这里我采用了第三方模块的架包,requests.requests是python实现的简单易 ...
- python爬虫实战--爬取猫眼专业版-实时票房
小白级别的爬虫入门 最近闲来无事,发现了猫眼专业版-实时票房,可以看到在猫眼上映电影的票房数据,便验证自己之前学的python爬虫,爬取数据,做成.svg文件. 爬虫开始之前 我们先来看看猫眼专业版- ...
- python爬虫 亲手爬取图书网站
这个爬虫只是一个简单的爬虫,单线程并且任务的管理等 一 爬虫数据持久化方式 使用的是mysql数据库.需要设备上先安装mysql数据库,python中使用mysql 数据库的方法是使用pymysql库 ...
- Python爬虫实战——爬取RUNOOB.COM的Python3教程
说明 关于Python开发环境搭建,可参考博主的另一篇博文-Visual Studio 2017搭配OpenCV之Python环境,省去其中的OpenCV配置及安装即可.另外,在做Python爬虫项目 ...
- python爬虫实战-爬取小说
今天做一个爬虫练手的小实战:爬取顶点小说网的小说,实现下载到本地(虽然网站上本来就可以下载,不过还是自己写代码来有成就感嘛!) 爬取网站 进入官网后,点击元尊,就爬取这本书了. 我们先把整个网页爬下来 ...
最新文章
- 爱奇艺拟发行5亿美元可转换优先债券
- 在Eclipse中创建Maven多模块工程的例子
- 设计模式-结构型-装饰
- 打造轻量级可视化数据爬取工具-菩提
- laravel项目白屏问题解决办法及原因
- arduino 休眠 节能_优化arduino程序存储空间
- 第十章:XAML标记扩展(二)
- WebSocket(伍) 断开连接
- 不懂得如何优化CNN图像分类模型?这有一份综合设计指南请供查阅
- bzoj 2655: calc [容斥原理 伯努利数]
- 【grpc】[Python] A file with this name is already in the pool
- Android代码中实现关机
- 徐耀赐教授系列讲座——车道宽度理论在城市道路路网中的应用(编译文本)...
- HTML5中多媒体标签之音频标签
- 腾达ap设置说明_腾达(Tenda)F6无线信号放大模式(Client+AP)设置教程 | 192路由网
- 什么叫少儿机器人编程
- 记录一下如何运行MDX文件
- K_A18_001 基于STM32等单片机采集MQ2传感参数串口与OLED0.96双显示
- 安卓硬件模拟大师_青春的记忆,记安卓防御软件历史见证者:LBE安全大师
- 笔记本电脑直接开热点(在连接了wifi的情况下)
热门文章
- 怎么给图片添加水印?教你一个图片加水印小妙招
- pandas数据分析之数据重塑透视(stack、unstack、melt、pivot)
- ProxyPool 代理
- 五一应该去哪里自驾游?哪里人最少,哪里不堵车?这份攻略你必须拥有。
- java rtmp推流_视频直播生成推流和播放地址的Java代码示例
- 1离线TiDB-Ansible 部署问题-总结
- 笔记本电脑无法连上WiFi的解决办法
- Clock skew too great
- Markdown语法笔记
- 刺猬乐队在唯品会工作过_Microsoft乐队是您从未听说过的出色智能手表和健身追踪器...