我用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微信企业号开发之回调模式接收微信端客户端发送消息及被动返回消息示例
Aug 21 Python
Python正则匹配判断手机号是否合法的方法
Dec 09 Python
在Python 中实现图片加框和加字的方法
Jan 26 Python
详解python中sort排序使用
Mar 23 Python
pandas基于时间序列的固定时间间隔求均值的方法
Jul 04 Python
Pytorch 实现冻结指定卷积层的参数
Jan 06 Python
如何使用python传入不确定个数参数
Feb 18 Python
Python计算IV值的示例讲解
Feb 28 Python
利用pipenv和pyenv管理多个相互独立的Python虚拟开发环境
Nov 01 Python
快速创建python 虚拟环境
Nov 28 Python
详解Python描述符的工作原理
Jun 11 Python
分析Python list操作为什么会错误
Nov 17 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
在PHP中读取和写入WORD文档的代码
2008/04/09 PHP
Ha0k 0.3 PHP 网页木马修改版
2009/10/11 PHP
php设计模式 Strategy(策略模式)
2011/06/26 PHP
PHP中的流(streams)浅析
2015/07/02 PHP
PHP使用pear自带的mail类库发邮件的方法
2015/07/08 PHP
php对xml文件的增删改查操作实现方法分析
2017/05/19 PHP
JavaScript Event学习第七章 事件属性
2010/02/07 Javascript
jquery阻止后续事件只执行第一个事件
2014/07/24 Javascript
Javascript学习笔记之函数篇(六) : 作用域与命名空间
2014/11/23 Javascript
js创建对象的方式总结
2015/01/10 Javascript
javascript弹出拖动窗口
2015/08/11 Javascript
js实现div拖动动画运行轨迹效果代码分享
2015/08/27 Javascript
jQuery 更改checkbox的状态,无效的解决方法
2016/07/22 Javascript
JS库 Highlightjs 添加代码行号的实现代码
2017/09/13 Javascript
JS实现点击li标签弹出对应的索引功能【案例】
2019/02/18 Javascript
在Uni中使用Vue的EventBus总线机制操作
2020/07/31 Javascript
ant design vue中日期选择框混合时间选择器的用法说明
2020/10/27 Javascript
使用python 获取进程pid号的方法
2014/03/10 Python
Python中无限元素列表的实现方法
2014/08/18 Python
Python内置的HTTP协议服务器SimpleHTTPServer使用指南
2016/03/30 Python
Python学习pygal绘制线图代码分享
2017/12/09 Python
zookeeper python接口实例详解
2018/01/18 Python
使用 Python 实现微信群友统计器的思路详解
2018/09/26 Python
python psutil模块使用方法解析
2019/08/01 Python
kafka监控获取指定topic的消息总量示例
2019/12/23 Python
Python求区间正整数内所有素数之和的方法实例
2020/10/13 Python
python tkinter的消息框模块(messagebox,simpledialog)
2020/11/07 Python
Python 删除List元素的三种方法remove、pop、del
2020/11/16 Python
使用 CSS3 中@media 实现网页自适应的示例代码
2020/03/24 HTML / CSS
应届生财务管理求职信
2013/11/06 职场文书
中专毕业生个人职业生涯规划
2014/02/19 职场文书
国际商务专业求职信
2014/07/15 职场文书
教师作风整顿个人剖析材料
2014/10/10 职场文书
2014年保洁员工作总结
2014/11/19 职场文书
2016年共产党员公开承诺书
2016/03/24 职场文书
python-opencv 中值滤波{cv2.medianBlur(src, ksize)}的用法
2021/06/05 Python