Python爬虫之多线程下载程序类电子书
近段时间,笔者发现一个神奇的网站:http://www.allitebooks.com/ ,该网站提供了大量免费的编程方面的电子书,是技术爱好者们的福音。其页面如下:
那么我们是否可以通过Python来制作爬虫来帮助我们实现自动下载这些电子书呢?答案是yes.
笔者在空闲时间写了一个爬虫,主要利用urllib.request.urlretrieve()函数和多线程来下载这些电子书。
首先呢,笔者的想法是先将这些电子书的下载链接网址储存到本地的txt文件中,便于永久使用。其Python代码(Ebooks_spider.py)如下, 该代码仅下载第一页的10本电子书作为示例:
# -*- 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文件完毕!')
可以看到,上述代码主要爬取的是静态页面,因此效率非常高!运行该程序,显示结果如下:
在book.txt文件中储存了这10本电子书的下载地址,如下:
接着我们再读取这些下载链接,用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()
运行上述代码,结果如下:
再去文件夹中查看文件:
可以看到这10本书都已成功下载,总共用时327秒,每本书的平均下载时间为32.7,约半分钟,而这些书的大小为87.7MB,可见效率相当高的!
怎么样,看到爬虫能做这些多有意思的事情,不知此刻的你有没有心动呢?心动不如行动,至理名言~~
本次代码已上传github, 地址为: https://github.com/percent4/Examples-of-Python-Spiders .
注意:本人现已开通两个微信公众号: 用Python做数学(微信号为:python_math)以及轻松学会Python爬虫(微信号为:easy_web_scrape), 欢迎大家关注哦~~

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
-
上一篇
vue.js之获取当前点击对象
vue.js之获取当前点击对象(其实是套着vue的原生javascript吧,笑?) 转载请注明出处:http://www.cnblogs.com/meng1314-shuai/p/7455575.html 熟悉jquery的小伙伴应该都知道jquery获取当前点击对象是有多么的粗暴,直接$(dom)获取当前点击的dom元素,根据这个,几乎可以获取这个dom元素的所有属性。不过,当我们使用vue的时候呢? 也许刚开始会有一点迷茫。唉?对啊,我用vue该怎么做到(屠龙宝刀)点击就送…哦不,点击就能获取到我点击的是哪一个元素对象呢?其实很简单,vue.js,它不照样是javascript么,我们也是可以通过点击事件来传递$event事件的。 我们来看一下javascript文档上有关event标准属性的介绍: 属性 描述 bubbles 返回布尔值,指示事件是否是起泡事件类型。 cancelable 返回布尔值,指示事件是否可拥可取消的默认动作。 currentTarget 返回其事件监听器触发该事件的元素。 eventPhase 返回事件传播的当前阶段。 target 返回触发此事件的元...
-
下一篇
网站安全检测服务之PHP代码的后台绕过登录漏洞
针对于PHP代码的开发的网站,最近在给客户做网站安全检测的同时,大大小小的都会存在网站的后台管理页面被绕过并直接登录后台的漏洞,而且每个网站的后台被绕过的方式都不一样,根据SINE安全渗透测试多年来经验,来总结一下网站后台绕过的一些详情,以及该如何去防范后台被绕过,做好网站的安全部署。 后台验证码缺乏安全验证 比如在axublog程序中,网站后台存在一个验证管理员登录的一个函数chkadcookie()。但是在网站后台的ad/art.php中并没有chkadcookie()此验证函数,因而就造成了普通访问条用户可以越权访问。这种漏洞的原理也比较简单,一般情况下是经验不足的开发者漏掉了验证函数。Sine安全公司是一家专注于:服务器安全、网站安全、网站安全检测、网站漏洞修复,渗透测试,安全服务于一体的网络安全服务提供商。 后台验证代码没有做到绝对的安全验证 axublog后台验证函数绕过 后台登录的验证方式 在axublog中的后台验证函数是chkadcookie(),代码如下图所示: 通过对网站代码的详细安全检测,发现了问题中只有$date我们是无法知道,而UA和REM...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
- CentOS6,CentOS7官方镜像安装Oracle11G
- Dcoker安装(在线仓库),最新的服务器搭配容器使用
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- SpringBoot2全家桶,快速入门学习开发网站教程
- CentOS7,8上快速安装Gitea,搭建Git服务器
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- CentOS关闭SELinux安全模块