python爬虫程序下载_Python爬虫之多线程下载程序类电子书
近段时间,笔者发现一个神奇的网站:http://www.allitebooks.com/ ,该网站提供了大量免费的编程方面的电子书,是技术爱好者们的福音。其页面如下:
![](https://images2018.cnblogs.com/blog/1219272/201806/1219272-20180606210130947-1510322589.png)
那么我们是否可以通过Python来制作爬虫来帮助我们实现自动下载这些电子书呢?答案是yes.
笔者在空闲时间写了一个爬虫,主要利用urllib.request.urlretrieve()函数和多线程来下载这些电子书。
首先呢,笔者的想法是先将这些电子书的下载链接网址储存到本地的txt文件中,便于永久使用。其Python代码(Ebooks_spider.py)如下, 该代码仅下载第一页的10本电子书作为示例:
```Python
# -*- coding:utf-8 -*-
# 本爬虫用来下载http://www.allitebooks.com/中的电子书
# 本爬虫将需要下载的书的链接写入txt文件,便于永久使用
# 网站http://www.allitebooks.com/提供编程方面的电子书
导入必要的模块
import urllib.request
from bs4 import BeautifulSoup
获取网页的源代码
def get_content(url):
html = urllib.request.urlopen(url)
content = html.read().decode('utf-8')
html.close()
return content
将762个网页的网址储存在list中
base_url = 'http://www.allitebooks.com/'
urls = [base_url]
for i in range(2, 762):
urls.append(base_url + 'page/%d/' % i)
电子书列表,每一个元素储存每本书的下载地址和书名
book_list =[]
控制urls的数量,避免书下载过多导致空间不够!!!
本例只下载前3页的电子书作为演示
读者可以通过修改url[:3]中的数字,爬取自己想要的网页书,最大值为762
for url in urls[:1]:
try:
# 获取每一页书的链接
content = get_content(url)
soup = BeautifulSoup(content, 'lxml')
book_links = soup.find_all('div', class_="entry-thumbnail hover-thumb")
book_links = [item('a')[0]['href'] for item in book_links]
print('\nGet page %d successfully!' % (urls.index(url) + 1))
except Exception:
book_links = []
print('\nGet page %d failed!' % (urls.index(url) + 1))
# 如果每一页书的链接获取成功
if len(book_links):
for book_link in book_links:
# 下载每一页中的电子书
try:
content = get_content(book_link)
soup = BeautifulSoup(content, 'lxml')
# 获取每本书的下载网址
link = soup.find('span', class_='download-links')
book_url = link('a')[0]['href']
# 如果书的下载链接获取成功
if book_url:
# 获取书名
book_name = book_url.split('/')[-1]
print('Getting book: %s' % book_name)
book_list.append(book_url)
except Exception as e:
print('Get page %d Book %d failed'
% (urls.index(url) + 1, book_links.index(book_link)))
文件夹
directory = 'E:\Ebooks\'
将书名和链接写入txt文件中,便于永久使用
with open(directory+'book.txt', 'w') as f:
for item in book_list:
f.write(str(item)+'\n')
print('写入txt文件完毕!')
可以看到,上述代码主要爬取的是静态页面,因此效率非常高!运行该程序,显示结果如下:
![](https://img-blog.csdn.net/20180606140520353?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2pjbGlhbjkx/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)
在book.txt文件中储存了这10本电子书的下载地址,如下:
![](https://img-blog.csdn.net/2018060614064249?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2pjbGlhbjkx/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)
接着我们再读取这些下载链接,用urllib.request.urlretrieve()函数和多线程来下载这些电子书。其Python代码(download_ebook.py)如下:
-- coding:utf-8 --
本爬虫读取已写入txt文件中的电子书的链接,并用多线程下载
import time
from concurrent.futures import ThreadPoolExecutor, wait, ALL_COMPLETED
import urllib.request
利用urllib.request.urlretrieve()下载PDF文件
def download(url):
# 书名
book_name = 'E:\Ebooks\'+url.split('/')[-1]
print('Downloading book: %s'%book_name) # 开始下载
urllib.request.urlretrieve(url, book_name)
print('Finish downloading book: %s'%book_name) #完成下载
def main():
start_time = time.time() # 开始时间
file_path = 'E:\\Ebooks\\book.txt' # txt文件路径
# 读取txt文件内容,即电子书的链接
with open(file_path, 'r') as f:
urls = f.readlines()
urls = [_.strip() for _ in urls]
# 利用Python的多线程进行电子书下载
# 多线程完成后,进入后面的操作
executor = ThreadPoolExecutor(len(urls))
future_tasks = [executor.submit(download, url) for url in urls]
wait(future_tasks, return_when=ALL_COMPLETED)
# 统计所用时间
end_time = time.time()
print('Total cost time:%s'%(end_time - start_time))
main()
运行上述代码,结果如下:
![](https://img-blog.csdn.net/20180606140906158?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2pjbGlhbjkx/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)
再去文件夹中查看文件:
![](https://img-blog.csdn.net/20180606141000106?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2pjbGlhbjkx/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)
可以看到这10本书都已成功下载,总共用时327秒,每本书的平均下载时间为32.7,约半分钟,而这些书的大小为87.7MB,可见效率相当高的!
怎么样,看到爬虫能做这些多有意思的事情,不知此刻的你有没有心动呢?心动不如行动,至理名言~~
本次代码已上传github, 地址为: https://github.com/percent4/Examples-of-Python-Spiders .
***注意:***本人现已开通两个微信公众号: 用Python做数学(微信号为:python_math)以及轻松学会Python爬虫(微信号为:easy_web_scrape), 欢迎大家关注哦~~
python爬虫程序下载_Python爬虫之多线程下载程序类电子书相关推荐
- python爬虫多线程下载_Python爬虫之多线程下载豆瓣Top250电影图片
爬虫项目介绍 本次爬虫项目将爬取豆瓣Top250电影的图片,其网址为:https://movie.douban.com/top250, 具体页面如下图所示: 本次爬虫项目将分别不使用多线程和使用多线程 ...
- 爬虫python教程百度云_Python爬虫比较基础的教程视频百度云网盘下载
Python爬虫比较基础的教程视频百度云网盘下载,目录如下,给编程的朋友学习吧,请大家支持正版! QQ截图20180719110859.jpg (12.41 KB, 下载次数: 27) 2018-7- ...
- python爬虫开发与项目实战pdf下载_python爬虫开发与项目实战PDF高清文档下载
随着大数据时代到来,网络信息量也变得更多更大,基于传统搜索引擎的局限性,网络爬虫应运而生,本书从基本的爬虫原理开始讲解,通过介绍Pthyon编程语言和Web前端基础知识引领读者入门,之后介绍动态爬虫原 ...
- python爬虫开发环境_python爬虫开发教程下载|Python爬虫开发与项目实战(范传辉 著)pdf 完整版_ - 极光下载站...
Python爬虫开发与项目实战pdf扫描版下载.Python爬虫开发是一个Pthyon编程语言与HTML基础知识引领读者入门知识,重点讲述了云计算的相关内容及其在爬虫中的应用,进而介绍如何设计自己的爬 ...
- python爬虫爬取网易云音乐下载_Python爬虫实践-网易云音乐!没有版权又如何!照样爬取!...
1.前言 最近,网易的音乐很多听不到了,刚好也看到很多教程,跟进学习了一下,也集大全了吧,本来想优化一下的,但是发现问题还是有点复杂,最后另辟捷径,提供了简单的方法啊! 本文主要参考 python编写 ...
- python爬虫防屏蔽_python爬虫程序如何预防被限制
有一些网站不喜欢被爬虫程序访问,所以会检测连接对象,如果是爬虫程序,也就是非人点击访问,它就会不让你继续访问,所以为了要让程序可以正常运行,需要隐藏自己的爬虫程序的身份.此时,我们就可以通过设置Use ...
- python爬虫csdn里下载_python爬虫搭配起Bilibili唧唧的流程分析
前言 最近需要大规模下载B站视频,同时要将下载好的视频用BV号进行重命名,最后上传至服务器.这个工作一开始我是完全手工完成的,通过游猴来下载,可是下载几十个视频还好,再多一点的话真是太烦了,而且生产力 ...
- python 微盘下载_Python爬虫——百度+新浪微盘下载歌曲
# -*- coding: utf-8 -*- """ Created on Mon Aug 7 09:22:12 2017 @author: JClian " ...
- python爬虫面试问题_Python爬虫面试总结
## Python爬虫面试总结 1. 写一个邮箱地址的正则表达式? [A-Za-z0-9\u4e00-\u9fa5]+@[a-zA-Z0-9_-]+(\.[a-zA-Z0-9_-]+)+$ 2. 谈 ...
最新文章
- hi3559a100解码
- Spring Boot-@EnableWebMvc注解
- javascript 之 面向对象【理解对象】
- Windows Phone Developer Tools 下载地址
- 服务器皮肤在哪个文件里,服务器怎么使用皮肤
- JavaScript中不得不说的断言?
- 微软中国职位[北京工作]
- LeetCode 1319. 连通网络的操作次数(BFS/DFS/并查集)
- CAN笔记(9) 位填充
- Java讲课笔记16:内部类
- S5PV210体系结构与接口06:串口编程
- 互不相识的人在什么情况下会给你点赞呢?
- VS2015 自动代码补全
- 类型转化异常 Java Object转 int
- 常用分辨率、帧率、码率
- Java ini文件读写修改配置内容以及使用org.dtools.javaini-v1.1.00.jar中文乱码
- C++接口实现汉字拼音转换
- 网页内嵌编辑器ueditor的使用
- 如何将图一-1变成图1-1(word题注的大写变成小写)
- 《剑指offer》内容总结
热门文章
- castle典范英语 storm_典范英语4阶 17 castle adventure(点读)
- LeetCode 737.My Calendar III
- BZOJ1180 [CROATIAN2009]OTOCI
- 便利的html5 之 required、number 、pattern
- 程序动态切片技术研究
- 今日指数项目之需求调研【三】
- 《Adobe After Effects CS6中文版经典教程》——1.2 创建项目并导入素材
- SpringCloud Feign 源码底层如何调用Ribbon实现服务调用的负载均衡
- BillGates要走了,微软将继续前进
- datediff函数,计算两个日期之间的天数\月数\年数