Ps: 重要的事情說三遍!!! 結尾有彩蛋,結尾有彩蛋,結尾有彩蛋。javascript
若是本身須要爬**(cai)蟲(ji)的數據量比較大,爲了防止被網站封Ip,能夠分時段爬取,另外對於爬到的數據通常是用來存儲數據庫,這就須要對數據進行去重處理,記錄上次爬取的狀態,就能夠實如今爬蟲中斷後,能夠快速繼續上次的狀態,實現增量爬取,這裏能夠參考我以前寫過的一個新聞採集,增量採集新聞數據,本文寫的對新浪微博的數據採集和處理完整代碼在個人Github。** 玩微博的人大多數應該知道微博搞笑排行榜的,恰好寫這篇文以前看到榜姐1月8號0點話題是**一人說一個,追女孩的小道理**,感受這個話題簡直是對廣大單身男性的福利啊,ヾ(✿゚▽゚)ノ,故有了何不就採集一下評論來分析一波的想法。html
做爲一個爬蟲菜鳥來講,若是不會使用代理IP池,同時對網站的反爬機制不太清楚,建議先去看下網站是否本身提供的有API,今天咱們要爬取的網站是新浪微博,固然新浪網做爲爲全球用戶24小時提供全面及時的中文資訊的大網站,必定是提供本身的API接口的。這樣的大網站,一定是經歷了無數場爬蟲與反爬之間的戰爭,也必定有很健全的反爬策略,因此咱們能夠經過調用新浪微博的開放平臺來獲取咱們想要的信息。使用以前請詳細閱讀API文檔,在開放平臺認證爲開發者,附App key連接。java
# 若是這裏引入失敗,能夠直接下載SDK和文件放一塊就ok
from weibo import APIClient
import webbrowser
import sys
reload(sys)
sys.setdefaultencoding('utf-8')
APP_KEY = '你的App Key ' # 獲取的app key
APP_SECRET = '你的AppSecret' # 獲取的appsecret
CALLBACK_URL = 'https://api.weibo.com/oauth2/default.html' #回調連接
# 在網站設置"使用微博帳號登錄"的連接,當用戶點擊連接後,引導用戶跳轉至以下地址
client = APIClient(app_key=APP_KEY, app_secret=APP_SECRET, redirect_uri=CALLBACK_URL)
# 獲得受權頁面的url,利用webbrowser打開這個url
url = client.get_authorize_url()
webbrowser.open_new(url) #打開默認瀏覽器獲取code參數
# 獲取URL參數code:
print '輸入url中code後面的內容後按回車鍵:'
code = raw_input() # 人工輸入網址後面的code內容
r = client.request_access_token(code) # 得到用戶受權
access_token = r.access_token # 新浪返回的token,相似abc123xyz456
expires_in = r.expires_in
# 設置獲得的access_token,client能夠直接調用API了
client.set_access_token(access_token, expires_in)
複製代碼
獲取某個用戶最新發表的微博列表 python
uid 的獲取方式,咱們點開不一樣的微博,會發現連接中https://m.weibo.cn/u/2706896955?sudaref=login.sina.com.cn&display=0&retcode=6102 u以後的數字就是用戶的uid。git
content = client.statuses.user_timeline(uid=2706896955, count=100)
複製代碼
返回的結果是json格式的github
{
"statuses": [
{
"created_at": "Tue May 31 17:46:55 +0800 2011",
"id": 11488058246,
"text": "求關注。",
"source": "<a href="http://weibo.com" rel="nofollow">新浪微博</a>",
"favorited": false,
"truncated": false,
"in_reply_to_status_id": "",
"in_reply_to_user_id": "",
"in_reply_to_screen_name": "",
"geo": null,
"mid": "5612814510546515491",
"reposts_count": 8,
"comments_count": 9,
"annotations": [],
"user": {
"id": 1404376560,
"screen_name": "zaku",
"name": "zaku",
"province": "11",
"city": "5",
"location": "北京 朝陽區",
"description": "人生五十年,乃如夢如幻;有生斯有死,壯士復何憾。",
"url": "http://blog.sina.com.cn/zaku",
"profile_image_url": "http://tp1.sinaimg.cn/1404376560/50/0/1",
"domain": "zaku",
"gender": "m",
"followers_count": 1204,
"friends_count": 447,
"statuses_count": 2908,
"favourites_count": 0,
"created_at": "Fri Aug 28 00:00:00 +0800 2009",
"following": false,
"allow_all_act_msg": false,
"remark": "",
"geo_enabled": true,
"verified": false,
"allow_all_comment": true,
"avatar_large": "http://tp1.sinaimg.cn/1404376560/180/0/1",
"verified_reason": "",
"follow_me": false,
"online_status": 0,
"bi_followers_count": 215
}
},
...
],
"previous_cursor": 0, // 暫未支持
"next_cursor": 11488013766, // 暫未支持
"total_number": 81655
}
複製代碼
假設咱們想要查看的是微博信息內容調用text便可
for info in content.comments:
text = info.text
複製代碼
chrome瀏覽器右鍵檢查查看network這些老套路我就不說了,不懂得能夠翻Python網絡爬蟲(一)- 入門基礎 從頭開始看。 另外:代碼是針對新浪微博移動端 m.weibo.cn/ 進行信息採集,之因此爬移動端而不是PC全部社交網站爬蟲,優先選擇爬移動版(不要來問我爲何好爬,我也不知道 逃web
'https://m.weibo.cn/api/comments/show?id=' + 微博id + '&page=' + 頁碼
點來連接https://m.weibo.cn/single/rcListformat=cards&id=4193705642468999&type=comment&hot=0&page=2即爲返回的json格式的數據sql
接下來直接上代碼chrome
import re
import time
import requests
uid = '4193705642468999'
url = 'https://m.weibo.cn/single/rcList?format=cards&id=' + uid + '&type=comment&hot=0&page={}'
headers = {
"Accept": "application/json, text/javascript, */*; q=0.01",
"Accept-Encoding": "gzip, deflate, br",
"Accept-Language": "zh-CN,zh;q=0.9",
"Connection": "keep-alive",
"Cookie": "你的cookie",
"Host": "m.weibo.cn",
"Referer": "https://m.weibo.cn/status/" + uid,
"User-Agent": "Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.75 Mobile Safari/537.36",
"X-Requested-With": "XMLHttpRequest",
}
i = 0
comment_num = 1 # 第幾條評論
while True:
res = requests.get(url=url.format(i), headers=headers)
r = res.json()
content = r[0]['card_group']
if r.status_code == 200:
try:
for j in range(0, len(content)):
hot_data = content[j]
comment_id = hot_data['user']['id'] # 用戶id
user_name = hot_data['user']['screen_name'] # 用戶名
created_at = hot_data['created_at'] # 評論時間
comment = re.sub('<.*?>|回覆<.*?>:|[\U00010000-\U0010ffff]|[\uD800-\uDBFF][\uDC00-\uDFFF]', '', hot_data['text']) # 評論內容
like_counts = hot_data['like_counts'] # 點贊數
comment_num += 1
i += 1
time.sleep(3)
except Exception as e:
logger.debug(e)
else:
break
複製代碼
接下來就是對數據的保存和處理了。 注意: 新浪畢竟是大廠,對爬蟲確定有本身的反爬策略,爲了防止訪問頻繁被封禁,能夠設置代理ip池,限制抓取時間等等。你問我怎麼知道的,我纔不會告訴你~ 數據庫
由於如今愈來愈多的公司開始逐漸使用PostgreSQL做爲公司數據庫,這裏咱們就把數據存儲於Postgresql,爲了使咱們的整個項目更加工程化,咱們把對數據庫的操做單獨定義方法。
# 對數據庫實現查詢的方法
def execute_select(conn, sql, params=None):
with conn.cursor() as cur:
if params:
cur.execute(sql, params)
else:
cur.execute(sql)
return cur.fetchall()
# 對數據庫實現增刪改的方法
def execute_sql(conn, sql, params=None):
with conn.cursor() as cur:
if params:
cur.execute(sql, params)
else:
cur.execute(sql)
複製代碼
大功告成了一半,運行代碼 --> 保存數據庫 接下來固然是對咱們拿下的數據進行分(hu)析(shuo)展(ba)示(dao)了(千年不變的套路hhhhhh..)
既然說到對中文數據的處理和展現,咱們經常使用的就幾種方法,詞雲、情感分析、數據可視化展現,這裏我就必須提到python中比較出名的一箇中文NLP庫:snowNLP,snowNLP可以根據給出的句子生成一個0-1之間的值,當值大於0.5時表明句子的情感極性偏向積極,當分值小於0.5時,情感極性偏向消極,越偏向兩頭,情感就越敏感。使用一個庫最簡單暴力的方法———讀官方文檔。
我隨機抽取了兩張結果,簡單標註了一下,咱們不難發現涉及到主動、長得帥、有錢的、要勇敢、口紅、情商這幾個詞生成的值都在0.9,矮矬窮、渣、你他媽這些詞生成的值都在0.5如下,**林佳,給我留一口啊!**是什麼鬼,居然0.7???
def word_cloud(comment):
logger.info('製做詞雲圖...word_cloud')
comment_text = ''
back_coloring = imread("static/heart.jpg")
cloud = WordCloud(font_path='static/simhei.ttf',
background_color="white", # 背景顏色
max_words=2000,
mask=back_coloring,
max_font_size=100,
width=1000, height=860, margin=2,
random_state=42,
)
for li in comment:
comment_text += ' '.join(jieba.cut(li, cut_all=False))
wc = cloud.generate(comment_text)
image_colors = ImageColorGenerator(back_coloring)
plt.figure("wordc")
plt.imshow(wc.recolor(color_func=image_colors))
wc.to_file('微博評論詞雲圖.png')
複製代碼
def snow_analysis(comment):
logger.info('天然語言處理NLP...snow_analysis')
sentimentslist = []
for li in comment:
s = SnowNLP(li)
# logger.debug(li)
# logger.debug(li, s.sentiments)
print(li, s.sentiments)
sentimentslist.append(s.sentiments)
fig1 = plt.figure("sentiment")
plt.hist(sentimentslist, bins=np.arange(0, 1, 0.02))
plt.show()
複製代碼
能夠看到情感值在接近0.6~1.0左右位置頻率較高,說明粉絲們對於這則微博的評論積極態度佔大多數,由於這個微博自己就是偏積極性的,得出的結果也說明了這個問題。
咱們的初衷是爲了如何追女孩子,我就統計了一下出現比較多的評論(有博主爲了搶熱門頻繁刷評論?),三行代碼就能夠搞定,這個Counter的用法以前也寫過,傳送門:使用python中的第三方庫Counter
# 使用python的第三方庫
from collections import Counter
userdict = Counter(comment_list)
print(userdict.most_common(8))
複製代碼
1.必定要主動啊 否則等女孩子主動嗎!可是主動也要適度 別讓對方以爲懼怕…
2.人品要好,三觀要正確,責任感,孝順善良這些內在因素也很重要
3.追某個女孩時時 只追她一我的 千萬別撩別人
4.言談幽默風趣但不要輕佻
5.對她當女兒養吧
6.女孩子是要用來寵的,不是來跟她講道理的。
7.多陪她聊天,多關心她,愛護她,保護她,瞭解她,寵她,尊重她,給她安全感
8.不要曖昧不清,不要套路
有不少男生抱怨本身追不到喜歡的姑娘,追了幾個星期就放棄了。其實,要改變的是你本身,只要努力向上,讓本身變得更優秀,同時對姑娘保持適當的關心和熱情,堅持幾個月,總有一天你就會發現,不喜歡就是不喜歡這是沒有辦法的事情。
最後,因爲這篇博客是2018年第一篇博客,那麼就祝你們狗年脫單了~