Python爬虫获取电子书资源实战

本文介绍了使用Python的BeautifulSoup库进行网页爬取,详细讲解了如何从一个电子书网站抓取目录、书籍列表、书籍详情以及资源下载的过程,强调了Python在爬虫开发中的高效性和实用性,特别适合小型应用和全栈开发。
该文章已生成可运行项目,

最近在学习Python,相对java来说python简单易学、语法简单,工具丰富,开箱即用,适用面广做全栈开发那是极好的,对于小型应用的开发,虽然运行效率慢点,但开发效率极高。大大提高了咱们的生产力。为什么python能够在这几年火起来,自然有他的道理,当然也受益于这几天大数据和AI的火。

据说网络上80%的爬虫都是用python写的,不得不说python写爬虫真的是so easy。基本上一个不太复杂的网站可以通过python用100多行代码就能实现你所需要的爬取。现在就以一个电子书的网站为例来实现python爬虫获取电子书资源。爬取整站的电子书资源,按目录保存到本地,并形成索引文件方便查找。

有详细的配套教程以及源码,都已经打包好上传到百度云了,链接在文章结尾处!
需要可以微信扫描下方CSDN官方认证二维码免费领取

爬取的目标网站:苦瓜书盘

步骤:爬取->分析、解析->保存

对于一个不需要登录验证的资源分享类的网站,爬取最大的工作量应该是在对目标页面的分析、解析、识别,这里用的到是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、爬取获取的资源

按目录都已经整理好了,够你看的了。

本文章已经生成可运行项目
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值