本次爬取的是新浪微博移動端(https://m.weibo.cn/),爬取的數據是用戶微博首頁的第一條微博(如下圖),包括文字內容、轉發量、評論數、點贊數和發布時間,還有用戶名和其所在地區(后面可以分析不同地區微博用戶的關心的熱點話題)。
Python版本:3.6
相關模塊:
import scrapy from sinaweibo.items import SinaweiboItem import json import re import copy
瀏覽發現使用的是使用Ajax渲染的網頁,微博數據(https://m.weibo.cn/api/container/getIndex?containerid=102803_ctg1_5088-ctg1_5088&openApp=0&since_id=1)存儲在json格式網頁中,所以思路是先通過微博數據得到用戶url(如下圖),再來爬取后續內容。
獲取第一條微博數據
也是使用了Ajax渲染的網頁,跟上面一樣找到網頁入口就行了。請求網址如下:
這樣看網址的話毫無規律可言,簡化后發現 https://m.weibo.cn/api/container/getIndex?containerid=1076032554757470就可以進入。而且containerid=107603(***)這里,括號里的數字剛好是用戶的id號,因此我們可以通過這個來構造網頁。
用戶所在地在其基本資料中,如下圖
地址為:
同樣進行簡化得到:https://m.weibo.cn/api/container/getIndex?containerid=230283(***)-INFO其中括號里面是用戶id號。
通過以上分析可知,獲取用戶的 id 號是本次爬取數據的關鍵,只需要用 id 構成網址,后面的爬取就相對簡單了。下面是編程部分。
items.py定義爬蟲字段
import scrapy ''' 遇到不懂的問題?Python學習交流群:821460695滿足你的需求,資料都已經上傳群文件,可以自行下載! ''' class SinaweiboItem(scrapy.Item): # define the fields for your item here like: # name=scrapy.Field() name=scrapy.Field() #用戶名 first_news=scrapy.Field() #首條微博 dates=scrapy.Field() #發布時間 zhuanzai=scrapy.Field() #轉載數 comment=scrapy.Field() #評論數 agree=scrapy.Field() #點贊數 city=scrapy.Field() #所在地區
編寫爬取代碼
# -*- coding: utf-8 -*- import scrapy from sinaweibo.items import SinaweiboItem import json import re import copy ''' 遇到不懂的問題?Python學習交流群:821460695滿足你的需求,資料都已經上傳群文件,可以自行下載! ''' class WeibodiyuSpider(scrapy.Spider): name='weibodiyu' #爬蟲名 allowed_domains=['m.weibo.cn'] #只在該域名內爬取 start_urls=['https://m.weibo.cn/api/container/getIndex?containerid=102803_ctg1_4188_-_ctg1_4188&openApp=0&since_id=1' ] ? def parse1(self, response): infos=json.loads(response.body) #將內容轉為json對象 item=response.meta['item'] #利用meta方法傳入item city=response.meta['city'] #傳入城市 try: name=infos["data"]["cards"][0]["mblog"]["user"]["screen_name"] #爬取名字 first_news=re.findall('([\u4e00-\u9fa5]+)', str(infos["data"]["cards"][0]["mblog"]["text"]), re.S) #爬取微博內容,使用正則去除一些雜項如網頁代碼 dates=infos["data"]["cards"][0]["mblog"]["created_at"] #發布時間 zhuanzai=infos["data"]["cards"][0]["mblog"]["reposts_count"] #轉載數 comment=infos["data"]["cards"][0]["mblog"]["comments_count"] #評論數 agree=infos["data"]["cards"][0]["mblog"]["attitudes_count"] #點贊數 #將數據賦給item item['name']=name item['first_news']=first_news item['dates']=dates item['zhuanzai']=zhuanzai item['comment']=comment item['agree']=agree item['city']=city return item #返回 except IndexError or KeyError: pass ? def parse2(self, response): #獲取所在地區函數 infos=json.loads(response.body) try: item=response.meta['item'] #傳入item city_cont=str(infos["data"]["cards"][1]["card_group"]) city=re.findall('card_type.*?所在地.*?item.*?:(.*?)}]', city_cont, re.S)[0].replace('\'', '').replace( ' ', '') #城市 item['city']=city ids=response.meta['ids'] #傳入id并賦給ids變量 n_url1='https://m.weibo.cn/api/container/getIndex?&containerid=107603' + ids yield scrapy.Request(n_url1, meta={'item': item, 'city': copy.deepcopy(city)}, callback=self.parse1) #執行完上述命令后的步驟 except IndexError or KeyError: pass ? def parse(self, response): datas=json.loads(response.body) item=SinaweiboItem() for i in range(0, 20): try: ids=str(datas["data"]["cards"][i]["mblog"]["user"]["id"]) #獲取用戶id n_url2='https://m.weibo.cn/api/container/getIndex?containerid=230283{}_-_INFO'.format(ids) yield scrapy.Request(n_url2, meta={'item': item, 'ids': copy.deepcopy(ids)}, callback=self.parse2) #進入parse2函數執行命令 except IndexError or KeyError: pass social_urls=[ 'https://m.weibo.cn/api/container/getIndex?containerid=102803_ctg1_4188_-_ctg1_4188&openApp=0&since_id={}'.format( str(i)) for i in range(2, 100)] celebritys_urls=[ 'https://m.weibo.cn/api/container/getIndex?containerid=102803_ctg1_4288_-_ctg1_4288&openApp=0&since_id={}'.format( str(j)) for j in range(1, 100)] hots_urls=['https://m.weibo.cn/api/container/getIndex?containerid=102803&openApp=0&since_id={}'.format(str(t)) for t in range(1, 100)] urls=celebritys_urls + social_urls + hots_urls #入口網址 for url in urls: yield scrapy.Request(url, callback=self.parse)
這里要注意 scrpay.Request 函數的meta參數,它是一個字典,用來進行參數傳遞,如上面代碼所示,我想在parse2()函數中用到parse()函數中爬取的用戶id,就需要進行設置,這里就不過多解釋了,其實我也是處于摸著石頭過河的理解程度,想深入了解的朋友可自行百度。
這次我只將內容導出到了csv文件中,方便后續篩選制作詞云,如果爬取的數據較多的話,可以存儲到數據庫中。
BOT_NAME='sinaweibo' ? SPIDER_MODULES=['sinaweibo.spiders'] NEWSPIDER_MODULE='sinaweibo.spiders' ? USER_AGENT: 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.103 Safari/537.36' #消息頭 DOWNLOAD_DELAY=0.5 #延時0.5s # Crawl responsibly by identifying yourself (and your website) on the user-agent #USER_AGENT='sinaweibo (+http://www.yourdomain.com)' FEED_URI='file:C:/Users/lenovo/Desktop/weibo.csv' #存入文件位置 FEED_FORMAT='csv' #保存格式 ITEM_PIPELINES={'sinaweibo.pipelines.SinaweiboPipeline': 300} #管道設置 # Obey robots.txt rules ROBOTSTXT_OBEY=False FEED_EXPORT_ENCODING='UTF8' #編碼格式
本次沒有下載圖片及其他內容了,因此pipelines.py文件就沒有編寫內容了。爬取的部分數據如下:
到這里爬蟲部分就結束了,本次爬取的內容也較為簡單,下面的話就是使用其中的部分數據來生成詞云。
在文件中新建了一個 weibo_analysis.py 的文件,使用jieba庫來進行分詞,在此之前,需要先將所需數據提取出來,這里使用pandas就可以。
這部分程序很簡單,就不廢話了,直接上代碼:
import csv import pandas as pd import jieba.analyse ''' 遇到不懂的問題?Python學習交流群:821460695滿足你的需求,資料都已經上傳群文件,可以自行下載! ''' def get_ciyun(city): #進行分詞 tags=jieba.analyse.extract_tags(str(city),topK=100,withWeight=True) for item in tags: print(item[0]+'\t'+str(int(item[1]*1000))) ? ? need_citys=['北京', '上海', '湖南', '四川', '廣東'] beijing=[] shanghai=[] hunan=[] sichuan=[] gd=[] pd.set_option('expand_frame_repr', True) #可換行顯示 pd.set_option('display.max_rows', None) #顯示所有行 pd.set_option('display.max_columns', None) #顯示所有列 df=pd.read_csv('C:\\Users\lenovo\Desktop\weibo.csv') #讀取文件內容并轉化為dataframes對象 ? contents=df['first_news'] #取微博內容 city=df['city'] #取城市 for i in range(len(city)): if need_citys[0] in city[i]: #判斷并存入 beijing.append(contents[i]) elif need_citys[1] in city[i]: shanghai.append(contents[i]) elif need_citys[2] in city[i]: hunan.append(contents[i]) elif need_citys[3] in city[i]: sichuan.append(contents[i]) elif need_citys[4] in city[i]: gd.append(contents[i]) else: pass ? #輸出 get_ciyun(beijing) print('-'*20) get_ciyun(shanghai) print('-'*20) get_ciyun(hunan) print('-'*20) get_ciyun(sichuan) print('-'*20) get_ciyun(gd)
本次是通過Tagul網站在制作詞云,將上方輸出的詞頻導入,選擇好詞云形狀、字體(不支持中文可自行導入中文字體包)、顏色等點擊可視化就能生成了,非常方便。
下面是我本次生成的詞云圖片:
Scrapy爬取新浪微博移動版用戶首頁微博
本文主要從路由交換的角度講述一臺PC訪問新浪時的整個過程。掌握PC訪問網站的整個過程,便于后續排查相關問題。
案例拓撲
DNS解析過程
PC發出訪問www.sina.com.cn的請求后,首先電腦會查詢自己的DNS緩存記錄,若有記錄則直接使用,若沒有記錄則向電腦配置的DNS發出DNS請求。如下
請求www.sina.com.cn對應的IP地址是多少,此時數據封裝如下:
源IP | 目標Ip | 源MAC | 目標MAC |
192.200.121.137 | 8.8.8.8 | MAC_A | MAC_B |
DNS服務器的回復www.sina.com.cn對應的IP地址121.14.1.190,此時PC上收到的數據包如下。
源IP | 目標Ip | 源MAC | 目標MAC |
8.8.8.8 | 192.200.121.137 | MAC_B | MAC_A |
PC發出訪問請求
經過上一步獲取到Sina對應的IP地址后,PC由發出訪問請求,通過查詢目標IP發現不是自己同一個網段,則將數據發給網關進行處理,此時數據包如下。
源IP | 目標Ip | 源MAC | 目標MAC |
192.200.121.137 | 121.14.1.190 | MAC_A | MAC_B |
交換機處理
交換機收到數據包后,通過查找路由得知要從MAC_C這個接口發送出去,于是對數據進行封裝發給路由器,此時數據包如下
源IP | 目標Ip | 源MAC | 目標MAC |
192.200.121.137 | 121.14.1.190 | MAC_C | MAC_D |
路由器處理
路由器收到數據包后,通過查找路由得知要從MAC_E這個接口發送出去,同時匹配SNAT規則,將數據的源IP轉換成公網IP地址,此時數據包如下:
源IP | 目標Ip | 源MAC | 目標MAC |
118.250.165.201 | 121.14.1.190 | MAC_E | MAC_F |
Sina服務器處理
經過公網的數據傳輸后,Sina服務器收到了數據包進行處理后進行回復,此過程和請求包是一個相反的過程就不再重復描述。
浪圍棋windows版二維碼
“烏鷺玉楸枰,黑白競輸贏”,新浪棋牌全方位報道國際國內賽事,為愛好者提供熱門新聞、棋壇趣事、技術講解,與中日韓棋院緊密合作,為廣大愛好者打造下棋交流的全球平臺,與國內外棋友隔空對決,全方位零距離互動,盡享“手談”樂趣。新浪圍棋不僅有電腦windows版、安卓版、iPhone版、ipad版還有免安裝的頁面版(http://duiyi.sina.com.cn/m/),為愛好者隨時隨地觀戰競猜交流提供極大便利。
溫馨提示:新浪圍棋windows版已升級,如電腦未自動更新,請重新下載最新版本,給您帶來不便深表歉意。
(新浪圍棋windows版下載地址 http://duiyi.sina.com.cn/download/SinaWeiqi_20180823A.exe)
新浪圍棋安卓系統客戶端方便廣大棋友,可在網上對弈,觀看大賽直播,我們正在不斷完善客戶端及下載方式,力爭為您提供更好的手機圍棋平臺,同時歡迎廣大棋友提出寶貴意見。可掃描或長按二維碼下載新浪圍棋安卓版。
(安卓版下載地址http://duiyi.sina.com.cn/download/sinaweiqi_20131121.apk)
新浪圍棋iPhone版畫面清爽,指尖觸碰操作簡潔,還新增了在線打譜、試下、形勢分析、趣味死活題等功能。iPhone作棋盤,與全球棋友在線對弈、觀戰評棋,“烏鷺玉楸枰,黑白競輸贏”,感受圍棋博大精深內涵。請在蘋果應用商店(App store)搜索“新浪圍棋”下載安裝。
新浪圍棋ipad專用版,在畫面簡潔易操作的基礎上,還新增了在線打譜、趣味死活題等功能。ipad作棋盤,指尖靈動,落子有聲,與棋友在線對弈,愿您盡情享受“手談”樂趣。請在蘋果應用商店(App store)搜索“新浪圍棋HD”下載安裝。
新浪圍棋官方微信訂閱號“棋道經緯”
新浪圍棋官方微信已開通,關注新浪圍棋官方微信“棋道經緯”可及時全方位了解國際國內賽事及日程,并可隨時溝通互動。請在微信“添加朋友”中選擇查找公眾號,搜索“棋道經緯”或“sinachess”,也可直接通過掃描或長按二維碼查找新浪圍棋公眾號。
官方微信公眾號“新浪圍棋”
新浪棋牌官方微信公眾號不僅會推送各項棋牌類賽事新聞報道,還將不定期推出貼近棋迷的互動活動以及派福利等驚喜。打開微信,點擊右上角的“+”號,選擇“掃一掃”的功能,掃描新浪棋牌公眾號二維碼,點擊關注。或選擇“添加朋友”的功能,找到“微信公眾號”一欄,并在搜索欄輸入“新浪棋牌”或“sinago2016”,點擊添加到通訊錄。
新浪圍棋免安裝版閃亮登場
新浪棋友通過免安裝的新浪圍棋簡潔頁面版即可與全球棋友觀戰評棋,感受圍棋博大精深內涵。新浪圍棋頁面版畫面清爽,指尖觸碰操作簡潔,還有在線打譜、試下、形勢分析、直播預告、新聞資訊等功能。 1、解說屏和聊天大廳一目了然,與其他客戶端完全打通,交流無障礙。棋友還可選擇只看母語,屏蔽外文,令屏幕更清爽。 2、棋盤下方即有轉播目錄,直播和已結束比賽應有盡有, 3、可以隨時隨地隨意“形勢判斷”! 4、押分信息詳盡,“神燈”還是“明燈”拉出來溜溜吧! 5、“直播”“新聞”“棋譜”“商城”應有盡有,一列排開恭候大駕。 6、直播日程、最全棋譜庫敬請關注。 7、押分、聊天等請先輸入新浪昵稱和密碼登錄,謝謝。 綜上所述,新浪圍棋簡潔免安裝版盡可能為棋友提供隨時隨地看棋的便利,不完善之處在加緊改善,更多功能還有待您來摸索挖掘,謝謝。(網址http://duiyi.sina.com.cn/m/)