Python透過requests和BeautifulSoup套件的搭配,可以輕易地下載並分析一些格式安排地還滿不錯的網頁,例如今天要操作的對象博客來網路書店的圖書暢銷榜就是其中的一個很好分析的例子,只要觀察網站原始碼,就可以很快地找到想要取得的目標標籤,然後再透過Beautiful的find函數設定,就可以抓下來了。以下就是程式碼:

import requests
from bs4 import BeautifulSoup

res = requests.get("http://www.books.com.tw/web/sys_saletopb/books/19/?loc=P_002_020")
soup = BeautifulSoup(res.text, 'lxml')
books = soup.find_all('div', {'class':'type02_bd-a'})
rank_no=1
for book in books:
    print("第{}名".format(rank_no))
    print("書名:" + book.h4.a.text)
    print("作者:" + book.li.a.text)
    print("----------")
    rank_no = rank_no + 1

下圖則是抓取30日暢銷書的書名與作者之執行結果畫面:

我們也可以把這段程式碼變成副程式,變化其它的應用。如下所示的程式例,就是透過副程式以及特定作者的比對,找出在30日和7日暢銷榜中某個特定的作者在這兩個榜上的書以及名次:

import requests
from bs4 import BeautifulSoup

def show_rank(url):
    res = requests.get(url)
    soup = BeautifulSoup(res.text, 'lxml')
    books = soup.find_all('div', {'class':'type02_bd-a'})
    rank_no=1
    for book in books:
        if book.li.a.text == "何敏煌":
            print("第{}名".format(rank_no))
            print("書名:" + book.h4.a.text)
            print("作者:" + book.li.a.text)
        rank_no = rank_no + 1

print("----------")
print("30日暢銷榜")
print("----------")
show_rank("http://www.books.com.tw/web/sys_saletopb/books/19/?loc=P_002_020")
print("----------")
print("7日暢銷榜")
print("----------")
show_rank("http://www.books.com.tw/web/sys_saletopb/books/19?attribute=7")

以下是程式執行例: