亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

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

walterrwu / 1548人閱讀

摘要:其頁(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

相關(guān)文章

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

    摘要:本次爬蟲項(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è)面如...

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

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

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

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

    Harriet666 評(píng)論0 收藏0
  • Python

    摘要:最近看前端都展開了幾場(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ǔ)大概也就夠用了...

    dailybird 評(píng)論0 收藏0
  • scrapy 進(jìn)階使用

    摘要:下載器負(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...

    The question 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

walterrwu

|高級(jí)講師

TA的文章

閱讀更多
最新活動(dòng)
閱讀需要支付1元查看
<