學校實訓的第二天
阿新 • • 發佈:2018-12-18
今天主要學習爬蟲,歡迎大家評論交流。
工具:pycharm專業版(社群版也可以哈,不過功能沒有專業版多),第三方庫:requests、BeautifulSoup4、lxml、html5lib
1、首先我們先來介紹下爬蟲是什麼?
爬蟲,英文名Spider,是一段自動抓取網際網路資訊的程式,從網際網路上抓取對於我們有價值的資訊。
2、那麼爬蟲能用來幹什麼?
利用爬蟲技術抓取公司使用者資訊,分析網站使用者,網路爬蟲技術在商業銀行的應用等等
3、爬蟲的基本流程
(1)發起請求:通過url向伺服器發起request請求,請求可以包含額外的header資訊。
(2)獲取響應內容:如果伺服器正常響應,那我們將會收到一個response,response即為我們所請求的網頁內容,或許包含HTML,Json字串或者二進位制的資料(視訊、圖片)等。
(3)解析內容:如果是HTML程式碼,則可以使用網頁解析器進行解析,如果是Json資料,則可以轉換成Json物件進行解析,如果是二進位制的資料,則可以儲存到檔案進行進一步處理。
(4)儲存資料:可以儲存到本地檔案,也可以儲存到資料庫(MySQL,Redis,Mongodb等)
4、那麼現在我們開始學習爬蟲的編寫
我們以校花網為例(我們的老師一看就是老司機了,一上來就教我們爬這個,哈哈哈),網站為http://www.xiaohuar.com/,下面附上程式碼,有詳細註釋的。
# /usr/bin/env python # -*- coding: utf-8 -*- import requests from bs4 import BeautifulSoup import os #對目錄的操作:建立、刪除、移動 from urllib.request import urlretrieve #將遠端資料下載到本地。 #爬取校花資訊 def get_xiaohua_info(): #定義頭部資訊,模擬瀏覽器提交 headers={ 'UserAgent': 'Mozilla / 5.0(WindowsNT6.1;WOW64) AppleWebKit / ' '537.36(KHTML, likeGecko) Chrome / 63.0.3239.132Safari / 537.36'} # 模擬瀏覽器發出http請求:get或post方法 responses = requests.get(url=URL,headers=headers) #檢視狀態碼,如果是200則為成功 #print(responses.status_code) if responses.status_code==200: #responses.encoding設定編碼格式 responses.encoding='utf-8' #responses.text返回網頁原始碼 #responses.content返回二進位制數 #print(responses.text) #通過bs4,構造過濾器,篩選內容 #BeautifulSoup()函式的引數(二進位制內容,指定解析器:html5lib或lxml) bs = BeautifulSoup(responses.content,'html5lib') #定義過濾規則:div lanmu、div ul、div ul li #fina_all()函式引數:根據標籤名字過濾,根據屬性名#value篩選 div_list = bs.find_all('div',attrs={'class':'all_lanmu'}) file = open('校花網資料.txt','w',encoding='utf-8') txt = '' #print(div_list) #遍歷all_lanmu列表 for div_lanmu in div_list: div_title = div_lanmu.find('div',attrs={'class':'title'}) a_title = div_lanmu.find('a') #tag.string:獲取標籤內容 #print(a_title.string) lanmu_title = a_title.string txt += lanmu_title + '\n\n' ul = div_lanmu.find('ul',attrs={'class':'twoline'}) #判斷是否為空 if ul != None: li_list = div_lanmu.find_all('li') #print(li_list) #採集目標:名字,學校,點贊,路徑(圖片,二級頁面) for li in li_list: name = li.find('span').string school = li.find('b',attrs={'class':'b1'}).string like = li.find('b',attrs={'class':'b2'}).string img_path = li.find('img')['lazysrc'] two_page = li.find('a')['href'] #print(name,school,like,img_path,two_page) txt += '姓名:'+name+'\n' txt += '學校:' + school + '\n' txt += '點贊:' + like + '\n' txt += '詳情頁:' + two_page + '\n' if URL not in img_path: img_path = URL+img_path txt += '圖片:' + img_path + '\n' get_xiaohua_pic(img_path=img_path,name=name) file.write(txt) file.close() else: print('訪問不了') #爬取校花圖片並下載 def get_xiaohua_pic(img_path,name): download = 'download' if not os.path.exists(download): os.mkdir(download) #name = img_path.split('/') #拆分字串 #name = name[len(name)-1] #獲取最後一位的內容 #捕捉異常 try: urlretrieve(img_path,download+'/'+name+'.jpg') except: print('SORRY~下載不了') if __name__ == '__main__': #目標網站 URL = 'http://www.xiaohuar.com/' #呼叫函式 get_xiaohua_info()