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