教你使用Python爬虫获取电子书资源实战!喜欢学习的小伙伴过来看啦!
最近在学习Python,相对java来说python简单易学、语法简单,工具丰富,开箱即用,适用面广做全栈开发那是极好的,对于小型应用的开发,虽然运行效率慢点,但开发效率极高。大大提高了咱们的生产力。为什么python能够在这几年火起来,自然有他的道理,当然也受益于这几天大数据和AI的火。
据说网络上80%的爬虫都是用python写的,不得不说python写爬虫真的是so easy。基本上一个不太复杂的网站可以通过python用100多行代码就能实现你所需要的爬取。 现在就以一个电子书的网站为例来实现python爬虫获取电子书资源。爬取整站的电子书资源,按目录保存到本地,并形成索引文件方便查找。
爬取的目标网站:苦瓜书盘
步骤:爬取->分析、解析->保存
对于一个不需要登录验证的资源分享类的网站,爬取最大的工作量应该是在对目标页面的分析、解析、识别,这里用的到是Python的BeautifulSoup库。
一、获取目录
二、获取书籍列表页
三、获取书籍详情页
四、分析书籍详情页的资源地址
五、下载并保存
一、获取目录
通过浏览器的调试工具可以看到目录在id=catagory的div标签下,下面还有ul和li标签,那我们可以迭代li可以获得目录及目录页的地址。
可以通过soup.find_all( attrs ={ 'id' : 'category' })[ 0 ].ul 获取 到ul标签,然后获取ul的li标签,进行迭代获取。
代码如下:
'''
获取目录
'''
def getcategory():
req_result=requests.get(main_url, headers =headers)
if req_result.status_code== 200 :
htmlstr=req_result.content.decode( 'utf-8' )
soup = BeautifulSoup(htmlstr, 'lxml' )
categorys=soup.find_all( attrs ={ 'id' : 'category' })[ 0 ].ul
for li in categorys.find_all( name = 'li' ):
print ( '开始抓取' +li.a.attrs[ 'href' ]+ "--" +li.string)
getcategroydetail(main_url+li.a.attrs[ 'href' ],li.string)
time.sleep( 1 )
二、获取书籍列表页
在书籍列表页,我们要获取两个信息,分别是书籍列表的信息及翻页下一页书籍列表的URL地址。
通过浏览器的调试工具分别对列表的信息及翻页下一页的html进行分析。
列表中的书籍详情页信息在class="channel-item"的div标签下,通过class="list-title"的h3标签循环迭代
下一页,我们可以直接通过next_pag=soup.find(name='a',text=re.compile('下一页'))来获取。
然后我们可以通过递归来不断的调用获取下一页书籍列表页的代码,知道没有下一页为止。就可以把怎个目录都可以爬取完。
代码如下:
'''
获取书籍列表
'''
def getbookslist(bookurlstr,categroy_path):
book_result=requests.get(bookurlstr, headers =headers)
bookhtmlstr=book_result.content.decode( 'utf-8' )
soup = BeautifulSoup(bookhtmlstr, 'lxml' )
booklists=soup.select( '.channel-item' )
for bookinfo_div in booklists:
booktitle_div=bookinfo_div.select( '.list-title' )[ 0 ]
bookurl=booktitle_div.a.attrs[ 'href' ]
getbookdetail(bookurl,categroy_path)
next_pag=soup.find( name = 'a' , text =re.compile( '下一页' ))
if next_pag is not None :
next_url=next_pag.attrs[ 'href' ]
print ( '爬取下一页:' +next_url)
getbookslist(next_url,categroy_path)
三、获取书籍详情页
我们要在书籍详情页需要获得书籍详情信息包括书名、作者等信息
关于书名和作者可以分别通过提取class="news_title"的h1标签和id="news_details"的div下的ul下的li再通过正则表达式对作者信息进行提取。
booktitle=bookdetailsoup.select( '.news_title' )[ 0 ].text.strip()
bookauthor=bookdetailsoup.select( '#news_details' )[ 0 ].ul.li.find( text =re.compile( '作者:(.*?)' )).strip()
bookauthor=bookauthor.replace( '作者:' , '' )
booktitleinfo= "《" +booktitle+ '》-' +bookauthor
四、分析书籍详情页的资源地址
在书籍详情页,我们还要分析书籍详情页的资源地址
电子书的资源下载地址可以通过提取a标签的信息来获取。通过正则表达式分别匹配azw3、mobi、epub分别提取不同的电子书资源。
book_url_item=bookdetailsoup.find( name = 'a' , text =re.compile(booktype,re.I))
代码如下:
'''
根据书籍资源类型下载资源
'''
def getbookfortype(bookurl,categroy_path,bookdetailsoup,booktype):
booktitle=bookdetailsoup.select( '.news_title' )[ 0 ].text.strip()
bookauthor=bookdetailsoup.select( '#news_details' )[ 0 ].ul.li.find( text =re.compile( '作者:(.*?)' )).strip()
bookauthor=bookauthor.replace( '作者:' , '' )
booktitleinfo= "《" +booktitle+ '》-' +bookauthor
print ( '书籍详情:---' +booktitleinfo)
book_url_item=bookdetailsoup.find( name = 'a' , text =re.compile(booktype,re.I))
if book_url_item is not None :
downloadurl=book_url_item.attrs[ 'href' ]
print ( '下载地址:' +downloadurl)
if checkIfNoExistBookByUrl(downloadurl):
r = requests.get(downloadurl)
if r.status_code== 200 :
savepath=createdir(categroy_path,booktitleinfo)
filename=booktitle+ "." +booktype
savebook(r.content,savepath,filename)
p,f=os.path.split(categroy_path)
bookcategory=f
book=Book(bookcategory,booktitle,bookauthor,bookurl,downloadurl,savepath, "苦瓜书盘" ,booktype)
print (book.toString())
savebooktojson(book)
else :
print ( '下载失败:status_code=' + str (r.status_code))
else :
print ( '没有' +booktype+ '格式的书' )
五、下载并保存
有了资源的下载资源后下载就变得很简单了,主要用python的os库,对文件进行操作,包括建目录及保存资源文件。也可以通过连接数据库将爬取的数据保存到数据库。
定义书籍类Book用于组织和保存数据。
class Book( object ):
def __init__ ( self ,bookcategory,bookname,bookauthor,bookurl,bookdownloadurl,booksavepath,booksource,booktype):
self .bookcategory=bookcategory
self .bookname=bookname
self .bookauthor=bookauthor
self .bookurl=bookurl
self .bookdownloadurl=bookdownloadurl
self .booksavepath=booksavepath
self .booksource=booksource
self .booktype=booktype
def toString( self ):
return { "bookcategory" : self .bookcategory, "bookname" : self .bookname, "bookauthor" : self .bookauthor, "bookurl" : self .bookurl, "bookdownloadurl" : self .bookdownloadurl, "booksavepath" : self .booksavepath, "booksource" : self .booksource, "booktype" : self .booktype}
'''
将获取的信息保存至文件
'''
def savebooktojson(book):
bookdata={
'booksource' :book.booksource,
'booktype' :book.booktype,
'bookcategory' :book.bookcategory,
'bookname' :book.bookname,
'bookauthor' :book.bookauthor,
'bookurl' :book.bookurl,
'bookdownloadurl' :book.bookdownloadurl,
'booksavepath' :book.booksavepath
}
bookjson=json.dumps(bookdata, ensure_ascii = False ) #ensure_ascii=False 就不会用 ASCII 编码,中文就可以正常显示了
print (bookjson)
with open ( 'data.json' , 'a' , encoding = 'gbk' ) as file:
file.write(bookjson+ ' \n ' )
'''
根据目录创建文件夹
'''
def createdir(savepath,dir):
path=os.path.join(savepath,dir)
isExists=os.path.exists(path)
if isExists:
print ( '已经存在' +dir)
else :
print ( '创建目录' +dir)
os.mkdir(path)
return path
'''
下载书籍资源
'''
def savebook(content,savepath,savefilename):
savefile=os.path.join(savepath,savefilename)
with open (savefile, "wb" ) as code:
code.write(content)
---------------------------------------------------------
运行效果如下:
1、爬取过程
2、爬取记录的json信息
data.json的信息如下:
3、爬取获取的资源
按目录都已经整理好了,够你看的了。
Python爬虫获取电子书资源实战的全部代码,包括爬取->分析、解析->保存至本地及数据库。
需要源代码的或者想要了解更多的点击这里获取
此文转载文,著作权归作者所有,如有侵权联系小编删除!
原文地址:https://blog.csdn.net/fullbug/article/details/80631263
教你使用Python爬虫获取电子书资源实战!喜欢学习的小伙伴过来看啦!相关推荐
- Python爬虫获取电子书资源实战
最近在学习Python,相对java来说python简单易学.语法简单,工具丰富,开箱即用,适用面广做全栈开发那是极好的,对于小型应用的开发,虽然运行效率慢点,但开发效率极高.大大提高了咱们的生产力. ...
- 手把手教你利用 python 爬虫分析基金、股票
手把手教你利用 python 爬虫分析基金.股票 文章目录 手把手教你利用 python 爬虫分析基金.股票 第一步:基金数据爬取 第二步:股票增持计算 第三步:好股基金选取 桌面程序 exe 从前大 ...
- python爬虫获取起点中文网人气排行Top100(快速入门,新手必备!)
本篇博客小菌为大家带来的是用python爬虫获取起点中文网人气排行Top100的分享,希望大家能在学习的过程中感受爬虫的魅力! 我们先根据网址https://www.qidian.co ...
- 手把手教你入门Python爬虫(二)
手把手教你入门Python爬虫 前言 在上一篇文章中,我们讲解到了基础的计算机网络知识,并完成了"爬取豆瓣Top250电影信息"的项目.那么这一次,作者将带领大家完成" ...
- Python爬虫获取文章的标题及你的博客的阅读量,评论量。所有数据写入本地记事本。最后输出你的总阅读量!
Python爬虫获取文章的标题及你的博客的阅读量,评论量.所有数据写入本地记事本.最后输出你的总阅读量!还可以进行筛选输出!比如阅读量大于1000,之类的! 完整代码在最后.依据阅读数量进行降序输出! ...
- python Chrome + selenium自动化测试与python爬虫获取网页数据
一.使用Python+selenium+Chrome 报错: selenium.common.exceptions.SessionNotCreatedException: Message: sessi ...
- 域名带后缀_[Python 爬虫]获取顶级域名及对应的 WHOIS Server 及 whoisservers.txt 下载...
使用 Python 爬虫获取顶级域名及对应的 WHOIS Server 并保存可用于 WhoisCL.exe 的文件 whois-servers.txt. 环境: Windows 10 Python ...
- python爬虫获取url_Python爬虫如何获取页面内所有URL链接?本文详解
如何获取一个页面内所有URL链接?在Python中可以使用urllib对网页进行爬取,然后利用Beautiful Soup对爬取的页面进行解析,提取出所有的URL. 什么是Beautiful Soup ...
- python爬虫获取下一页url_Python爬虫获取页面所有URL链接过程详解
如何获取一个页面内所有URL链接?在python中可以使用urllib对网页进行爬取,然后利用Beautiful Soup对爬取的页面进行解析,提取出所有的URL. 什么是Beautiful Soup ...
最新文章
- legend位置 pyecharts_实验|pyecharts数据可视化分析-1
- rman备份中的%参数详解
- 趋势网络安全专家2010(Trend Micro Internet Security 2010)免费1年的序列号
- 录取5秒钟的KNN取景效果gif(Opencv) Python实现
- 基于【 centos7】一 || 安装ELK
- 元胞自动机与相关理论和方法
- Cpp / 空指针对象调用函数的不同结果
- 解决flask端口被占用的问题
- JDK源码包结构分类
- js map 只输出key_Vue.js轮播库热门精选
- 面试题:长方形个数计算
- mysql8.0.15安装方法 mysql8安装教程
- 集成CCFlow工作流与GPM的办公系统驰骋CCOA介绍(三)
- C语言C++编程软件推荐及下载方式
- C#System.Text.RegularExpressions.Regex使用
- 页错误异常处理(page fault)的实现
- 杰理之设置立体声输出,播左右声道歌曲后DAC没有声音或声音变小
- 竞品分析—抖音PK快手
- 最强蜗牛服务器维护祷告bug,最强蜗牛 这个游戏的玩家太难带了,竟然天天希望服务器有事...
- 微信服务号开发-获取用户位置信息
热门文章
- Jersey框架和springmvc框架
- JAVA8用哪个版本的MYSQL_MySQL用哪个版本,5.7还是8.0?
- Metasploit后门渗透Linux系统以及跨平台后门生成
- DDNS的NAT穿越问题
- cmd bat 执行多条
- python合并word表格_python合并word
- 华为nova3i 计算机在哪里,华为nova3i常见问题汇总,你想了解的都在这里
- python爬取大学生就业分析专科和本科的信息https://edu.jobui.com/major/(上)JSON的存储
- html 获取浏览器语言,js之获取浏览器语言
- Node开发实践总结-定时脚本的设计与实现