国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

Python爬蟲之多線程下載程序類電子書

walterrwu / 1490人閱讀

摘要:其頁面如下那么我們是否可以通過來制作爬蟲來幫助我們實現(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

相關(guān)文章

  • Python爬蟲之多線程下載豆瓣Top250電影圖片

    摘要:本次爬蟲項目將會用到模塊中的類,多線程豆瓣電影圖片??偨Y(jié)通過上述兩個爬蟲程序的對比,我們不難發(fā)現(xiàn),同樣是下載豆瓣電影,個網(wǎng)頁中的圖片,在沒有使用多線程的情況下,總共耗時約,而在使用多線程個線程的情況下,總共耗時約秒,效率整整提高了約倍。 爬蟲項目介紹 ??本次爬蟲項目將爬取豆瓣Top250電影的圖片,其網(wǎng)址為:https://movie.douban.com/top250, 具體頁面如...

    shiyang6017 評論0 收藏0
  • Java爬蟲之多線程下載IMDB中Top250電影的圖片

    摘要:本次分享將在此基礎(chǔ)上,利用多線程,提高程序運行的效率。思路本次分享建立在博客爬蟲之下載中電影的圖片上,總體的爬蟲思路沒有變化,只是在此基礎(chǔ)上引入多線程。 介紹 ??在博客:Java爬蟲之下載IMDB中Top250電影的圖片中我們實現(xiàn)了利用Java爬蟲來下載圖片,但是效率不算太高。本次分享將在此基礎(chǔ)上,利用多線程,提高程序運行的效率。 思路 ??本次分享建立在博客Java爬蟲之下載IMD...

    wujl596 評論0 收藏0
  • 首次公開,整理12年積累的博客收藏夾,零距離展示《收藏夾吃灰》系列博客

    摘要:時間永遠都過得那么快,一晃從年注冊,到現(xiàn)在已經(jīng)過去了年那些被我藏在收藏夾吃灰的文章,已經(jīng)太多了,是時候把他們整理一下了。那是因為收藏夾太亂,橡皮擦給設(shè)置私密了,不收拾不好看呀。 ...

    Harriet666 評論0 收藏0
  • Python

    摘要:最近看前端都展開了幾場而我大知乎最熱語言還沒有相關(guān)。有關(guān)書籍的介紹,大部分截取自是官方介紹。但從開始,標準庫為我們提供了模塊,它提供了和兩個類,實現(xiàn)了對和的進一步抽象,對編寫線程池進程池提供了直接的支持。 《流暢的python》閱讀筆記 《流暢的python》是一本適合python進階的書, 里面介紹的基本都是高級的python用法. 對于初學python的人來說, 基礎(chǔ)大概也就夠用了...

    dailybird 評論0 收藏0
  • scrapy 進階使用

    摘要:下載器負責獲取頁面,然后將它們交給引擎來處理。內(nèi)置了一些下載器中間件,這些中間件將在后面介紹。下載器中間件下載器中間件可以在引擎和爬蟲之間操縱請求和響應對象。爬蟲中間件與下載器中間件類似,啟用爬蟲中間件需要一個字典來配置。 前段時間我寫了一篇《scrapy快速入門》,簡單介紹了一點scrapy的知識。最近我的搬瓦工讓墻了,而且我又學了一點mongodb的知識,所以這次就來介紹一些scr...

    The question 評論0 收藏0

發(fā)表評論

0條評論

walterrwu

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<