一.選題背景:
為什么選此題:如今,現代人買書大多都會選擇線上購買,然而比較出名的購書網站當當網,在你要搜索想購買的書時,根據輸入關鍵字搜索出來的書本種類繁多,眼花繚亂,對於有些原則困難症的人來說就很難受,不知如何讓下手。
預期目標:希望通過我設計的爬取當當網的爬蟲代碼,捕獲出來的書名,價格,出版社等信息,根據信息做可視化分析,作圖,給用戶提供參考。
二.主題式網絡爬蟲的設計方案
1.主題式網絡爬蟲名稱
基於網絡爬蟲爬取當當網
2.主題式網絡爬蟲爬取的內容與數據特征分析
爬取當當網界面信息,根據關鍵字搜索想要查找的書名,分析價格,作者出版社,簡介等內容。
3.主題式網絡爬蟲設計方案概述
本爬蟲主要從一下幾個方面進行設計:導入需要用到的庫,創建表格,獲取界面,分析需要搜索的書籍的名稱title、作者author、價格price、出版社publisher、簡介detail等信息
將數據保存至book.csv文件里,然后根據爬取到的數據做可視化分析
三、主題頁面的結構特征分析
1.主題頁面的結構與特征分析:
首頁和他的布局結構


分析當當網的頁面分析可以實現交互功能,如用戶注冊、信息發布、產品展示、訂單管理等可以看出這是一個動態網站。
2.Htmls 頁面解析:


爬取的頁面

3.節點(標簽)查找方法與遍歷方法
四、網絡爬蟲程序設計
1.數據爬取和采集:
import urllib.request
import requests
from bs4 import BeautifulSoup
import time
import random
# 隨機頭
USER_AGENTS = [
"Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; AcooBrowser; .NET CLR 1.1.4322; .NET CLR 2.0.50727)",
"Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; Acoo Browser; SLCC1; .NET CLR 2.0.50727; Media Center PC 5.0; .NET CLR 3.0.04506)",
"Mozilla/4.0 (compatible; MSIE 7.0; AOL 9.5; AOLBuild 4337.35; Windows NT 5.1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)",
"Mozilla/5.0 (Windows; U; MSIE 9.0; Windows NT 9.0; en-US)",
"Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET CLR 2.0.50727; Media Center PC 6.0)",
"Mozilla/5.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET CLR 1.0.3705; .NET CLR 1.1.4322)",
"Mozilla/4.0 (compatible; MSIE 7.0b; Windows NT 5.2; .NET CLR 1.1.4322; .NET CLR 2.0.50727; InfoPath.2; .NET CLR 3.0.04506.30)",
"Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN) AppleWebKit/523.15 (KHTML, like Gecko, Safari/419.3) Arora/0.3 (Change: 287 c9dfb30)",
"Mozilla/5.0 (X11; U; Linux; en-US) AppleWebKit/527+ (KHTML, like Gecko, Safari/419.3) Arora/0.6",
"Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.2pre) Gecko/20070215 K-Ninja/2.1.1",
"Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9) Gecko/20080705 Firefox/3.0 Kapiko/3.0",
"Mozilla/5.0 (X11; Linux i686; U;) Gecko/20070322 Kazehakase/0.4.5",
"Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.8) Gecko Fedora/1.9.0.8-1.fc10 Kazehakase/0.5.6",
"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.56 Safari/535.11",
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_3) AppleWebKit/535.20 (KHTML, like Gecko) Chrome/19.0.1036.7 Safari/535.20",
"Opera/9.80 (Macintosh; Intel Mac OS X 10.6.8; U; fr) Presto/2.9.168 Version/11.52",
"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.11 (KHTML, like Gecko) Chrome/20.0.1132.11 TaoBrowser/2.0 Safari/536.11",
"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1180.71 Safari/537.1 LBBROWSER",
"Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E; LBBROWSER)",
"Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; QQDownload 732; .NET4.0C; .NET4.0E; LBBROWSER)",
"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.84 Safari/535.11 LBBROWSER",
]
headers = {
'User-Agent':random.choice(USER_AGENTS),
'Connection':'keep-alive',
'Accept-Language':'zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2'
}
# 創建book.csv
f = open("book.csv", "a")
f.write("書籍" + "," + "價格" + "," + "作者" + "," + "出版社" + '\n')
f = f.close()
def spider(keyword,page):
for i in range(0,page):
count = 0
page = 1
# 獲取界面
url = 'http://search.dangdang.com/?key='+str(keyword)+'&page_index='+str(page)
res = requests.get(url, headers=headers)
res.encoding = 'gbk'
soup = BeautifulSoup(res.text,'html.parser')
# print(soup)
div = soup.find("div", attrs={"class": "con shoplist"})
ul = div.find("ul", attrs={"class": "bigimg"})
lis = ul.find_all("li")
print('正在爬取第{}頁'.format(page))
for li in lis:
count += 1
# 分析每個<li>中書籍信息:名稱title、作者author、價格price、出版社publisher、簡介detail、圖像image
p = li.find("p", attrs={"class": "name"})
title = p.find("a").text
price = li.find("span", attrs={"class": "search_now_price"}).text
author = li.find("p", attrs={"class": "search_book_author"}).find("span").text
pub = li.find("p", attrs={"class": "search_book_author"}).find_all("span")
#publishers = pub[2].find("a").text
publisher=pub[2].text
detail = li.find("p", attrs={"class": "detail"}).text
# 將數據保存至book.csv文件
with open("book.csv","a",encoding='utf-8') as f2:
f2.writelines(title + "," + price + "," + author + "," + publisher + '\n')
print('\n書籍:',title,'\n價格:',price,'\n作者:',author,'\n出版社:',publisher,'\n簡介:',detail)
page += 1
if __name__ == '__main__':
keyword = input('關鍵字:')
page = int(input('爬取頁數:'))
#keyword = 'python'
#page = 1
spider(keyword,page)
運行后的結果:

導入庫,和剛剛爬取的數據后保存的文件
import pandas as pd
import numpy as mp
import sklearn
import seaborn as sns
import matplotlib.pyplot as plt
df = pd.read_excel('book.xlsx',sheet_name='Sheet1')
df
對數據進行清理:
# 清洗重復書名
book = df.drop_duplicates('title')
book

然后發現清理后發現價格欄有Nan值,再進行一次對Nan進行清理
# 對Nan進行清理 book = book.dropna(axis=0) book

保存清理后的數據然后打開新的數據:
book.to_csv('books.csv',encoding='gb18030') #保存數據清洗后的文件
book = pd.read_csv('books.csv',encoding='gb18030')
book

對爬取到的各出版設占比做餅狀圖圖
# 餅狀圖
label_list = x
explode = (0,0,0,0.1,0,0)
plt.rcParams['font.sans-serif']=['SimHei']
plt.xticks(rotation=0)
plt.pie(y,labels=label_list,labeldistance=1.1, autopct="%1.1f%%", shadow=False, startangle=90, pctdistance=0.6)
plt.title("出版社餅狀圖")
plt.axis("equal")
plt.show()

各出版社對書本定價的分布所做的散點圖:
# 散點圖
plt.scatter(x,y,color='b',marker='o',s=40,edgecolor='black',alpha=0.5)
plt.xticks(rotation=90)
plt.title("出版社散點圖")
plt.xlabel("出版社",)#橫坐標名字
plt.ylabel("價格")#縱坐標名字
plt.show()

柱狀圖:
plt.bar(x,y,alpha=0.2, width=0.4, color='green', edgecolor='red', lw=3)
plt.rcParams['font.sans-serif']=['SimHei'] #用來正常顯示中文標簽
plt.title("出版社柱狀圖")
plt.xticks(rotation=90)
plt.xlabel("出版社",)#橫坐標名字
plt.ylabel("價格")#縱坐標名字
plt.show()

import matplotlib.pyplot as plt
# sf數據可視化分析
x = book['publisher']
y = book['price']
plt.rcParams['font.sans-serif']=['SimHei'] #用來正常顯示中文標簽
plt.rcParams['axes.unicode_minus']=False
plt.plot(x,y,'-',color = 'c',label="單位/元")
plt.xticks(rotation=90)
plt.legend(loc = "best")#圖例
plt.title("價格")
plt.xlabel("價格",)#橫坐標名字
plt.ylabel("出版社")#縱坐標名字
plt.show()

水平圖:
# 水平圖
plt.barh(x,y, alpha=0.2, height=0.4, color='r', edgecolor='gray',label='單位/億', lw=3)
plt.title("價格趨勢圖")
plt.legend(loc = "best")#圖例
plt.xlabel("價格",)#橫坐標名字
plt.ylabel("出版社")#縱坐標名字
plt.show()

五.總結
通過以上可視化分析看一大致了解了這本書在不同出版社里,定價的不同。通過餅圖可以看出人民文學出版社,商務印書館,譯林出版社,知識出版社等在當當網上占比較多,可以考慮購買這幾個出版社所出版的圖書。通過散點圖和統計圖看出這本書的價格在20元左右。這些數據大致可以幫用戶分析得到一些數據,可以提供一些數據供用戶參考,大致上給到了用戶一點建議,與預期的目標還是差了些。
通過這次的課程設計實驗,我學習到了要想爬取網站上的信息,必須有一個好的工具。通過本學期的Python課程的學習,使我又進一步了解了Python,Python是一種計算機程序設計語言(解釋型語言),具有代碼少、簡單、運行速度慢的特點。本次課程設計中我也發現了自己的在對Python的運用的很多不足,在課程設計的過程中,我遇到了很多問題,比如很多英文看不懂,我的英文水平還是太差了,今后還要努力學習英語,運行代碼是也是經常犯一些很基礎的錯誤,這讓我意識到我的基礎還不夠好,遇到問題首先在網上獲取信息,在通過上網查找信息學習過程學習到了將爬取的信息存儲到本地,在爬取網站時遇到了被網站的反爬蟲程序攔截,通過學習學會了模擬瀏覽器爬取信息 。在今后,我會在空余的時間里安排時間學習Python。
