我用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 time模块用法实例详解
Sep 11 Python
Python UnicodeEncodeError: 'gbk' codec can't encode character 解决方法
Apr 24 Python
Python实现简单遗传算法(SGA)
Jan 29 Python
详解Python中的动态属性和特性
Apr 07 Python
python正则表达式之对号入座篇
Jul 24 Python
在Python中将函数作为另一个函数的参数传入并调用的方法
Jan 22 Python
python实现通过flask和前端进行数据收发
Aug 22 Python
tesserocr与pytesseract模块的使用方法解析
Aug 30 Python
Python实现图片批量加入水印代码实例
Nov 30 Python
python pprint模块中print()和pprint()两者的区别
Feb 10 Python
python将音频进行变速的操作方法
Apr 08 Python
Pyside2中嵌入Matplotlib的绘图的实现
Feb 22 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进程同步代码实例
2015/02/12 PHP
PHP使用curl模拟post上传及接收文件的方法
2016/03/04 PHP
给moz-firefox下添加IE方法和属性
2007/04/10 Javascript
javascript+css 网页每次加载不同样式的实现方法
2009/12/27 Javascript
JavaScript之引用类型介绍
2012/08/10 Javascript
鼠标移动到图片名上,显示图片的简单实例
2013/07/14 Javascript
javascript用户注册提示效果的简单实例
2013/08/17 Javascript
Javascript倒计时页面跳转实例小结
2013/09/11 Javascript
jquery 页面滚动到指定DIV实现代码
2013/09/25 Javascript
jQuery的attr与prop使用介绍
2013/10/10 Javascript
javascript中数组array及string的方法总结
2014/11/28 Javascript
checkbox批量选中,获取选中项的值的简单实例
2016/06/28 Javascript
浅析ES6的八进制与二进制整数字面量
2016/08/30 Javascript
js中利用cookie实现记住密码功能
2020/08/20 Javascript
详解nodejs的express如何自动生成项目框架
2017/07/12 NodeJs
JavaScript中的一些隐式转换和总结(推荐)
2017/12/22 Javascript
vue 实现在函数中触发路由跳转的示例
2018/09/01 Javascript
react脚手架如何配置less和ant按需加载的方法步骤
2018/11/28 Javascript
JS实现点星星消除小游戏
2020/03/24 Javascript
[02:28]DOTA2英雄基础教程 狼人
2013/12/23 DOTA
[03:00]DOTA2-DPC中国联赛1月18日Recap集锦
2021/03/11 DOTA
Python实现把utf-8格式的文件转换成gbk格式的文件
2015/01/22 Python
在Python中处理字符串之isdecimal()方法的使用
2015/05/20 Python
解析Python的缩进规则的使用
2019/01/16 Python
Django基础知识 web框架的本质详解
2019/07/18 Python
初次部署django+gunicorn+nginx的方法步骤
2019/09/11 Python
Django模型中字段属性choice使用说明
2020/03/30 Python
Agoda香港:全球特价酒店预订
2017/05/07 全球购物
阿波罗盒子:Apollo Box
2017/08/14 全球购物
信息部岗位职责
2013/11/12 职场文书
制药工程专业个人求职自荐信
2014/01/25 职场文书
房屋维修协议书范本
2014/09/25 职场文书
工会积极分子个人总结
2015/03/03 职场文书
2015年“世界无车日”活动方案
2015/05/06 职场文书
SQL注入篇学习之盲注/宽字节注入
2022/03/03 MySQL
python缺失值填充方法示例代码
2022/12/24 Python