網路爬蟲: 從allitebooks.com抓取書籍信息並從amazon.com抓取價格(2): 抓取allitebooks.com書籍信息及ISBN碼

来源:http://www.cnblogs.com/sirkevin/archive/2016/08/18/5783748.html
-Advertisement-
Play Games

這一篇首先從allitebooks.com里抓取書籍列表的書籍信息和每本書對應的ISBN碼。 一、分析需求和網站結構 allitebooks.com這個網站的結構很簡單,分頁+書籍列表+書籍詳情頁。 要想得到書籍的詳細信息和ISBN碼,我們需要遍歷所有的頁碼,進入到書籍列表,然後從書籍列表進入到每本 ...



這一篇首先從allitebooks.com里抓取書籍列表的書籍信息和每本書對應的ISBN碼。
一、分析需求和網站結構
allitebooks.com這個網站的結構很簡單,分頁+書籍列表+書籍詳情頁。 要想得到書籍的詳細信息和ISBN碼,我們需要遍歷所有的頁碼,進入到書籍列表,然後從書籍列表進入到每本書的詳情頁里,這樣就能夠抓取詳情信息和ISBN碼了。
二、從分頁里遍歷每一頁書籍列表
通過查看分頁功能的HTML代碼,通過class="current"可以定位當前頁碼所在span標簽,此span標簽的下一個兄弟a標簽就是下一頁鏈接所在的標簽, 而通過對比最後一頁的span可以發現,在最後一頁中,通過class="current"找到的span標簽卻沒有下一個兄弟a標簽。所以我們可以通過這一點判斷出是否已經到最後一頁了。代碼如下:
# Get the next page url from the current page url
def get_next_page_url(url):
    page = urlopen(url)
    soup_page = BeautifulSoup(page, 'lxml')
    page.close()
    # Get current page and next page tag
    current_page_tag = soup_page.find(class_="current")
    next_page_tag = current_page_tag.find_next_sibling()
    # Check if the current page is the last one
    if next_page_tag is None:
        next_page_url = None
    else:
        next_page_url = next_page_tag['href']
    return next_page_url

 

三、從書籍列表裡找到詳情頁的鏈接
在書籍列表點擊書名或者封面圖都可以進入詳情,則書名和封面圖任選一個,這裡選擇書名。

  我們可以通過查找class="entry-title"定位到書名所在的h2標簽,然後通過此標簽的a屬性即可獲得鏈接所在的a標簽,再通過a標簽的string屬性可得到鏈接。 代碼如下:
# Get the book detail urls by page url
def get_book_detail_urls(url):
    page = urlopen(url)
    soup = BeautifulSoup(page, 'lxml')
    page.close()
    urls = []
    book_header_tags = soup.find_all(class_="entry-title")
    for book_header_tag in book_header_tags:
        urls.append(book_header_tag.a['href'])
    return urls

 

四、從書籍詳情頁里抓取標題和ISBN碼
    通過查看書籍詳情頁的HTML代碼,我們可以通過查找class="single-title"定位到標題所在的h1標簽獲得標題,然後通過查找text="Isbn:"定位到"Isbn:"的所在的dt標簽,此標簽的下一個兄弟節點就是書籍ISBN碼所在的標簽,通過此標簽的string屬性可獲得ISBN碼內容。 代碼如下:
# Get the book detail info by book detail url
def get_book_detail_info(url):
    page = urlopen(url)
    book_detail_soup = BeautifulSoup(page, 'lxml')
    page.close()
    title_tag = book_detail_soup.find(class_="single-title")
    title = title_tag.string
    isbn_key_tag = book_detail_soup.find(text="Isbn:").parent
    isbn_tag = isbn_key_tag.find_next_sibling()
    isbn = isbn_tag.string.strip() # Remove the whitespace with the strip method
    return { 'title': title, 'isbn': isbn }

 

五、將三部分代碼整合起來
def run():
    url = "http://www.allitebooks.com/programming/net/page/1/"
    book_info_list = []
    def scapping(page_url):
        book_detail_urls = get_book_detail_urls(page_url)
        for book_detail_url in book_detail_urls:
            # print(book_detail_url)
            book_info = get_book_detail_info(book_detail_url)
            print(book_info)
            book_info_list.append(book_info)
        next_page_url = get_next_page_url(page_url)
        if next_page_url is not None:
            scapping(next_page_url)
        else:
            return

    scapping(url)

 

運行結果


六、將結果寫入文件,以供下一步處理使用
def save_to_csv(list):
    with open('books.csv', 'w', newline='') as fp:
        a = csv.writer(fp, delimiter=',')
        a.writerow(['title','isbn'])
        a.writerows(list)

 

未完待續... 

完整代碼請移步github:https://github.com/backslash112/book_scraper_python Beautiful Soup基礎知識:網路爬蟲: 從allitebooks.com抓取書籍信息並從amazon.com抓取價格(1): 基礎知識Beautiful Soup 我們處於大數據時代,對數據處理感興趣的朋友歡迎查看另一個系列隨筆:利用Python進行數據分析 基礎系列隨筆彙總   接下來一篇隨筆是根據獲取到的ISBN碼去amazon.com網站獲取每本書對應的價格,並通過數據分析的知識對獲取的數據進行處理,最後輸出到csv文件。有興趣的朋友歡迎關註本博客,也歡迎大家留言討論。
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 直接貼代碼吧,很簡單的代碼 自我感覺效率很低,多線程先不談,每次調用socket.create_connection((ip,port),2)都會創建一個對象,這很影響效率。 ...
  • 首先需要下載jdk: 由於oracle上的下載頁面有跳轉,直接用wget下載下來的只是html頁面。可以用下麵的命令: wget --no-cookies --no-check-certificate --header "Cookie: gpw_e24=http%3A%2F%2Fwww.oracle ...
  • 本節內容和前節事件管理封裝是息息相關的,本節內容主要包含的代碼在connection{.h, .cc}中。 這裡面最主要的有兩個類:connection類和tcpsconn類,connetion類主要服務於單個套接字,包括套接字上的數據讀取寫入等,而tcpsconn類則是服務於套接字集合,如接收連接 ...
  • 已知有n個單位的水,問有幾種方式把這些水喝完,每天至少喝1個單位的水,而且每天喝的水的單位為整數。看上去挺複雜要跑迴圈,但其實上,列舉幾種情況之後就會發現是找規律的題了= =都是2的n-1次方,而且這題輸出二進位數就行了......那就更簡單了,直接輸出1,然後後面跟n-1個0就行了╮(╯_╰)╭ ...
  • ...
  • 1:過濾器概念 過濾器就是一種在請求目標資源的中間組件,比喻把污水轉換成純凈水中間需要一個污水凈化設備,那麼這個設備就好比一個過濾器。那麼我用圖來表示過濾器(可以有多個過濾器)運行的過程 2:Filter(過濾器)介面 Filter介面包含三個方法分別是init、doFilter、 destroy下 ...
  • //從鍵盤錄入學生信息(僅姓名和成績)並輸出。public class StuInformation {//此處命名用StuScore可能更恰當 String name; double score;}import java.util.Scanner; A_zhi 2016.08.18.22.00 ...
  • 電腦的發展歷史 電腦的學名叫電腦,電腦是用來做計算的。在古時候,人們最早使用的計算工具可能是手指,英文單詞“digit”既有“數字”的意思,又有“手指“的意思。古人用石頭打獵,所以還有可能是石頭來輔助計算。 缺點:手指和石頭太低效了 後來出現了”結繩 “記事。 缺點:結繩慢,繩子還有長度限制。 又 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...