本文目錄一覽:
如何使用python爬取知乎數據並做簡單分析
一、使用的技術棧:
爬蟲:python27 +requests+json+bs4+time
分析工具: ELK套件
開發工具:pycharm
數據成果簡單的可視化分析
1.性別分佈
0 綠色代表的是男性 ^ . ^
1 代表的是女性
-1 性別不確定
可見知乎的用戶男性頗多。
二、粉絲最多的top30
粉絲最多的前三十名:依次是張佳瑋、李開復、黃繼新等等,去知乎上查這些人,也差不多這個排名,說明爬取的數據具有一定的說服力。
三、寫文章最多的top30
四、爬蟲架構
爬蟲架構圖如下:
說明:
選擇一個活躍的用戶(比如李開復)的url作為入口url.並將已爬取的url存在set中。
抓取內容,並解析該用戶的關注的用戶的列表url,添加這些url到另一個set中,並用已爬取的url作為過濾。
解析該用戶的個人信息,並存取到本地磁盤。
logstash取實時的獲取本地磁盤的用戶數據,並給elsticsearchkibana和elasticsearch配合,將數據轉換成用戶友好的可視化圖形。
五、編碼
爬取一個url:
解析內容:
存本地文件:
代碼說明:
* 需要修改獲取requests請求頭的authorization。
* 需要修改你的文件存儲路徑。
源碼下載:點擊這裡,記得star哦!https : // github . com/forezp/ZhihuSpiderMan六、如何獲取authorization
打開chorme,打開https : // www. zhihu .com/,
登陸,首頁隨便找個用戶,進入他的個人主頁,F12(或鼠標右鍵,點檢查)七、可改進的地方
可增加線程池,提高爬蟲效率
存儲url的時候我才用的set(),並且採用緩存策略,最多只存2000個url,防止內存不夠,其實可以存在redis中。
存儲爬取後的用戶我說採取的是本地文件的方式,更好的方式應該是存在mongodb中。
對爬取的用戶應該有一個信息的過濾,比如用戶的粉絲數需要大與100或者參與話題數大於10等才存儲。防止抓取了過多的殭屍用戶。
八、關於ELK套件
關於elk的套件安裝就不討論了,具體見官網就行了。網站:https : // www . elastic . co/另外logstash的配置文件如下:
從爬取的用戶數據可分析的地方很多,比如地域、學歷、年齡等等,我就不一一列舉了。另外,我覺得爬蟲是一件非常有意思的事情,在這個內容消費升級的年代,如何在廣闊的互聯網的數據海洋中挖掘有價值的數據,是一件值得思考和需不斷踐行的事情。
python怎麼爬取數據
根據你要抓取頁面的源碼字段來進行爬取。根據對應的源碼找到你的需求數據,主要用到requests+BeautifulSoup,其中requests用於請求頁面,BeautifulSoup用於解析頁面。
python怎麼爬取網站數據
很簡單,三步,用爬蟲框架scrapy
1. 定義item類
2. 開發spider類
3. 開發pipeline
如果有不會的,可以看一看《瘋狂python講義》
如何用Python爬取數據?
方法/步驟
在做爬取數據之前,你需要下載安裝兩個東西,一個是urllib,另外一個是python-docx。
請點擊輸入圖片描述
然後在python的編輯器中輸入import選項,提供這兩個庫的服務
請點擊輸入圖片描述
urllib主要負責抓取網頁的數據,單純的抓取網頁數據其實很簡單,輸入如圖所示的命令,後面帶鏈接即可。
請點擊輸入圖片描述
抓取下來了,還不算,必須要進行讀取,否則無效。
請點擊輸入圖片描述
5
接下來就是抓碼了,不轉碼是完成不了保存的,將讀取的函數read轉碼。再隨便標記一個比如XA。
請點擊輸入圖片描述
6
最後再輸入三句,第一句的意思是新建一個空白的word文檔。
第二句的意思是在文檔中添加正文段落,將變量XA抓取下來的東西導進去。
第三句的意思是保存文檔docx,名字在括號裏面。
請點擊輸入圖片描述
7
這個爬下來的是源代碼,如果還需要篩選的話需要自己去添加各種正則表達式。
python可以爬取什麼數據
一、爬取我們所需要的一線鏈接
channel_extract.py
這裡的一線鏈接也就是我們所說的大類鏈接:
from bs4 import BeautifulSoupimport requests
start_url = ”host_url = ”def get_channel_urls(url):
wb_data = requests.get(url)
soup = BeautifulSoup(wb_data.text, ‘lxml’)
links = soup.select(‘.fenlei dt a’) #print(links)
for link in links:
page_url = host_url + link.get(‘href’)
print(page_url)#get_channel_urls(start_url)channel_urls = ”’
”’123456789101112131415161718192021222324252627282930313233343536
那麼拿我爬取的58同城為例就是爬取了二手市場所有品類的鏈接,也就是我說的大類鏈接;
找到這些鏈接的共同特徵,用函數將其輸出,並作為多行文本儲存起來。
二、獲取我們所需要的詳情頁面的鏈接和詳情信息
page_parsing.py
1、說說我們的數據庫:
先看代碼:
#引入庫文件from bs4 import BeautifulSoupimport requestsimport pymongo #python操作MongoDB的庫import reimport time#鏈接和建立數據庫client = pymongo.MongoClient(‘localhost’, 27017)
ceshi = client[‘ceshi’] #建ceshi數據庫ganji_url_list = ceshi[‘ganji_url_list’] #建立表文件ganji_url_info = ceshi[‘ganji_url_info’]123456789101112
2、判斷頁面結構是否和我們想要的頁面結構相匹配,比如有時候會有404頁面;
3、從頁面中提取我們想要的鏈接,也就是每個詳情頁面的鏈接;
這裡我們要說的是一個方法就是:
item_link = link.get(‘href’).split(‘?’)[0]12
這裡的這個link什麼類型的,這個get方法又是什麼鬼?
後來我發現了這個類型是
class ‘bs4.element.Tab1
如果我們想要單獨獲取某個屬性,可以這樣,例如我們獲取它的 class 叫什麼
print soup.p[‘class’]
#[‘title’]12
還可以這樣,利用get方法,傳入屬性的名稱,二者是等價的
print soup.p.get(‘class’)#[‘title’]12
下面我來貼上代碼:
#爬取所有商品的詳情頁面鏈接:def get_type_links(channel, num):
list_view = ‘{0}o{1}/’.format(channel, str(num)) #print(list_view)
wb_data = requests.get(list_view)
soup = BeautifulSoup(wb_data.text, ‘lxml’)
linkOn = soup.select(‘.pageBox’) #判斷是否為我們所需頁面的標誌;
#如果爬下來的select鏈接為這樣:div.pageBox ul li:nth-child(1) a span 這裡的:nth-child(1)要刪掉
#print(linkOn)
if linkOn:
link = soup.select(‘.zz .zz-til a’)
link_2 = soup.select(‘.js-item a’)
link = link + link_2 #print(len(link))
for linkc in link:
linkc = linkc.get(‘href’)
ganji_url_list.insert_one({‘url’: linkc})
print(linkc) else: pass1234567891011121314151617181920
4、爬取詳情頁中我們所需要的信息
我來貼一段代碼:
#爬取趕集網詳情頁鏈接:def get_url_info_ganji(url):
time.sleep(1)
wb_data = requests.get(url)
soup = BeautifulSoup(wb_data.text, ‘lxml’) try:
title = soup.select(‘head title’)[0].text
timec = soup.select(‘.pr-5’)[0].text.strip()
type = soup.select(‘.det-infor li span a’)[0].text
price = soup.select(‘.det-infor li i’)[0].text
place = soup.select(‘.det-infor li a’)[1:]
placeb = [] for placec in place:
placeb.append(placec.text)
tag = soup.select(‘.second-dt-bewrite ul li’)[0].text
tag = ”.join(tag.split()) #print(time.split())
data = { ‘url’ : url, ‘title’ : title, ‘time’ : timec.split(), ‘type’ : type, ‘price’ : price, ‘place’ : placeb, ‘new’ : tag
}
ganji_url_info.insert_one(data) #向數據庫中插入一條數據;
print(data) except IndexError: pass123456789101112131415161718192021222324252627282930
四、我們的主函數怎麼寫?
main.py
看代碼:
#先從別的文件中引入函數和數據:from multiprocessing import Poolfrom page_parsing import get_type_links,get_url_info_ganji,ganji_url_listfrom channel_extract import channel_urls#爬取所有鏈接的函數:def get_all_links_from(channel):
for i in range(1,100):
get_type_links(channel,i)#後執行這個函數用來爬取所有詳情頁的文件:if __name__ == ‘__main__’:# pool = Pool()# # pool = Pool()# pool.map(get_url_info_ganji, [url[‘url’] for url in ganji_url_list.find()])# pool.close()# pool.join()#先執行下面的這個函數,用來爬取所有的鏈接:if __name__ == ‘__main__’:
pool = Pool()
pool = Pool()
pool.map(get_all_links_from,channel_urls.split())
pool.close()
pool.join()1234567891011121314151617181920212223242526
五、計數程序
count.py
用來顯示爬取數據的數目;
import timefrom page_parsing import ganji_url_list,ganji_url_infowhile True: # print(ganji_url_list.find().count())
# time.sleep(5)
print(ganji_url_info.find().count())
time.sleep(5)
原創文章,作者:BBSWK,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/317454.html