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

某天,水群的时候发现群友发了一个文件,里面是疫情时期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在线编辑器,下次试试在那写完再导入知乎。

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

  1. python爬虫网页中的图片_Python爬虫爬取一个网页上的图片地址实例代码

    本文实例主要是实现爬取一个网页上的图片地址,具体如下. 读取一个网页的源代码: import urllib.request def getHtml(url): html=urllib.request. ...

  2. python 批量下载网页图片_手把手教你爬取天堂网1920*1080大图片(批量下载)——实战篇|python基础教程|python入门|python教程...

    https://www.xin3721.com/eschool/pythonxin3721/ /1 前言/ 上篇文章 手把手教你爬取天堂网1920*1080大图片(批量下载)--理论篇我们谈及了天堂网 ...

  3. python豆瓣电影top250爬虫课程设计_[教程]图文:爬虫爬取豆瓣电影top250

    window环境下 使用python脚本爬取豆瓣 环境安装 python python开发环境 jupyter python web IDE requests python requests模块用于向 ...

  4. python 网页编程_通过Python编程检索网页

    python 网页编程 The internet and the World Wide Web (WWW), is probably the most prominent source of info ...

  5. python网页版_经典python学习教程:20行代码打造一个微信群聊助手,解放双手

    今天的Python学习教程教大家如何用20行Python代码实现微信群聊助手,可以用来活跃群气氛,好多群主创建完群后,拉完一群人,之后就一片寂静,有个群聊助手,就可以帮忙活跃群里气氛,通过今天在自己的 ...

  6. python手机壁纸超清_python爬虫 爬取超清壁纸代码实例

    简介 壁纸的选择其实很大程度上能看出电脑主人的内心世界,有的人喜欢风景,有的人喜欢星空,有的人喜欢美女,有的人喜欢动物.然而,终究有一天你已经产生审美疲劳了,但你下定决定要换壁纸的时候,又发现网上的壁 ...

  7. qt爬取网页信息_豆瓣TOP250数据爬取

    一.问题描述 用python爬取网页数据是现在流行的一种快速获取数据的方法,简单快捷.最近小编通过教程学习完成了豆瓣TOP250数据的爬取.下面就简单介绍一下如何用python程序实现豆瓣网页信息的爬 ...

  8. beautifulsoup爬取网页中的表格_Python爬虫爬取BT之家找电影资源

    一.写在前面 最近看新闻说圣城家园(SCG)倒了,之前BT天堂倒了,暴风影音也不行了,可以说看个电影越来越费力,国内大厂如企鹅和爱奇艺最近也出现一些幺蛾子,虽然目前版权意识虽然越来越强,但是很多资源在 ...

  9. python requests 重定向_认识Python最最最常用语重要的库Requests

    Requests库是Python爬虫中最最最最最最重要与常见的库,一定要熟练掌握它.下面我们来认识这个库 Requests requests是Python最为常用的http请求库,也是极其简单的.使用 ...

最新文章

  1. 一文读懂最近流行的CNN架构(附学习资料)
  2. [Linux]Shell的运算符和特殊变量
  3. 线上学python哪家好-广州学Python学校哪家好
  4. 网页开发中文本编辑器UEditor的使用
  5. GPS服务端解析程序编写日记
  6. ionic2 mac android,Ionic制作Hybrid App系列二:Mac环境下Ionic release版本APK的签名与发布...
  7. 【Linux】Linux服务器(centos7)环境搭建java/python3/nginx
  8. 【Python3 SelectKBest 调用personer出现的错误】
  9. jQuery实现的向下推送图文信息滚动效果
  10. 驯服 Tiger: 并发集合
  11. Linux命令:find命令
  12. NYOJ 138 找球号(二) (哈希)
  13. Windows Server2012R2文件服务器安装与配置
  14. 安徽省计算机二级水平考试试卷,2010安徽省全国计算机等级考试二级笔试试卷VB试题及答案...
  15. 走进“开源SDR实验室” 一起玩转4G/5G开源项目srsRAN(srsLTE升级版):安装方法+NB-IoT测试
  16. siamRPN论文理解与复现
  17. Qt摄像头热插拔实现
  18. chcp 437>nul graftabl 936>nul
  19. 一篇让你弄明白C语言指针传参和数组传参~
  20. 数字时代,企业如何选择适合自己的转型平台?

热门文章

  1. IonQ与现代汽车合作:用量子计算促进汽车电池创新
  2. 数家私募拟收购惠普企业 金额或达400亿美元
  3. 本地环境搭建织梦网站
  4. 绿金业绩评价居行业“第一梯队” ,农业银行绿色金融实践入选《中国银行业绿色金融发展报告》
  5. php hs256加密,JWT签名算法中HS256和RS256有什么区别
  6. Go:goroutine线程池 ants 简介与实践
  7. 数学计算器App上线
  8. 6、用户加入房间、离开房间提示
  9. 新用户创作打卡挑战赛第三期获奖名单
  10. 魔力宝贝/石器时代 图档格式压缩算法