python 网页重定向_小试牛刀:python爬虫爬取springer开放电子书.

首先声明,本文旨在记录反思,并没有资源,代码也不具有借鉴意义(水平实在不行.

某天,水群的时候发现群友发了一个文件,里面是疫情时期springer开放的免费电子书名单,同时还附有下载链接,总共有400多本,这要是一个一个下载不得累死个人,只下载自己感兴趣的书也是一个好主意,但是,我全都要,它不爽吗?

因此就产生了写个爬虫下载电子书的想法,就在今天付诸于实践.

最初思路:

1.读取excel文件中所有书籍的链接,放在列表类中.

2.格式化列表中的链接,然后依次访问链接,提取下载pdf的链接地址.

3.将下载pdf的链接地址批量加入到迅雷的下载任务中.

理想很丰满,然而实际操作起来……

步骤1:首先网上bing如何读取excel文件中的数据。然后复制、黏贴、修改……

import xlrd
def get_bookurl_list(site):book = xlrd.open_workbook(site)sheet1 = book.sheet()[0] #第一张工作表urls = sheet1.col(18) #书籍地址在第18列所以里面也就是18urls = urls[1:] #去除第一行的列名 #xlrd库读出来的excel每一个小格都是一个cell类,cell.value才是真正的数据return urls

然鹅最初的思路在第二步就出现了问题……

我虽然可以用requests库访问网址,但是我找不到下载pdf的链接在哪里(虽然我看得见,也点的了(笑,但是在运行程序的时候我无法指定程序返回那个链接,也就是说,我无法操作爬虫返回指定的内容。

于是我打算直接返回网页内全部链接,然后我找到了一个更加傻瓜式的库——requests-html。里面的HTMLSession类有返回网页内所有链接绝对路径的方法。结果还是行不通,因为返回来的链接数量超出了我的预料,这还不算,更加致命的是,书记的页面还包含相关书籍的部分章节,单从链接上看基本没区别,更难顶的是,这书居然还能分章节下载。

这条路也行不通,我的心态发生了一些变化……

就在这时我发现,pdf下载地址和网页地址高度相似,而且具备确定的对应关系。但是问题也很明显,就是excel里给的地址是重定向了的,真正的地址只有进入网页才能获得。

但是总归有办法了,问题就在于重定向,只要我能获得进入页面的链接,就能够得到pdf的下载地址。

那么步骤2就变成了……网上bing如何获得重定向后的网页地址。复制黏贴修改……

import requests
def get_redirect_url(url):# 获得重定向前的链接#url = "重定向前的url"# 请求头,这里我设置了浏览器代理headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36'}# 请求网页response = requests.get(url,headers)print(response.status_code)  # 打印响应的状态码print(response.url)  # 打印重定向后的网址# 返回重定向后的网址return response.url

好了,现在我得到了原本的网站链接,经过一些修改就可以加入到迅雷下载了。

具体修改放到最后的总函数里,这里就先搁置,然后找到python调用迅雷加入下载任务的方法

然后步骤3:bingpython如何使用迅雷下载……复制黏贴修改……

from win32com.client import Dispatch #这都是啥玩意儿,咱也不知道,咱也不敢问
def thunderDownload(urls): #处理后网址的列表thunder = Dispatch('ThunderAgent.Agent.1') #这个也可以试试'ThunderAgent.Agent64.1',反正我错了(笑for i in urls:thunder.AddTask(i)thunder.CommitTasks()

最后的总函数:

def url_process(urls):list1 = []num = 0for i in urls:url = i.value #i为cell类,i.value是真正的数据url = get_redirect_url(url) #调用之前的函数,获得原本的网页链接。url1 = url.replace('book', 'content/pdf')url1 = url1 + '.pdf' #这两行都是对原来网址的处理,处理之后就可以加入迅雷下载啦。list1.append(url1)print(urls.index(i))if len(list1)>5: #本来预想的是每5个就加入迅雷下载任务,没想到我还是太年轻了。thunderDownload(list1)list1 = []num += 1print(num)

至此,爬虫程序基本的框架就完成了。

然鹅,实际运行也是一塌糊涂……动不动就超时,以及来自库里的报错……

我尝试加了一个监测程序运行时间,超时就跳进下一个循环的功能

然鹅……程序总是动不动就瘫痪

开始请求接口
开始执行
请求完成
请求超时
开始请求接口
开始执行
请求完成
请求超时
开始请求接口
开始执行

这是我添加双线程时间控制程序后……

所以最后的优化是,添加一个功能,超时跳入下一个循环。

尝试使用eventlet,加monkey_patch()方法后报错。

于是使用threading库,增加返回值

import threadingclass MyThread(threading.Thread):def __init__(self, target, args=()): #目标函数super(MyThread, self).__init__()self.func = targetself.args = argsdef run(self):#接收返回值self.result = self.func(*self.args)def get_result(self):#线程不结束,返回值为Nonetry:return self.resultexcept Exception:return Nonedef limit_decor(limit_time): #限制真实请求时间的装饰器def functions(func):def run(*params):thre_func = MyThread(target=func,args=params)#主线程结束(超出时长),则线程方法结束thre_func.setDaemon(True)thre_func.start()#计算分段沉睡次数(?sleep_num = int(limit_time // 1)sleep_nums = round(limit_time % 1, 1)#多次短暂沉睡并尝试获取返回值for i in range(sleep_num):time.sleep(1)infor = thre_func.get_result()if infor:return infortime.sleep(sleep_nums)#最终返回值if thre_func.get_result():return thre_func.get_result()else:return "请求超时"return runreturn functionsdef a1(url):print('开始请求接口')#把逻辑封装成一个函数,使用线程调用a_theadiing = MyThread(target=a2,args=url)a_theadiing.start()a_theadiing.join()a = a_theadiing.get_result()print("请求完成")print(a)return a,a_theadiing.result@limit_decor(300) #将时长限制为5分钟,def a2(url):print("开始执行")url = get_redirect_url(url)print("执行完成")return url

修改后的总函数:

def url_process(urls):list1 = []num = 0for i in urls:url = i.value#url = get_redirect_url(url)url = a1([url])[1]if url == "请求超时": continueelse:url1 = url.replace('book', 'content/pdf')url1 = url1 + '.pdf'list1.append(url1)print(urls.index(i))if len(list1)>2:thunderDownload(list1)list1 = []num += 1print(num)

运行还算差强人意,主要也受到网络状态的影响。

最后,请不要吐槽我的代码可读性(笑,当然也欢迎大佬给出建议。

还有就是知乎这个鬼排版,找到了个markdown在线编辑器,下次试试在那写完再导入知乎。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/539209.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

直面桌面云带来的现状优势

在桌面云解决方案里,首先,所有的数据以及运算都在服务器端进行,客户端只是显示其变化的影像而已,所以在不需要担心客户端来非法窃取资料,我们在电影里面看到的商业间谍拿着 U 盘疯狂的拷贝公司商业机密的情况再也不会出…

ORA-28001: the password has expired解决方法

Oracle提示错误消息ORA-28001: the password has expired,是由于Oracle11G的新特性所致, Oracle11G创建用户时缺省密码过期限制是180天(即6个月), 如果超过180天用户密码未做修改则该用户无法登录。 Oracle公司是为了数…

.net 导出excel_Qt编写的项目作品18-数据导出到Excel及Pdf和打印数据

一、功能特点原创导出数据机制,不依赖任何office组件或者操作系统等第三方库,尤其是支持嵌入式linux。10万行数据9个字段只需要2秒钟完成。只需要四个步骤即可开始急速导出大量数据到Excel。同时提供直接写入数据接口和多线程写入数据接口,不…

hive数据库定义

默认数据库"default" 可以显式切换数据库:hive> use 数据库名; 创建 hive>CREATE DATABASE [IF NOT EXISTS] mydb [LOCATION] /....... [COMMENT] ....; 实例 hive (default)> create database test_db comment test database; OK Ti…

图像增强_Keras 常用的图像增强方式

欢迎关注 “小白玩转Python”,发现更多 “有趣”在使用神经网络和深度学习模型时,需要进行数据准备。对于更复杂的物体识别任务,也越来越需要增加数据量。数据增加意味着增加数据量。换句话说,拥有更大的数据集意味着更健壮的模型…

Facebook产品经理的三年叙事与协作思考

产品经理和研发工程师的关系经常被大家调侃,可偏偏就有同时受到研发和设计都喜欢的“别人家的产品经理”,沟通协调、对接需求、项目把控面面俱到还有好人缘。有没有人天生就是产品经理?产品经理的工作就是写需求写需求和写需求么?…

sis新地址_坚若磐石不掉速,老平台升级新选择,入手昱联Asint 500G SSD

我是文章的原作者,文章首发于:什么值得买爱折腾的老狐狸​zhiyou.smzdm.com首发文章链接:坚若磐石不掉速,老平台升级新选择,入手昱联Asint 500G SSD _值客原创_什么值得买​post.smzdm.com虽然说,现在越来越…

hive表定义(3种方式)

创建表 方式一 建表语法 CREATE [EXTERNAL] TABLE [IF NOT EXISTS] table_name [(col_name data_type [COMMENT col_comment], ...)] [COMMENT table_comment] [PARTITIONED BY (col_name data_type [COMMENT col_comment], ...)] [CLUSTERED BY (col_name, col_name, ..…

进度条设置_为你的练习设置进度条

在我们的日常练习中,遇到最多的一个问题就是不知道自己练得怎么样了?还需不需要继续,或者调整练习方法。这种问题大多出现在自学吉他的学生当中,因为得不到老师的反馈,自己练得对不对,够不够,都…

Python之路(第二篇):Python基本数据类型字符串(一)

一、基础1、编码 UTF-8:中文占3个字节 GBK:中文占2个字节 Unicode、UTF-8、GBK三者关系 ascii码是只能表示英文字符,用8个字节表示英文,unicode是统一码,世界通用码,规定采用2个字节对世界各地不同文字进行编码&#x…

python ftp下载文件_文件上传下载Python

点击上方蓝字关注我!图片来源 pexels.com简单实现文件上传、下载1 Server端 # -*- coding: utf-8 -*-import jsonimport os__author__ sange# Time : 2020/8/17 下午5:26# Author : sange# File : tcpserver_socket.py# Software: PyCharmimport socketserv…

hive列定义

修改 列的名称、类型、位置、注释 hive>ALTER TABLE t3 CHANGE COLUMN old_name new_name String [COMMENT ...] [AFTER column2]; 实例 hive (zmgdb)> alter table t1 change column car sarly int after office; FAILED: Execution Error, return code 1 from org.a…

react json转换_Typescript + React 新手篇

极链科技前端工程师茅丹丹前言 TS是什么Type Type (标准JS)。TS的官方网站:Type is a typed superset of Java that compiles to plain Java。Type是一个编译到纯JS的有类型定义的JS超集。 TS优点 TS 最大的优势是它提供了强大的静态分析能力,结合 TSL…

android listview 滑动条显示_第七十六回:Android中UI控件之RecyclerView基础

各位看官们,大家好,上一回中咱们说的是Android中UI控件之ListView优化的例子,这一回咱们说的例子是UI控件之RecyclerView。闲话休提,言归正转。让我们一起Talk Android吧!看官们,我们在前面章回中介绍了Lis…

数据建模大数据就业挑战月薪30K

点击关注 异步图书,置顶公众号每天与你分享 IT好书 技术干货 职场知识本文大概 10624 字读完共需 30 分钟Tips 参与文末话题讨论,即有机会获得异步图书一本。数据建模是对现实世界各类数据进行抽象组织、界定数据库需管辖的范围、确定数据的组织形式等直…

Hive的数据模型-管理表

概述 管理表,也称作内部表,受控表。 所有的 Table 数据(不包括 External Table)都保存在warehouse这个目录中。 删除表时,元数据与数据都会被删除。 在加载数据的过程中,实际数据会被移动到数据仓库目录中&#xff1b…

mft按钮设计_火力发电厂典型MFT逻辑控制实现.pdf

火力发电厂典型MFT逻辑控制实现.pdf火力发电厂典型MFT逻辑控制实现刘文丰 陈思铭湖南省电力试验研究院 (湖南长沙410007)摘要:以金竹山电厂扩建工程国产2600MW亚临界机组为例,概述了必力发电厂FSSS中典型MFT的原理及重要性,详细介绍各MFT条件…

oracle schema_oracle数据库全局统计更新

--oracle数据库优化 替换用户名 user,在该用户下执行begindbms_stats.gather_schema_stats(ownname >USER,options > GATHER,estimate_percent > dbms_stats.auto_sample_size,method_opt > for all columns size skewonly,degree > 7 );end;————…

python操作三大主流数据库(12)python操作redis的api框架redis-py简单使用

python操作三大主流数据库(12)python操作redis的api框架redis-py简单使用 redispy安装安装及简单使用:https://github.com/andymccurdy/redis-pyapi参考文档:http://redis-py.readthedocs.io/en/latest/ 1.安装redis-py pip install redis C:\Users\ajie…

Hive的数据模型-外部表

概述 包含External 的表叫外部表 删除外部表只删除metastore的元数据,不删除hdfs中的表数据 外部表 只有一个过程,加载数据和创建表同时完成,并不会移动到数据仓库目录中,只是与外部数据建立一个链接。当删除一个 外部表 时&…