我用Python抓取了7000 多本电子书案例详解


Posted in Python onMarch 25, 2019

安装

安装很简单,只要执行:

pip install requests-html

就可以了。

分析页面结构

通过浏览器审查元素可以发现这个电子书网站是用 WordPress 搭建的,首页列表元素很简单,很规整

我用Python抓取了7000 多本电子书案例详解

所以我们可以查找 .entry-title > a 获取所有图书详情页的链接,接着我们进入详情页,来寻找下载链接,由下图

我用Python抓取了7000 多本电子书案例详解

可以发现 .download-links > a 里的链接就是该书的下载链接,回到列表页可以发现该站一共 700 多页,由此我们便可以循环列表获取所有的下载链接。

Requests-html 快速指南

发送一个 GET 请求:

from requests_html import HTMLSession
session = HTMLSession()
 
r = session.get('https://python.org/')

Requests-html 的方便之处就是它解析 html 方式就像使用 jQuery 一样简单,比如:

# 获取页面的所有链接可以这样写:
r.html.links
# 会返回 {'//docs.python.org/3/tutorial/', '/about/apps/'}
 
# 获取页面的所有的绝对链接:
r.html.absolute_links
# 会返回 {'https://github.com/python/pythondotorg/issues', 'https://docs.python.org/3/tutorial/'}
 
# 通过 CSS 选择器选择元素:
about = r.find('.about', first=True)
# 参数 first 表示只获取找到的第一元素
about.text # 获取 .about 下的所有文本
about.attrs # 获取 .about 下所有属性像 id, src, href 等等
about.html # 获取 .about 的 HTML
about.find('a') # 获取 .about 下的所有 a 标签

构建代码

from requests_html import HTMLSession
import requests
import time
import json
import random
import sys
 
'''
想要学习Python?Python学习交流群:984632579满足你的需求,资料都已经上传群文件,可以自行下载!
'''
 
session = HTMLSession()
list_url = 'http://www.allitebooks.com/page/'
 
USER_AGENTS = [
  "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_3) AppleWebKit/535.20 (KHTML, like Gecko) Chrome/19.0.1036.7 Safari/535.20",
  "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1180.71 Safari/537.1 LBBROWSER",
  "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.84 Safari/535.11 LBBROWSER",
  "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; WOW64; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E)",
  "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; QQDownload 732; .NET4.0C; .NET4.0E)",
  "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Trident/4.0; SV1; QQDownload 732; .NET4.0C; .NET4.0E; 360SE)",
  "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; QQDownload 732; .NET4.0C; .NET4.0E)",
  "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1180.89 Safari/537.1",
  "Mozilla/5.0 (iPad; U; CPU OS 4_2_1 like Mac OS X; zh-cn) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8C148 Safari/6533.18.5",
  "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:2.0b13pre) Gecko/20110307 Firefox/4.0b13pre",
  "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:16.0) Gecko/20100101 Firefox/16.0",
  "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.64 Safari/537.11",
  "Mozilla/5.0 (X11; U; Linux x86_64; zh-CN; rv:1.9.2.10) Gecko/20100922 Ubuntu/10.10 (maverick) Firefox/3.6.10"
]
 
# 获取当前列表页所有图书链接
def get_list(url):
  response = session.get(url)
  all_link = response.html.find('.entry-title a') # 获取页面所有图书详情链接
  for link in all_link:
    getBookUrl(link.attrs['href'])
 
# 获取图书下载链接
def getBookUrl(url):
  response = session.get(url)
  l = response.html.find('.download-links a', first=True)
  if l is not None: # 运行后发现有的个别页面没有下载链接,这里加个判断
    link = l.attrs['href'];
    download(link)
 
#下载图书
def download(url):
  # 随机浏览器 User-Agent
  headers={ "User-Agent":random.choice(USER_AGENTS) }
  # 获取文件名
  filename = url.split('/')[-1]
  # 如果 url 里包含 .pdf
  if ".pdf" in url:
    file = 'book/'+filename # 文件路径写死了,运行时当前目录必须有名 book 的文件夹
    with open(file, 'wb') as f:
      print("正在下载 %s" % filename)
      response = requests.get(url, stream=True, headers=headers)
      
      # 获取文件大小
      total_length = response.headers.get('content-length')
      # 如果文件大小不存在,则直接写入返回的文本
      if total_length is None: 
        f.write(response.content)
      else:
        # 下载进度条
        dl = 0
        total_length = int(total_length) # 文件大小
        for data in response.iter_content(chunk_size=4096): # 每次响应获取 4096 字节
          dl += len(data)
          f.write(data)
          done = int(50 * dl / total_length)
          sys.stdout.write("\r[%s%s]" % ('=' * done, ' ' * (50-done)) ) # 打印进度条  
          sys.stdout.flush()
 
      print(filename + '下载完成!')
 
if __name__ == '__main__':
  #从这运行,应为知道列表总数,所以偷个懒直接开始循环
  for x in range(1,756):
    print('当前页面: '+ str(x))
    get_list(list_url+str(x))

运行效果:

我用Python抓取了7000 多本电子书案例详解

以上所述是小编给大家介绍的我用Python抓取了7000 多本电子书案例详解整合,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Python 相关文章推荐
Python字典简介以及用法详解
Nov 15 Python
Python字典操作详细介绍及字典内建方法分享
Jan 04 Python
Python使用pydub库对mp3与wav格式进行互转的方法
Jan 10 Python
Python基于opencv实现的简单画板功能示例
Mar 04 Python
Python学习笔记之抓取某只基金历史净值数据实战案例
Jun 03 Python
Python多进程方式抓取基金网站内容的方法分析
Jun 03 Python
python标记语句块使用方法总结
Aug 05 Python
基于django ManyToMany 使用的注意事项详解
Aug 09 Python
Django框架反向解析操作详解
Nov 28 Python
在python image 中实现安装中文字体
May 16 Python
Python制作一个仿QQ办公版的图形登录界面
Sep 22 Python
Python打包exe时各种异常处理方案总结
May 18 Python
详解python:time模块用法
Mar 25 #Python
Python minidom模块用法示例【DOM写入和解析XML】
Mar 25 #Python
Python实例方法、类方法、静态方法的区别与作用详解
Mar 25 #Python
详解Python装饰器
Mar 25 #Python
详解用python自制微信机器人,定时发送天气预报
Mar 25 #Python
Python3.5实现的三级菜单功能示例
Mar 25 #Python
使用Django简单编写一个XSS平台的方法步骤
Mar 25 #Python
You might like
yii的CURD操作实例详解
2014/12/04 PHP
THinkPHP获取客户端IP与IP地址查询的方法
2016/11/14 PHP
利用PHPExcel实现Excel文件的写入和读取
2017/04/26 PHP
js的alert样式如何更改如背景颜色
2014/01/22 Javascript
JS判断移动端访问设备并加载对应CSS样式
2014/06/13 Javascript
JS+CSS模拟可以无刷新显示内容的留言板实例
2015/03/03 Javascript
基于AngularJS+HTML+Groovy实现登录功能
2016/02/17 Javascript
js自定义select下拉框美化特效
2016/05/12 Javascript
用jquery快速解决IE输入框不能输入的问题
2016/10/04 Javascript
浅谈Node.js:理解stream
2016/12/08 Javascript
ES6新增数据结构WeakSet的用法详解
2017/08/07 Javascript
详解.vue文件中监听input输入事件(oninput)
2017/09/19 Javascript
Angular表格神器ui-grid应用详解
2017/09/29 Javascript
Node使用Selenium进行前端自动化操作的代码实现
2019/10/10 Javascript
js实现简单掷骰子小游戏
2019/10/24 Javascript
vue 路由守卫(导航守卫)及其具体使用
2020/02/25 Javascript
Jquery滑动门/tab切换实现方法完整示例
2020/06/05 jQuery
解决python大批量读写.doc文件的问题
2018/05/08 Python
Python实现字典(dict)的迭代操作示例
2018/06/05 Python
对python 匹配字符串开头和结尾的方法详解
2018/10/27 Python
Python+OpenCV采集本地摄像头的视频
2019/04/25 Python
python绘制随机网络图形示例
2019/11/21 Python
tensorboard实现同时显示训练曲线和测试曲线
2020/01/21 Python
如何使用python代码操作git代码
2020/02/29 Python
简单了解如何封装自己的Python包
2020/07/08 Python
荷兰多品牌网上鞋店:Stoute Schoenen
2017/08/24 全球购物
味多美官网:蛋糕订购,100%使用天然奶油
2017/11/10 全球购物
澳大利亚一站式数码相机商店:CameraPro
2020/03/09 全球购物
小学生防溺水广播稿
2014/01/12 职场文书
《九寨沟》教学反思
2014/04/08 职场文书
保护环境建议书300字
2014/05/13 职场文书
思想纪律作风整顿剖析材料
2014/10/11 职场文书
护士工作心得体会
2016/01/25 职场文书
新手入门Jvm-- JVM对象创建与内存分配机制
2021/06/18 Java/Android
MySQL快速插入一亿测试数据
2021/06/23 MySQL
Python之matplotlib绘制折线图
2022/04/13 Python