我用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中常用的各种数据库操作模块和连接实例
May 29 Python
python socket 超时设置 errno 10054
Jul 01 Python
Python入门篇之列表和元组
Oct 17 Python
python中sleep函数用法实例分析
Apr 29 Python
Python验证码识别的方法
Jul 10 Python
Python实现的人工神经网络算法示例【基于反向传播算法】
Nov 11 Python
对python3中pathlib库的Path类的使用详解
Oct 14 Python
对python3.4 字符串转16进制的实例详解
Jun 12 Python
Django框架创建项目的方法入门教程
Nov 04 Python
基于python使用tibco ems代码实例
Dec 20 Python
python如何使用jt400.jar包代码实例
Dec 20 Python
Python绘制词云图之可视化神器pyecharts的方法
Feb 23 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引用(&)各种使用方法实例详解
2014/03/20 PHP
PHP实现HTTP断点续传的方法
2015/06/17 PHP
PHP数组去重比较快的实现方式
2016/01/19 PHP
PHP使用curl_multi_select解决curl_multi网页假死问题的方法
2018/08/15 PHP
PHP实现微信退款的方法示例
2019/03/26 PHP
Thinkphp5.0 框架的请求方式与响应方式分析
2019/10/14 PHP
javascript编程起步(第六课)
2007/02/27 Javascript
JavaScript类和继承 constructor属性
2010/03/04 Javascript
js二维数组排序的简单示例代码
2014/01/24 Javascript
js在IE与firefox的差异集锦
2014/11/11 Javascript
完美实现bootstrap分页查询
2015/12/09 Javascript
AngularJS实现的select二级联动下拉菜单功能示例
2017/10/25 Javascript
layui结合form,table的全选、反选v1.0示例讲解
2018/08/15 Javascript
vux-scroller实现移动端上拉加载功能过程解析
2019/10/08 Javascript
全面解析JavaScript Module模式
2020/07/24 Javascript
vue 项目引入echarts 添加点击事件操作
2020/09/09 Javascript
Python 网络编程起步(Socket发送消息)
2008/09/06 Python
Python设计模式之工厂模式简单示例
2018/01/09 Python
python利用百度AI实现文字识别功能
2018/11/27 Python
pyecharts绘制中国2020肺炎疫情地图的实例代码
2020/02/12 Python
Pytorch mask_select 函数的用法详解
2020/02/18 Python
python opencv 检测移动物体并截图保存实例
2020/03/10 Python
轻松制作精彩视频:Animoto
2018/09/19 全球购物
C语言面试题
2015/10/30 面试题
请编写一个 C 函数,该函数在给定的内存区域搜索给定的字符,并返回该字符所在位置索引值
2014/09/15 面试题
计算机专业大学生的自我评价
2013/11/14 职场文书
行政管理毕业生自荐信
2014/02/24 职场文书
环保宣传标语
2014/06/12 职场文书
社会实践活动总结范文
2014/07/03 职场文书
大一新生期末自我评价
2014/09/12 职场文书
车间主任岗位职责范本
2015/04/08 职场文书
普通员工辞职信范文
2015/05/12 职场文书
投资入股协议书
2016/03/22 职场文书
MongoDB数据库的安装步骤
2021/06/18 MongoDB
JavaScript数组 几个常用方法总结
2021/11/11 Javascript
Python 操作pdf pdfplumber读取PDF写入Exce
2022/08/14 Python