摘要:其頁面如下那么我們是否可以通過來制作爬蟲來幫助我們實現(xiàn)自動下載這些電子書呢答案是筆者在空閑時間寫了一個爬蟲,主要利用函數(shù)和多線程來下載這些電子書。
??近段時間,筆者發(fā)現(xiàn)一個神奇的網(wǎng)站:http://www.allitebooks.com/ ,該網(wǎng)站提供了大量免費的編程方面的電子書,是技術(shù)愛好者們的福音。其頁面如下:
??那么我們是否可以通過Python來制作爬蟲來幫助我們實現(xiàn)自動下載這些電子書呢?答案是yes.
??筆者在空閑時間寫了一個爬蟲,主要利用urllib.request.urlretrieve()函數(shù)和多線程來下載這些電子書。
??首先呢,筆者的想法是先將這些電子書的下載鏈接網(wǎng)址儲存到本地的txt文件中,便于永久使用。其Python代碼(Ebooks_spider.py)如下, 該代碼僅下載第一頁的10本電子書作為示例:
# -*- coding:utf-8 -*- # 本爬蟲用來下載http://www.allitebooks.com/中的電子書 # 本爬蟲將需要下載的書的鏈接寫入txt文件,便于永久使用 # 網(wǎng)站http://www.allitebooks.com/提供編程方面的電子書 # 導入必要的模塊 import urllib.request from bs4 import BeautifulSoup # 獲取網(wǎng)頁的源代碼 def get_content(url): html = urllib.request.urlopen(url) content = html.read().decode("utf-8") html.close() return content # 將762個網(wǎng)頁的網(wǎng)址儲存在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的數(shù)量,避免書下載過多導致空間不夠!!! # 本例只下載前3頁的電子書作為演示 # 讀者可以通過修改url[:3]中的數(shù)字,爬取自己想要的網(wǎng)頁書,最大值為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(" Get page %d successfully!" % (urls.index(url) + 1)) except Exception: book_links = [] print(" Get 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") # 獲取每本書的下載網(wǎng)址 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)+" ") print("寫入txt文件完畢!")
可以看到,上述代碼主要爬取的是靜態(tài)頁面,因此效率非常高!運行該程序,顯示結(jié)果如下:
在book.txt文件中儲存了這10本電子書的下載地址,如下:
??接著我們再讀取這些下載鏈接,用urllib.request.urlretrieve()函數(shù)和多線程來下載這些電子書。其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:Ebooksook.txt" # txt文件路徑 # 讀取txt文件內(nèi)容,即電子書的鏈接 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) # 統(tǒng)計所用時間 end_time = time.time() print("Total cost time:%s"%(end_time - start_time)) main()
運行上述代碼,結(jié)果如下:
再去文件夾中查看文件:
可以看到這10本書都已成功下載,總共用時327秒,每本書的平均下載時間為32.7,約半分鐘,而這些書的大小為87.7MB,可見效率相當高的!
??怎么樣,看到爬蟲能做這些多有意思的事情,不知此刻的你有沒有心動呢?心動不如行動,至理名言~~
??本次代碼已上傳github, 地址為: https://github.com/percent4/E... .
注意:本人現(xiàn)已開通兩個微信公眾號: 用Python做數(shù)學(微信號為:python_math)以及輕松學會Python爬蟲(微信號為:easy_web_scrape), 歡迎大家關(guān)注哦~~
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/41827.html
摘要:本次爬蟲項目將會用到模塊中的類,多線程豆瓣電影圖片??偨Y(jié)通過上述兩個爬蟲程序的對比,我們不難發(fā)現(xiàn),同樣是下載豆瓣電影,個網(wǎng)頁中的圖片,在沒有使用多線程的情況下,總共耗時約,而在使用多線程個線程的情況下,總共耗時約秒,效率整整提高了約倍。 爬蟲項目介紹 ??本次爬蟲項目將爬取豆瓣Top250電影的圖片,其網(wǎng)址為:https://movie.douban.com/top250, 具體頁面如...
摘要:本次分享將在此基礎(chǔ)上,利用多線程,提高程序運行的效率。思路本次分享建立在博客爬蟲之下載中電影的圖片上,總體的爬蟲思路沒有變化,只是在此基礎(chǔ)上引入多線程。 介紹 ??在博客:Java爬蟲之下載IMDB中Top250電影的圖片中我們實現(xiàn)了利用Java爬蟲來下載圖片,但是效率不算太高。本次分享將在此基礎(chǔ)上,利用多線程,提高程序運行的效率。 思路 ??本次分享建立在博客Java爬蟲之下載IMD...
摘要:時間永遠都過得那么快,一晃從年注冊,到現(xiàn)在已經(jīng)過去了年那些被我藏在收藏夾吃灰的文章,已經(jīng)太多了,是時候把他們整理一下了。那是因為收藏夾太亂,橡皮擦給設(shè)置私密了,不收拾不好看呀。 ...
摘要:下載器負責獲取頁面,然后將它們交給引擎來處理。內(nèi)置了一些下載器中間件,這些中間件將在后面介紹。下載器中間件下載器中間件可以在引擎和爬蟲之間操縱請求和響應對象。爬蟲中間件與下載器中間件類似,啟用爬蟲中間件需要一個字典來配置。 前段時間我寫了一篇《scrapy快速入門》,簡單介紹了一點scrapy的知識。最近我的搬瓦工讓墻了,而且我又學了一點mongodb的知識,所以這次就來介紹一些scr...
閱讀 2014·2021-11-15 11:38
閱讀 2048·2019-08-30 15:55
閱讀 2182·2019-08-30 15:52
閱讀 3167·2019-08-30 14:01
閱讀 2684·2019-08-30 12:47
閱讀 1129·2019-08-29 13:17
閱讀 1062·2019-08-26 13:55
閱讀 2629·2019-08-26 13:46