1. 程式人生 > >史上最詳細的爬蟲教程,Python採集全網最受歡迎的 500 本書!

史上最詳細的爬蟲教程,Python採集全網最受歡迎的 500 本書!

 

史上最詳細的爬蟲教程,Python採集全網最受歡迎的 500 本書!

 

 

想看好書?想知道哪些書比較多人推薦,最好的方式就是看資料,接下來用 Python 爬取噹噹網五星圖書榜 TOP500 的書籍,或許能給我們參考參考!

Python爬取目標

 

  • 爬取噹噹網前500本受歡迎的書籍
  • 解析書籍名稱,作者,排名,推薦程度和五星評分次數資料。
  • 將資料存寫入到本地檔案

 

分析網頁

 

在噹噹網五星圖書榜這個網址中,我們可以看到這裡列出來了五星圖書榜:

史上最詳細的爬蟲教程,Python採集全網最受歡迎的 500 本書!

 

 

噹噹網五星圖書榜

通過原始碼可以看到,我們想要的資訊被包裹在<li>標籤中:

史上最詳細的爬蟲教程,Python採集全網最受歡迎的 500 本書!

 

 

噹噹網原始碼

可以看到我們要的這些資料都在這:

史上最詳細的爬蟲教程,Python採集全網最受歡迎的 500 本書!

 

 

關鍵資料

當我們點選下一頁的時候,url 地址會發生改變(最後的數字會加1):

第一頁的 url 是:http://bang.dangdang.com/books/fivestars/01.00.00.00.00.00-recent30-0-0-1-1
第二頁的 url 是:http://bang.dangdang.com/books/fivestars/01.00.00.00.00.00-recent30-0-0-1-2

我們等會可以通過這個變數來實現多頁載入資料。

Python請求網頁

 

我們使用 requests 來請求噹噹網的地址,定義一個get_one_page,將會返回 HTML 原始碼。


def get_one_page(url):
try:
response = requests.get(url)
if response.status_code == 200:
return response.text
return None
except RequestException:
return None

打印出來就是這樣,部分截圖如下:

史上最詳細的爬蟲教程,Python採集全網最受歡迎的 500 本書!

 

 

正則解析

 

原始碼那麼多資料,但是對我們來說只需要籍名稱,作者,排名,推薦程度和五星評分次數資料,所以我們要用正則表示式來過濾一下,使用 re 模組,定義匹配規則:


<li>.*?list_num.*?>(.*?)</div>.*?pic.*?src="(.*?)".*?/></a>.*?name"><a.*?title="(.*?)">.*?tuijian">(.*?)</span>.*?publisher_info.*?title="(.*?)".*?biaosheng.*?<span>(.*?)</span>.*?</li>

定義 parse_one_page ,返回每次匹配到的資料,解析成字典形式:


def parse_one_page(html):
pattern = re.compile('<li>.*?list_num.*?>(.*?)</div>.*?pic.*?src="(.*?)".*?/></a>.*?name"><a.*?title="(.*?)">.*?tuijian">(.*?)</span>.*?publisher_info.*?title="(.*?)".*?biaosheng.*?<span>(.*?)</span>.*?</li>',re.S)
items = re.findall(pattern,html)
for item in items:
yield {
'index':item[0],
'iamge':item[1],
'title':item[2],
'tuijian':item[3],
'author':item[4],
'times':item[5],
}

將資料寫入檔案

 

我們已經拿到了每次請求的資料,並且解析匹配好了,那麼將每次得到的資料寫入book.txt檔案中去:


def write_content_to_file(content):
with open('book.txt','a',encoding='UTF-8') as f:
f.write(json.dumps(content,ensure_ascii=False) + ' ')
f.close()

多頁請求

 

我們要獲取 TOP500 ,噹噹網每頁給出 20 條資料,我們需要 25 頁的資料,一開始我們在分析網頁的時候知道 URL 會選擇頁數改變最後的引數,所以我們可以用迴圈來請求所有的資料:


def main(page):
url = "http://bang.dangdang.com/books/fivestars/01.00.00.00.00.00-recent30-0-0-1-" + str(page)
html = get_one_page(url)
parse_one_page(html)
for item in parse_one_page(html):
print(item)
write_content_to_file(item)
if __name__ == "__main__":
for i in range(1,26):
main(i)

執行爬取

 

 

史上最詳細的爬蟲教程,Python採集全網最受歡迎的 500 本書!

 

 

抓取過程

可以看到我們將五百條資料抓取下來了,並且在專案中多了一個book.txt檔案,開啟看看有沒將資料寫入:

史上最詳細的爬蟲教程,Python採集全網最受歡迎的 500 本書!

 

 

抓取結果

ok,以上我們就把噹噹網最受歡迎的 500 本書爬取下來了!