這一篇首先從allitebooks.com里抓取書籍列表的書籍信息和每本書對應(yīng)的ISBN碼耗绿。
一砾隅、分析需求和網(wǎng)站結(jié)構(gòu)
allitebooks.com這個網(wǎng)站的結(jié)構(gòu)很簡單晴埂,分頁+書籍列表+書籍詳情頁。
要想得到書籍的詳細(xì)信息和ISBN碼精耐,我們需要遍歷所有的頁碼琅锻,進(jìn)入到書籍列表,然后從書籍列表進(jìn)入到每本書的詳情頁里惊完,這樣就能夠抓取詳情信息和ISBN碼了处硬。
二荷辕、從分頁里遍歷每一頁書籍列表
通過查看分頁功能的HTML代碼件豌,通過class="current"可以定位當(dāng)前頁碼所在span標(biāo)簽茧彤,此span標(biāo)簽的下一個兄弟a標(biāo)簽就是下一頁鏈接所在的標(biāo)簽躬审,
而通過對比最后一頁的span可以發(fā)現(xiàn),在最后一頁中遭殉,通過class="current"找到的span標(biāo)簽卻沒有下一個兄弟a標(biāo)簽博助。所以我們可以通過這一點(diǎn)判斷出是否已經(jīng)到最后一頁了富岳。代碼如下:
# 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
三、從書籍列表里找到詳情頁的鏈接
在書籍列表點(diǎn)擊書名或者封面圖都可以進(jìn)入詳情蚁飒,則書名和封面圖任選一個萝喘,這里選擇書名阁簸。
我們可以通過查找class="entry-title"定位到書名所在的h2標(biāo)簽启妹,然后通過此標(biāo)簽的a屬性即可獲得鏈接所在的a標(biāo)簽,再通過a標(biāo)簽的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
四檬输、從書籍詳情頁里抓取標(biāo)題和ISBN碼
通過查看書籍詳情頁的HTML代碼褪猛,我們可以通過查找class="single-title"定位到標(biāo)題所在的h1標(biāo)簽獲得標(biāo)題,然后通過查找text="Isbn:"定位到"Isbn:"的所在的dt標(biāo)簽碳却,此標(biāo)簽的下一個兄弟節(jié)點(diǎn)就是書籍ISBN碼所在的標(biāo)簽,通過此標(biāo)簽的string屬性可獲得ISBN碼內(nèi)容馍资。
代碼如下:
# 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)
運(yùn)行結(jié)果
六建钥、將結(jié)果寫入文件虐沥,以供下一步處理使用欲险。
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基礎(chǔ)知識:網(wǎng)絡(luò)爬蟲: 從allitebooks.com抓取書籍信息并從amazon.com抓取價格(1): 基礎(chǔ)知識Beautiful Soup
我們處于大數(shù)據(jù)時代,對數(shù)據(jù)處理感興趣的朋友歡迎查看另一個系列隨筆:利用Python進(jìn)行數(shù)據(jù)分析 基礎(chǔ)系列隨筆匯總
接下來一篇隨筆是根據(jù)獲取到的ISBN碼去amazon.com網(wǎng)站獲取每本書對應(yīng)的價格槐壳,并通過數(shù)據(jù)分析的知識對獲取的數(shù)據(jù)進(jìn)行處理喜每,最后輸出到csv文件灼卢。有興趣的朋友歡迎關(guān)注本博客来农,也歡迎大家留言討論。