突然间发现这个网站,可以下载很多kindle电子书。观摩了下,和前段时间刚写的爬取头条有点类似。

该网站链接首页:https://bookset.me/,这次爬取排行榜链接:https://bookset.me/?rating=douban,打开观察发现排行榜其实真正分页规则是https://bookset.me/page/num?rating=douban,其中num代表页数。

具体代码如下:

#-*- coding: utf-8 -*-

import re

from requests.exceptions import RequestException

from bs4 import BeautifulSoup

import requests

from multiprocessing import Pool

headers = {

'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:56.0) Gecko/20100101 Firefox/56.0',

'Content-Type': 'application/x-www-form-urlencoded',

'Connection': 'Keep-Alive',

'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8'

}

# 获取页面信息

def get_page_index(page_num):

url = 'https://bookset.me/page/'+ str(page_num) + '?rating=douban'

print(url)

try:

response = requests.get(url, headers = headers)

if response.status_code == 200:

return response.text

return None

except RequestException:

print('请求索引出错')

return None

# 获取当页所有书的URL

def parse_page_index(html):

pattern = re.compile(r'class="thumb-img focus"> ', re.S)

items = re.findall(pattern, html)

print(items)

print(type(items))

for item in items:

yield {

'href': item[0],

'title': item[1]

}

# 获取详情页信息

def get_page_detail(url):

try:

response = requests.get(url, headers = headers)

if response.status_code == 200:

return response.text

return None

except RequestException:

print('请求详情页出错', url)

return None

# 获取页面详情

def parse_page_detail(html, title):

soup = BeautifulSoup(html, 'lxml')

#匹配包含书链接的标签,而且取最后一个下载链接,以mobi格式下载为主

book_link_tag = soup.find_all("a", class_ = "mbm-book-download-links-link")[-1]

book_link_pattern = re.compile(r'href="(.*?)"', re.S)

# 书下载链接直接用正则表达式死活匹配匹配不出来,故作了两次转换

book_link = re.search(book_link_pattern, str(book_link_tag)).group(1)

editors_tag = soup.select(".mbm-book-details-editors-data")

for editor in editors_tag:

editors = editor.get_text().replace(' ','-')

# 书的名字格式

book_name = editors + '-' + title

# 获取文件格式

book_format = book_link[-4:]

down_load_book(book_link, book_name, book_format)

print(book_name)

print(book_link)

print(book_format)

# 下载书文件

def down_load_book(book_link, book_name, book_format):

print('正在下载:', book_link)

try:

response = requests.get(book_link, headers = headers)

if response.status_code == 200:

save_bookes(response.content, book_name, book_format)

return None

except RequestException:

print('请求文件出错', book_link)

return None

# 存储书文件

def save_bookes(content, book_name, book_format):

# 保存到当前目录下

file_path = '{0}.{1}'.format(book_name, book_format)

with open(file_path, 'wb') as f:

f.write(content)

f.close()

def main(page_num):

html = get_page_index(page_num)

for i in parse_page_index(html):

content = get_page_detail(i['href'])

parse_page_detail(content, i['title'])

# 为了调试方便,只抓取每一页第一本,加了break跳出当页所有书链接的循环

break

if __name__ == '__main__':

# 利用多线程,同时请求前5页下载

groups = [x for x in range(1, 6)]

pool = Pool()

pool.map(main, groups)

爬取结果:

运行结果

下载保存结果

遇到的问题:

返回书页面详情中,包含书下载链接标签如下:

mobi下载

采用正则表达式匹配该书的链接,匹配不出来,写的正则表达式匹配模式是:

page_pattern = re.compile(r'

result = re.search(page_pattern, html)

book_link = result.group(1)

未匹配到报错

希望朋友帮忙改进,共同探讨!

代码写了爬取下载前5页每一页的第一本书,实际上保存下载下来只有4本书,估计是短时间内同一IP请求下载多本数目过多。我尝试短时间内手动下载多本提示下面这个:

短时间内手动下载多本提示

会IP代理池的朋友可以帮忙验证下。

python 爬取电子书_利用Python3爬取下载bookset网站的kindle电子书相关推荐

  1. python商品评论分析_用python3爬取天猫商品评论并分析(1)

    在上一篇文章我们已经完成数据的采集,并将数据存储在mysql,现在我们来继续后面的数据分析工作,先放出项目流程: 0.主要流程 0.数据采集 0. 目标网址获取 1. 爬虫框架选用 注:了解这一步请登 ...

  2. python随机读取字符_利用python3随机生成中文字符的实现方法

    前言 运行环境在Python3.6下,Python2的解决方案网上有很多.,想学习python2实现的朋友们可以参考这篇文章:https://www.jb51.net/article/34884.ht ...

  3. python抓取数据包_利用python-pypcap抓取带VLAN标签的数据包方法

    1.背景介绍 在采用通常的socket抓包方式下,操作系统会自动将收到包的VLAN信息剥离,导致上层应用收到的包不会含有VLAN标签信息.而libpcap虽然是基于socket实现抓包,但在收到数据包 ...

  4. python获取app信息的库_基于python3抓取pinpoint应用信息入库

    这篇文章主要介绍了基于python3抓取pinpoint应用信息入库,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 Pinpoint是用Java编写 ...

  5. python正则表达式提取电话号码_利用正则表达式编写python 爬虫,抓取网页电话号码!...

    利用正则表达式编写python 爬虫,抓取网页联系我们电话号码!这里以九奥科技(www.jiuaoo.com)为例,抓取'联系我们'里面的电话号码,并输出. #!/usrweilie/bin/pyth ...

  6. Python爬虫实战八之利用Selenium抓取淘宝匿名旺旺

    其实本文的初衷是为了获取淘宝的非匿名旺旺,在淘宝详情页的最下方有相关评论,含有非匿名旺旺号,快一年了淘宝都没有修复这个. 很多人学习python,不知道从何学起. 很多人学习python,掌握了基本语 ...

  7. python情感分析语料库_利用Python实现中文情感极性分析

    情感极性分析,即情感分类,对带有主观情感色彩的文本进行分析.归纳.情感极性分析主要有两种分类方法:基于情感知识的方法和基于机器学习的方法.基于情感知识的方法通过一些已有的情感词典计算文本的情感极性(正 ...

  8. python自定义函数画图_利用Python绘图和可视化(长文慎入)

    Python有许多可视化工具,但是我主要讲解matplotlib(http://matplotlib.sourceforge.net).此外,还可以利用诸如d3.js(http://d3js.org/ ...

  9. python连接opencv库_利用Python和OpenCV库将URL转换为OpenCV格式的方法

    今天的博客是直接来源于我自己的个人工具函数库. 过去几个月,有些PyImageSearch读者电邮问我:"如何获取URL指向的图片并将其转换成OpenCV格式(不用将其写入磁盘再读回)&qu ...

最新文章

  1. WP8.1学习系列(第十二章)——全景控件Panorama开发指南
  2. 递归查找具有特定扩展名的文件
  3. python快速编程入门课本第六章_python编程快速上手第六章实践项目参考code
  4. python什么是数据结构_python算法与数据结构-数据结构介绍(38)
  5. 基于zeromq的高性能分布式RPC框架Zerorpc 性能测试
  6. 关于OPENCV 访问外部传进来的Mat矩阵元素的问题
  7. python新浪股票接口_新浪股票数据接口
  8. 让我康康,是谁进了 Hack for wuhan 初赛?
  9. python中关于__new__和__init__的个人理解
  10. “不死鸟”号历险记---和扫雷过不去篇(无厘头版)
  11. 学习记录-app渗透
  12. 【渗透测试笔记】之【免杀工具——ScareCrow】
  13. 怎么把html文档转换成wps,怎么把wps文档转换成word文档
  14. 显卡1060和1660测试对比
  15. 如何为服务器配置路由协议,服务器如何配置路由
  16. 计算机机本科最高学历,我国的“最高学历”是什么?博士后不是正确答案,别再无知了...
  17. 【面试题目】你有12个硬币,其中有一个的重量与其他的不一样,有三次使用测量平衡的机会来找出重量不同的那个。该怎么做呢?
  18. java zip 读取_java读取zip (含压缩包内的文件)
  19. 老笔记本电脑机械500GB升级固态1T
  20. FRP内网穿透映射本地内网80端口到云服务器

热门文章

  1. 【机器学习】——学术英语
  2. Web版简易加法计算
  3. 如何在php中定义按钮,ppt中怎么插入自定义动作按钮
  4. GPU图形绘制管线(一)
  5. python 对于程序异常的处理
  6. 【Excel VBA】神操作之命名单元格或区域(三)——遍历所有已命名区域名称及删除命名方法
  7. 操作系统---60分专用
  8. 计算机原理19秋期末考核,南开大学作业《计算机原理》19秋期末考核解析100
  9. 云管理平台:9大开源云管理平台(CMP)
  10. 现在普通家用计算机的运算速度,中国目前运算速度最快的计算机