《Python網(wǎng)絡(luò)爬蟲技術(shù)案例教程》(林忠會) 第10章.Python網(wǎng)絡(luò)爬蟲_第1頁
《Python網(wǎng)絡(luò)爬蟲技術(shù)案例教程》(林忠會) 第10章.Python網(wǎng)絡(luò)爬蟲_第2頁
《Python網(wǎng)絡(luò)爬蟲技術(shù)案例教程》(林忠會) 第10章.Python網(wǎng)絡(luò)爬蟲_第3頁
《Python網(wǎng)絡(luò)爬蟲技術(shù)案例教程》(林忠會) 第10章.Python網(wǎng)絡(luò)爬蟲_第4頁
《Python網(wǎng)絡(luò)爬蟲技術(shù)案例教程》(林忠會) 第10章.Python網(wǎng)絡(luò)爬蟲_第5頁
已閱讀5頁,還剩50頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

.Python網(wǎng)絡(luò)爬蟲.Python網(wǎng)絡(luò)爬蟲.Python網(wǎng)絡(luò)爬蟲.Python網(wǎng)絡(luò)爬蟲.Python網(wǎng)絡(luò)爬蟲Python網(wǎng)絡(luò)爬蟲技術(shù)案例教程PythonWangluoPachongJishuAnliJiaochengCOMMITTEDCOMMITTEDCOMMITTECOMMITTECONTENTS目錄COMMITTED第1章網(wǎng)絡(luò)爬蟲入門

第2章爬蟲基礎(chǔ)第3章網(wǎng)頁解析基礎(chǔ)第4章爬取動態(tài)加載數(shù)據(jù)第5章反爬蟲策略第6章模擬登錄和處理驗證碼

第7章爬取App和PC客戶端第8章爬蟲框架Scrapy第9章分布式爬蟲第10章項目實戰(zhàn)COMMITTEDCOMMITTEDCOMMITTECOMMITTECOMMITTED掃碼下載文旌課堂APP掃碼簽到(202X.XX.XXXX:XX至202X.XX.XXXX:XX)簽到方式教師通過“文旌課堂APP”生成簽到二維碼,并設(shè)置簽到時間,學生通過“文旌課堂APP”掃描“簽到二維碼”進行簽到。簽到.Python網(wǎng)絡(luò)爬蟲.Python網(wǎng)絡(luò)爬蟲.Python網(wǎng)絡(luò)爬蟲.Python網(wǎng)絡(luò)爬蟲.Python網(wǎng)絡(luò)爬蟲第10章項目實戰(zhàn)——京東商品信息爬取及數(shù)據(jù)分析本章導讀通過網(wǎng)絡(luò)爬蟲爬取數(shù)據(jù)的最終目的是分析數(shù)據(jù)并很好地利用數(shù)據(jù)。本章將介紹使用前面所學的知識爬取京東網(wǎng)站商品信息,并存儲至MongoDB數(shù)據(jù)庫中,然后讀取并分析數(shù)據(jù)。學習目標練習使用Selenium模擬瀏覽器爬取網(wǎng)站數(shù)據(jù)。練習使用beautifulsoup4庫解析數(shù)據(jù)。練習將數(shù)據(jù)存儲至MongoDB數(shù)據(jù)庫。掌握使用pandas分析爬取到的數(shù)據(jù)。10.1項目需求10.2爬蟲實現(xiàn)10.3爬蟲數(shù)據(jù)分析第2章爬蟲基礎(chǔ).Python網(wǎng)絡(luò)爬蟲.Python網(wǎng)絡(luò)爬蟲.Python網(wǎng)絡(luò)爬蟲.Python網(wǎng)絡(luò)爬蟲.Python網(wǎng)絡(luò)爬蟲SectionTitle10.1項目需求本項目的目標是根據(jù)輸入的搜索關(guān)鍵字爬取京東網(wǎng)站相關(guān)商品的信息,包括商品名、價格、店鋪名和評價數(shù),然后將數(shù)據(jù)保存至MongoDB數(shù)據(jù)庫中,最后讀取數(shù)據(jù)庫中的數(shù)據(jù)進行分析。例如,輸入“手機”,搜索京東網(wǎng)站中手機相關(guān)的商品信息(見圖10-1),包括不同品牌不同型號的手機價格、店鋪名和評價數(shù)(根據(jù)評價數(shù)可推測銷量)。通過這些數(shù)據(jù)可以分析手機的價格分布、不同型號手機銷量和均價、店鋪銷量比例等。10.1項目需求10.1項目需求圖10-1京東網(wǎng)站搜索的手機相關(guān)商品信息.Python網(wǎng)絡(luò)爬蟲.Python網(wǎng)絡(luò)爬蟲.Python網(wǎng)絡(luò)爬蟲.Python網(wǎng)絡(luò)爬蟲.Python網(wǎng)絡(luò)爬蟲SectionTitle10.2爬蟲實現(xiàn)根據(jù)項目需求,爬蟲程序可以分為四個模塊,分別是初始化模塊、搜索模塊、解析模塊、主模塊,它們的實現(xiàn)方法如下。2.1.1HTTP請求導入selenium庫中webdriver相關(guān)模塊,beautifulsoup4庫中BeautifulSoup模塊、time模塊和pymongo模塊;初始化GoogleChrome瀏覽器和WebDriverWait對象;連接MongoDB數(shù)據(jù)庫,并創(chuàng)建名為“京東”的數(shù)據(jù)庫。實現(xiàn)代碼如下。10.2爬蟲實現(xiàn)10.2爬蟲實現(xiàn)#導入webdriver模塊fromseleniumimportwebdriver#導入By模塊frommon.byimportBy#導入WebDriverWait模塊fromselenium.webdriver.support.uiimportWebDriverWait#導入ActionChains模塊fromselenium.webdriverimportActionChains#導入expected_conditions模塊fromselenium.webdriver.supportimportexpected_conditionsasEC#選擇數(shù)據(jù)庫,如果不存在則新建一個數(shù)據(jù)庫mydb=myclient['京東']importtime #導入time模塊frombs4importBeautifulSoup #導入BeautifulSoup模塊importpymongo #導入pymongo模塊#初始化GoogleChrome瀏覽器對象,并賦值給browserbrowser=webdriver.Chrome()#初始化WebDriverWait對象,并賦值給waitwait=WebDriverWait(browser,10)#創(chuàng)建MongoClient類對象myclient=pymongo.MongoClient(host='localhost',port=27017)#選擇數(shù)據(jù)庫,如果不存在則新建一個數(shù)據(jù)庫mydb=myclient['京東']10.2爬蟲實現(xiàn)10.2.2搜索模塊在此模塊中,定義一個搜索函數(shù)search(keywd),其中keywd參數(shù)為搜索關(guān)鍵字。該函數(shù)實現(xiàn)根據(jù)關(guān)鍵字在京東網(wǎng)站中搜索商品,其過程為:使用Selenium中的get()方法請求京東網(wǎng)站(網(wǎng)址/),打開一個GoogleChrome瀏覽器窗口;然后定位搜索編輯框節(jié)點(clstag屬性值為“h|keycount|head|search_c”)并輸入關(guān)鍵字,“搜索”節(jié)點(clstag屬性值為“h|keycount|head|search_a”)并單擊,如圖10-2所示。10.2爬蟲實現(xiàn)圖10-2京東搜索10.2爬蟲實現(xiàn)#定義函數(shù),參數(shù)為搜索關(guān)鍵字,實現(xiàn)搜索商品defsearch(keywd):#請求京東網(wǎng)登錄頁面,打開一個瀏覽器窗口browser.get('/')time.sleep(1) #休眠1sbrowser.maximize_window() #窗口最大化time.sleep(1) #休眠1s實現(xiàn)代碼如下。10.2爬蟲實現(xiàn)#輸入搜索關(guān)鍵字wait.until(EC.presence_of_element_located((By.CSS_SELECTOR,'[clstag="h|keycount|head|search_c"]'))).send_keys(keywd)#單擊搜索按鈕wait.until(EC.presence_of_element_located((By.CSS_SELECTOR,'[clstag="h|keycount|head|search_a"]'))).click()time.sleep(2) #休眠2s10.2爬蟲實現(xiàn)10.2.3解析模塊在此模塊中,定義一個解析函數(shù)goods_parse(collection),其中collection參數(shù)為MongoDB數(shù)據(jù)庫的集合名。該函數(shù)實現(xiàn)獲取和解析網(wǎng)頁內(nèi)容,獲取所需數(shù)據(jù),并將數(shù)據(jù)保存到MongoDB數(shù)據(jù)庫的集合中。其過程如下:10.2爬蟲實現(xiàn)首先,使用Selenium將搜索網(wǎng)頁下拉到窗口底部,以動態(tài)加載所有的商品信息(每頁包含60個商品信息,所有商品信息都包含在id屬性值為“J_goodsList”節(jié)點的ul節(jié)點下的li節(jié)點中,見圖10-3);然后,循環(huán)60次使用beautifulsoup4庫解析商品信息,每個li節(jié)點包含一個商品信息(見圖10-4),并將商品信息插入MongoDB數(shù)據(jù)庫的集合中;最后,定位“下一頁”節(jié)點(class屬性值為“pn-next”)并單擊,實現(xiàn)翻頁。整個過程循環(huán)的次數(shù)為搜索商品的總頁數(shù)(如“共52頁”,可以從class屬性值為“p-skip”節(jié)點下b節(jié)點的文本中獲取)。10.2爬蟲實現(xiàn)圖10-3所有商品的HTML源代碼(部分)10.2爬蟲實現(xiàn)圖10-4每個商品的HTML源代碼10.2爬蟲實現(xiàn)#定義goods_parse函數(shù)defgoods_parse(collection):page_num=browser.find_element_by_css_selector('.p-skipb').textforiinrange(int(page_num)+1): #循環(huán)#下拉滾動條至窗口底部browser.execute_script('window.scrollTo(0,document.body.scrollHeight)')time.sleep(3) #休眠3s#初始化soup對象soup=BeautifulSoup(browser.page_source,'lxml')實現(xiàn)代碼如下。10.2爬蟲實現(xiàn)#獲取商品列表goods_list=soup.select('#J_goodsList>ul>li')forgoodsingoods_list: #遍歷商品列表#獲取商品名title=goods.select('[class="p-namep-name-type-2"]aem')[0].text.strip()#獲取店鋪名shop=goods.select('.p-shop')[0].text.strip()10.2爬蟲實現(xiàn)#獲取商品價格price=goods.select('.p-pricestrong')[0].text.strip()#獲取商品評價數(shù)commit=goods.select('.p-commitstronga')ifcommit:commemt_num=commit[0].text.strip()else:commemt_num='0'#定義商品信息字典goods_dict={10.2爬蟲實現(xiàn)'商品名':title,'店鋪名':shop,'價格':price,'評價數(shù)':commemt_num}#將商品信息字典插入到數(shù)據(jù)庫中collection.insert_one(goods_dict)#定位“下一頁”節(jié)點并單擊wait.until(EC.presence_of_element_located((By.CSS_SELECTOR,'.pn-next'))).click()10.2爬蟲實現(xiàn)10.2.4主模塊主模塊實現(xiàn)輸入搜索關(guān)鍵字,以關(guān)鍵字命名選擇或創(chuàng)建數(shù)據(jù)庫的集合,并按順序調(diào)用搜索函數(shù)和解析函數(shù)。實現(xiàn)代碼如下。if__name__=='__main__':keyword=input('請輸入搜索關(guān)鍵字:') #輸入關(guān)鍵字#選擇集合,如果不存在則新建一個集合collection=mydb[keyword]search(keyword) #調(diào)用search函數(shù)goods_parse(collection) #調(diào)用goods_parse函數(shù)10.2爬蟲實現(xiàn)運行程序后,MongoDB數(shù)據(jù)庫中的內(nèi)容如圖10-5所示。圖10-5MongoDB數(shù)據(jù)庫中的內(nèi)容(部分)10.2爬蟲實現(xiàn).Python網(wǎng)絡(luò)爬蟲.Python網(wǎng)絡(luò)爬蟲.Python網(wǎng)絡(luò)爬蟲.Python網(wǎng)絡(luò)爬蟲.Python網(wǎng)絡(luò)爬蟲SectionTitle10.3爬蟲數(shù)據(jù)分析在數(shù)據(jù)分析方面,Python有非常強大的第三方庫,pandas就是其中之一,它是基于NumPy數(shù)組構(gòu)建的,可以更快更簡單地預(yù)處理、清洗和分析數(shù)據(jù)。pandas庫不是Python內(nèi)置的標準庫,使用之前需要安裝,安裝方法與requests庫的安裝類似(請參考2.3.2小節(jié)),此處不再贅述。10.3爬蟲數(shù)據(jù)分析10.3.1加載數(shù)據(jù)首先導入pandas庫、matplotlib庫和pymongo庫,然后連接MongoDB數(shù)據(jù)庫并選擇集合(如“手機”),最后讀取數(shù)據(jù)庫中的數(shù)據(jù),實現(xiàn)代碼如下。importpandasaspd #導入pandas模塊importmatplotlib.pyplotasplt #導入pyplot模塊importpymongo #導入pymongo模塊#創(chuàng)建MongoClient類對象myclient=pymongo.MongoClient(host='localhost',port=27017)mydb=myclient['京東'] #選擇數(shù)據(jù)庫phone=mydb['手機'] #選擇集合data=pd.DataFrame(list(phone.find())) #讀取數(shù)據(jù)庫中的數(shù)據(jù)10.3爬蟲數(shù)據(jù)分析matplotlib是一個Python提供的2D繪圖庫,類似Matlab的繪圖工具。10.3爬蟲數(shù)據(jù)分析10.3.2預(yù)處理數(shù)據(jù)數(shù)據(jù)中價格和評價數(shù)都是字符串類型,需要將價格轉(zhuǎn)換為浮點型,將評價數(shù)轉(zhuǎn)換為整型。不過在轉(zhuǎn)換前還需要將字符串中的字符進行處理。例如字符串“¥4999.00”中,將“¥”使用空字符替換;字符串“1.4萬+”中,將“+”和“.”使用空字符替換,然后將“萬”使用“000”替換;字符串“1萬+”中,將“+”使用空字符替換,然后將“萬”使用“0000”替換。由于搜索的結(jié)果中包含了價格待發(fā)布的手機信息,所以此處篩選出標明價格的數(shù)據(jù)。實現(xiàn)代碼如下。10.3爬蟲數(shù)據(jù)分析#定義函數(shù),處理評價數(shù)中的字符defdealComment_num(comm_colum):num=comm_colum.replace('+','')if'萬'innum:if'.'innum:num=num.replace('.','').replace('萬','000')else:num=num.replace('萬','0000')returnnum10.3爬蟲數(shù)據(jù)分析#篩選出標明價格的手機data=data[~data['價格'].str.contains('待發(fā)布')]#處理價格中的‘¥’字符data['價格']=data['價格'].str.replace('¥','')#將價格轉(zhuǎn)化為浮點型data['價格']=data['價格'].astype('float')#使用lambda調(diào)用dealComment_num函數(shù)data['評價數(shù)']=data['評價數(shù)'].apply(lambdax:dealComment_num(x))#將評價數(shù)轉(zhuǎn)化為整型data['評價數(shù)']=data['評價數(shù)'].astype('int')10.3爬蟲數(shù)據(jù)分析10.3.3分析數(shù)據(jù)(1)分析手機價格分布。根據(jù)手機價格繪制直方圖,x軸表示價格,y軸表示該價格區(qū)間的商品數(shù)量,添加樣本總數(shù)說明。實現(xiàn)代碼如下。10.3爬蟲數(shù)據(jù)分析#正常顯示中文標簽plt.rcParams['font.sans-serif']=['SimHei']plt.figure(figsize=(10,8)) #生成繪圖窗口plt.hist(data['價格'],bins=50,color='deeppink')plt.xlabel('價格(元)') #添加x軸標題plt.ylabel('數(shù)量(臺)') #添加y軸標題plt.title('手機價格分布') #添加窗口標題num_total=str(data.shape[0]) #計算樣本總數(shù)s='樣本總數(shù)為'+num_total #初始化字符串s#添加樣本總數(shù)說明plt.text(20000,400,s,fontsize=15,color='deeppink')plt.show() #顯示窗口10.3爬蟲數(shù)據(jù)分析圖10-6手機價格分布直方圖手機價格分布直方圖如圖10-6所示。10.3爬蟲數(shù)據(jù)分析從圖10-6可以看出,在京東網(wǎng)站上爬取的手機樣本總數(shù)為3065,價格基本在10000元以內(nèi),其中大部分在5000元以下,少量手機價格能達到30000元左右。(2)分析華為各型號手機的銷售量和均價,如mate30、p40、榮耀30、nova7、暢享20和麥芒9等。由于京東網(wǎng)站只有近6個月商品的評價信息,故此處,將評價數(shù)看作銷售量進行分析。首先,根據(jù)手機型號篩選數(shù)據(jù);然后,統(tǒng)計每個型號手機的銷量和均價;最后,繪制柱狀圖(x軸表示手機型號,y軸表示該手機銷量或均價),并在每個長條上方標明銷量或均價的值,實現(xiàn)代碼如下。10.3爬蟲數(shù)據(jù)分析#正常顯示中文標簽plt.rcParams['font.sans-serif']=['SimHei']#提取包含mate30的商品信息mate30=data[data['商品名'].str.contains('mate30')|data['商品名'].str.contains('mate30')]#計算mate30的總評價數(shù)mate30_total=mate30['評價數(shù)'].sum()#計算mate30的均價mate30_price=int(mate30['價格'].mean())#提取包含p40的商品信息p40=data[data['商品名'].str.contains('p40')|data['商品名'].str.contains('p40')]10.3爬蟲數(shù)據(jù)分析#計算p40的總評價數(shù)p40_total=p40['評價數(shù)'].sum()#計算p40的均價p40_price=int(p40['價格'].mean())#提取包含榮耀30的商品信息榮耀30=data[data['商品名'].str.contains('榮耀30')|data['商品名'].str.contains('榮耀30')]#計算榮耀30的總評價數(shù)榮耀30_total=榮耀30['評價數(shù)'].sum()#計算榮耀30的均價榮耀30_price=int(榮耀30['價格'].mean())10.3爬蟲數(shù)據(jù)分析#提取包含nova7的商品信息nova7=data[data['商品名'].str.contains('nova7')|data['商品名'].str.contains('nova7')]#計算nova7的總評價數(shù)nova7_total=nova7['評價數(shù)'].sum()#計算nova7的均價nova7_price=int(nova7['價格'].mean())#提取包含暢享20的商品信息暢享20=data[data['商品名'].str.contains('暢享20')|data['商品名'].str.contains('暢享20')]#計算暢享20的總評價數(shù)暢享20_total=暢享20['評價數(shù)'].sum()10.3爬蟲數(shù)據(jù)分析#計算暢享20的均價暢享20_price=int(暢享20['價格'].mean())#提取包含麥芒9的商品信息麥芒9=data[data['商品名'].str.contains('麥芒9')|data['商品名'].str.contains('麥芒9')]#計算麥芒9的總評價數(shù)麥芒9_total=麥芒9['評價數(shù)'].sum()#計算麥芒9的均價麥芒9_price=int(麥芒9['價格'].mean())#初始化標簽列表10.3爬蟲數(shù)據(jù)分析title_list=['mate30','p40','榮耀30','nova7','暢享20','麥芒9']#初始化評價數(shù)列表sale_list=[mate30_total,p40_total,榮耀30_total,nova7_total,暢享20_total,麥芒9_total]#初始化均價列表price_list=[mate30_price,p40_price,榮耀30_price,nova7_price,暢享20_price,麥芒9_price]plt.figure(figsize=(10,8),dpi=80) #生成繪制柱狀圖窗口10.3爬蟲數(shù)據(jù)分析#根據(jù)sale_list列表繪制圖plt.bar(range(6),sale_list,width=0.5,color='deeppink')plt.xticks(range(6),title_list) #在每個長條下方添加手機型號plt.ylabel('銷量(臺)') #添加x軸標題plt.xlabel('型號') #添加y軸標題plt.title('華為各型號手機銷量') #添加窗口標題#在長條上方添加評價數(shù)forx,yinenumerate(sale_list):plt.text(x,float(y)+0.1,y,ha='center')plt.show() #顯示繪圖plt.figure(figsize=(10,8),dpi=80) #生成繪制柱狀圖窗口10.3爬蟲數(shù)據(jù)分析#根據(jù)price_list列表繪制圖plt.bar(range(6),price_list,width=0.5,color='deeppink')plt.xticks(range(6),title_list) #在每個長條下方添加手機型號plt.ylabel('均價(元)') #添加x軸標題plt.xlabel('型號') #添加y軸標題plt.title('華為各型號手機均價') #添加窗口標題#在長條上方添加均價forx,yinenumerate(price_list):plt.text(x,float(y)+0.1,y,ha='center')plt.show() #顯示繪圖10.3爬蟲數(shù)據(jù)分析圖10-7華為各型號手機銷量柱狀圖華為各型號手機銷量柱狀圖如圖10-7所示,均價柱狀圖如圖10-8所示。圖10-8華為各型號手機均價柱狀圖10.3爬蟲數(shù)據(jù)分析從圖10-7和圖10-8可以看出,在京東網(wǎng)站近6個月銷售時間里,華為6個型號手機中榮耀30和nova7的銷量最好,大大超過了其他4個型號,而且價格比較適中。(3)分析店鋪銷量。首先通過店鋪名分組,并將每一組的評價數(shù)求和;其次將總的評價數(shù)求和,并計算每一組的評價數(shù)所占比例;然后按評價數(shù)比例排序,取出前

10

的店鋪,其余店鋪歸為其他;最后根據(jù)比例繪制餅狀圖,實現(xiàn)代碼如下。10.3爬蟲數(shù)據(jù)分析#正常顯示中文標簽plt.rcParams['font.sans-serif']=[

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論