Python程式的基底URL
URL = "http://search.books.com.tw/search/query/key/{0}/cat/all"
上述URL變數是用來在generate_search_url()函數產生網址後,呼叫web_scraping_bot()函數來爬取查詢結果的圖書資訊。
Python函數:generate_search_url()函數
在generate_search_url()函數的參數是基底 URL 和關鍵字,我們是呼叫format()函數建立搜尋圖書關鍵字的網址。
def generate_search_url (url,keyword):
url = url. format (keyword)
return url
Python函數:web_scraping_bot()函數
在web_scraping_bot()函數的參數中,只有1個目標網址,因為這次的爬蟲程式需要從多頁網頁取得資料,所以判斷 HTTP請求是否成功移至 parse_html()函數
def web_scraping_bot(url):
booklist = [["書名","ISBN","網址","書價"]]
print("抓取網路資料中...")
soup = parse_html (get_resource (url))
if soup != None:
#print (soup)
tag_item = soup. find_all (class_="item")
for item in tag_item:
book = []
book. append (item.find ("img") ["alt"])
book. append (get_ISBN (item. find ("a") ["href"]))
book. append ("http:" + item. find ("a") ["href"])
price = item. find (class="price").find all ("b")
上述程式碼呼叫 parse_html() 函數成功剖析網頁後,呼叫find_all()函數取出所有圖書清單的HTML標籤,然後使用for/in迴圈一一爬取每一本圖書資料,依序是書名、ISBN、網址,ISBN是再呼叫get_ISBN()函數來取得,參數是圖書頁面的URL。接著,在下方取得圖書價格。
if len (price)== 1:
book. append (price [0]. string)
else:
book. append (price [1] .string)
booklist. append (book)
print("等待2秒鐘...")
time, sleep (2)
return booklist
上述if/else條件判斷定價是否存在(因為可能有定價或優惠價),在取得圖書資訊 book 清單後,呼叫append()函數新增至bookist巢狀清單。
Python函數:parse_html()函數
在parse_html()函數的參數是Requests物件,if/else條件判斷是否請求成功,成功就傳回 Beautiful Soup 剖析的 HTML網頁
def parse_html (r) :
if r. status_code == requests.codes.ok:
r.encoding = "utf8"
soup = BeautifulSoup (r. text, "lxml")
else:
print ("HTTP請求錯誤..." + url)
soup = None
return soup
Python函數:get_ISBN()函數
在get_ISBN()函數首先呼叫 parse_html()函數,取得圖書資料網址的Beautiful Soup 物件,即可尋找ISBN的標籤。
def get_ISBN (url) :
soup = parse_html (get_resource ("http:" + url))
if soup != None:
try:
isbn = soup. find (itemprop="productID") ["content"] [5:]
except:
isbn = "0000"
else:
isbn = "1111"
return isbn
上述try/except是取得圖書的ISBN,如果找到的話就傳回ISBN碼;沒有找到的話就傳回0000;剖析失敗會傳回1111。