我用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基于隐马尔可夫模型实现中文拼音输入
Apr 01 Python
Python获取当前公网ip并自动断开宽带连接实例代码
Jan 12 Python
python将字符串以utf-8格式保存在txt文件中的方法
Oct 30 Python
对Python中TKinter模块中的Label组件实例详解
Jun 14 Python
Python-Tkinter Text输入内容在界面显示的实例
Jul 12 Python
Python抓新型冠状病毒肺炎疫情数据并绘制全国疫情分布的代码实例
Feb 05 Python
Python爬虫程序架构和运行流程原理解析
Mar 09 Python
python 通过邮件控制实现远程控制电脑操作
Mar 16 Python
Python CSS选择器爬取京东网商品信息过程解析
Jun 01 Python
Django CBV模型源码运行流程详解
Aug 17 Python
Python在后台自动解压各种压缩文件的实现方法
Nov 10 Python
python中Pexpect的工作流程实例讲解
Mar 02 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 图像尺寸调整代码
2010/05/26 PHP
php下统计用户在线时间的一种尝试
2010/08/26 PHP
Ping服务的php实现方法,让网站快速被收录
2012/02/04 PHP
PHP程序漏洞产生的原因分析与防范方法说明
2014/03/06 PHP
在Mac OS上自行编译安装Apache服务器和PHP解释器
2015/12/24 PHP
PHP+Ajax 检测网络是否正常实例详解
2016/12/16 PHP
PHP4和PHP5版本下解析XML文档的操作方法实例分析
2017/05/20 PHP
PHP开发之归档格式phar文件概念与用法详解【创建,使用,解包还原提取】
2017/11/17 PHP
php给数组赋值的实例方法
2019/09/26 PHP
laravel利用中间件做防非法登录和权限控制示例
2019/10/21 PHP
javascript中的取反再取反~~没有意义
2014/04/06 Javascript
原生JS实现拖拽图片效果
2020/08/27 Javascript
微信小程序 支付简单实例及注意事项
2017/01/06 Javascript
nodejs 终端打印进度条实例代码
2017/04/22 NodeJs
JavaScript实现带有子菜单和控件的slider轮播图效果
2017/11/01 Javascript
Java设计中的Builder模式的介绍
2018/03/22 Javascript
浅谈webpack4.x 入门(一篇足矣)
2018/09/05 Javascript
D3.js(v3)+react 实现带坐标与比例尺的柱形图 (V3版本)
2019/05/09 Javascript
详解Vue之事件处理
2020/07/10 Javascript
Python面向对象之继承代码详解
2018/01/29 Python
Python命令行解析模块详解
2018/02/01 Python
python opencv之SURF算法示例
2018/02/24 Python
tensorflow 打印内存中的变量方法
2018/07/30 Python
python实现一个简单的udp通信的示例代码
2019/02/01 Python
python3反转字符串的3种方法(小结)
2019/11/07 Python
解决阿里云邮件发送不能使用25端口问题
2020/08/07 Python
Python在线和离线安装第三方库的方法
2020/10/31 Python
pandas数据分组groupby()和统计函数agg()的使用
2021/03/04 Python
Artist Guitars新西兰:乐器在线商店
2017/09/17 全球购物
比利时买床:Beter Bed
2017/12/06 全球购物
银行实习人员自我鉴定
2013/09/22 职场文书
校园主题婚礼活动策划方案
2014/09/15 职场文书
2014年为民办实事工作总结
2014/12/20 职场文书
英文投诉信格式
2015/07/03 职场文书
MySQL中VARCHAR与CHAR格式数据的区别
2021/05/26 MySQL
使用HBuilder制作一个简单的HTML5网页
2022/07/07 HTML / CSS