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.pswp.cn/news/539209.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/539209.shtml
英文地址,請注明出處:http://en.pswp.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中的表數據 外部表 只有一個過程,加載數據和創建表同時完成,并不會移動到數據倉庫目錄中,只是與外部數據建立一個鏈接。當刪除一個 外部表 時&…