網路爬蟲: 從allitebooks.com抓取書籍資訊並從amazon.com抓取價格(3): 根據書籍ISBN碼抓取amazon.com價格...

weixin_34290000發表於2016-08-19

通過上一篇隨筆的處理,我們已經拿到了書的書名和ISBN碼。(網路爬蟲: 從allitebooks.com抓取書籍資訊並從amazon.com抓取價格(2): 抓取allitebooks.com書籍資訊及ISBN碼)
接下來將通過ISBN碼去amazon.com獲取每本書對應的價格。

一、瞭解需要和分析網站

通過分析amazon.com得知,以ISBN碼作為搜尋關鍵字可查詢到對應的書。
結果頁碼就有這本書的價格,既然價格是以$符號開頭,那就可以通過正規表示式得到價格。

27537-4a7b5691205a9326.png
通過正規表示式匹配價格程式碼:
def get_price_amazon(isbn):
    base_url = "https://www.amazon.com/s/ref=nb_sb_noss?url=search-alias%3Daps&field-keywords="
    url = base_url + str(isbn)
    page = urlopen(url)
    soup = BeautifulSoup(page, 'lxml')
    page.close()
    soup = BeautifulSoup(html_content, 'lxml')
    price_regexp = re.compile("\$[0-9]+(\.[0-9]{2})?")
    price = soup.find(text=price_regexp)
    return [isbn, price]

上一篇隨筆中已經得到了所有書籍的ISBN碼,遍歷所有的ISBN碼傳入get_price_amazon()方法即可獲取所有書籍的價格:

def get_all_isbn():
    all_isbn = []
    with open('isbn.csv', 'rt') as csvfile:
        spamreader = csv.reader(csvfile, delimiter=' ', quotechar='|')
        for row in spamreader:
            all_isbn.append(row[0])
    return all_isbn

def run():
    qs = []
    pool = ThreadPool(processes=10)
    book_price_list = []
    for isbn in get_all_isbn():
        price = get_price_amazon(isbn)
        book_price_list.append(price)

執行結果:

27537-d909fb1b5a35e2f3.png

二、將兩部分結果資料合併

剛學過資料處理(利用Python進行資料分析 基礎系列隨筆彙總),為了練練手,這裡通過pandas將兩部分資料合併起來:

book_info_data = pd.read_csv('books.csv')
price_data = pd.read_csv('prices.csv')
result = pd.merge(book_info_data, price_data, on='isbn')
result.to_csv('result.csv', index=False, header=True, columns=['isbn', 'title', 'price'])

最終結果:


27537-443c1156669c609b.png

完整程式碼請移步github:https://github.com/backslash112/book_scraper_python


Beautiful Soup基礎知識:網路爬蟲: 從allitebooks.com抓取書籍資訊並從amazon.com抓取價格(1): 基礎知識Beautiful Soup
我們處於大資料時代,對資料處理感興趣的朋友歡迎檢視另一個系列隨筆:利用Python進行資料分析 基礎系列隨筆彙總

接下來打算學習Scrapy庫,Scrapy是一個採集工具,它可以幫你大幅降低網頁查詢和識別工作,輕鬆採集一個或多個域名的資訊。有興趣的朋友歡迎關注本部落格,也歡迎大家留言進行討論。

相關文章