我用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 相关文章推荐
Windows系统配置python脚本开机启动的3种方法分享
Mar 10 Python
Python的socket模块源码中的一些实现要点分析
Jun 06 Python
Python按行读取文件的实现方法【小文件和大文件读取】
Sep 19 Python
Python pass详细介绍及实例代码
Nov 24 Python
python XlsxWriter模块创建aexcel表格的实例讲解
May 03 Python
使用Python抓取豆瓣影评数据的方法
Oct 17 Python
Python创建字典的八种方式
Feb 27 Python
Python实现的插入排序,冒泡排序,快速排序,选择排序算法示例
May 04 Python
Python3 sys.argv[ ]用法详解
Oct 24 Python
python OpenCV GrabCut使用实例解析
Nov 11 Python
Python map及filter函数使用方法解析
Aug 06 Python
利用python清除移动硬盘中的临时文件
Oct 28 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获得url参数中具有&的值的方法
2014/03/05 PHP
PHP获取文件相对路径的方法
2015/02/26 PHP
PHP多态代码实例
2015/06/26 PHP
php阿拉伯数字转中文人民币大写
2015/12/21 PHP
Laravel 5.5官方推荐的Nginx配置学习教程
2017/10/06 PHP
php记录搜索引擎爬行记录的实现代码
2018/03/02 PHP
$()JS小技巧
2007/07/21 Javascript
JSON 数据格式介绍
2012/01/13 Javascript
原生js和jQuery写的网页选项卡特效对比
2015/04/27 Javascript
jQuery实现点击按钮弹出可关闭层的浮动层插件
2015/09/19 Javascript
JS 判断某变量是否为某数组中的一个值的3种方法(总结)
2017/07/10 Javascript
JS常见DOM节点操作示例【创建 ,插入,删除,复制,查找】
2018/05/14 Javascript
Vue头像处理方案小结
2018/07/26 Javascript
Node.js系列之连接DB的方法(3)
2019/08/30 Javascript
Vue 实现创建全局组件,并且使用Vue.use() 载入方式
2020/08/11 Javascript
Vue实现导航栏菜单
2020/08/19 Javascript
[06:07]DOTA2-DPC中国联赛 正赛 Ehome vs VG 选手采访
2021/03/11 DOTA
Python实现多行注释的另类方法
2014/08/22 Python
python实现统计代码行数的方法
2015/05/22 Python
Django框架模板文件使用及模板文件加载顺序分析
2019/05/23 Python
python实现文件的分割与合并
2019/08/29 Python
Python 异常处理Ⅳ过程图解
2019/10/18 Python
python中sympy库求常微分方程的用法
2020/04/28 Python
将pymysql获取到的数据类型是tuple转化为pandas方式
2020/05/15 Python
基于Python编写一个计算器程序,实现简单的加减乘除和取余二元运算
2020/08/05 Python
CSS3实现大小不一的粒子旋转加载动画
2016/04/21 HTML / CSS
印尼最大的婴儿用品购物网站:Orami
2017/09/28 全球购物
Rentalcars.com中国:世界上最大的在线汽车租赁服务
2019/08/22 全球购物
程序员机试试题汇总
2012/03/07 面试题
数控专业毕业生求职信范文
2013/09/21 职场文书
供货协议书
2014/04/22 职场文书
2014年人事部工作总结
2014/12/03 职场文书
贷款承诺书
2015/01/20 职场文书
师范生小学见习总结
2015/06/23 职场文书
完美处理python与anaconda环境变量的冲突问题
2021/04/07 Python
Java常用函数式接口总结
2021/06/29 Java/Android