重新調整劃設戰區,全面停止軍隊有償服務,2020年取得突破性進展。
383
本次爬取的是新浪微博移動端(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爬取新浪微博移動版用戶首頁微博
019-02-22
一級域名剛注冊的博客是一級域名,后面是一串阿拉伯數字; 二級域名可以由自己定義后面的英文或拼音字母! 三級域名訪問量要過300萬 二級域名需要一段時間的努力訪問量過1000可申請升級! 如何提高博客的訪問量 1,不斷更新你的博客日志,努力提高其數量和質量;以保證你的博客經常出現在新浪"最近更新BLOG"的列表中,提高別人進入你博客的機會! 2,主動走訪其他博友,積極參與在別人博客中的留言和評論,同時留下自己的地址以便對方的拜訪,在你給予別人的同時同樣給予了自己!別人在你博客中的回訪,閱讀,留言和評論同樣給你帶來了一次次的博客更新! 3,把你優秀的文章向新浪博客的管理員推薦,爭取自己的文字能...全部
一級域名剛注冊的博客是一級域名,后面是一串阿拉伯數字; 二級域名可以由自己定義后面的英文或拼音字母! 三級域名訪問量要過300萬 二級域名需要一段時間的努力訪問量過1000可申請升級! 如何提高博客的訪問量 1,不斷更新你的博客日志,努力提高其數量和質量;以保證你的博客經常出現在新浪"最近更新BLOG"的列表中,提高別人進入你博客的機會! 2,主動走訪其他博友,積極參與在別人博客中的留言和評論,同時留下自己的地址以便對方的拜訪,在你給予別人的同時同樣給予了自己!別人在你博客中的回訪,閱讀,留言和評論同樣給你帶來了一次次的博客更新! 3,把你優秀的文章向新浪博客的管理員推薦,爭取自己的文字能出現在新浪博客的首頁,吸引更多的人來到你的博客! 4,在有一定數量原創作品和一定的博客點擊率之后,你可以向新浪博客的管理員申請升級你的博客,二級域名的博客能讓你更好的宣傳自己,讓別人更加容易的找到你! 5,在一些收索引擎中登入注冊! 6,以上幾個方面的目的都是為了你的博客的訪問量和點擊數! 訪問量和點擊數高了就可申請升級了 申請升級 1到你主頁最下邊點新浪BLOG意見反饋留言板 申請升級 2給新浪發郵件新浪博客信箱 sinablog@ 申請升級 多申請幾次 審核通過的時候,您將會在自己BLOG的留言版上收到管理員的悄悄話,這個時候,打開你的控制面版,進入管理留言,你可以看見悄悄話的內容。
。。。。。你將獲得管理員給你的升級序列號并按照留言中的說明進一步操作完成你的BLOG升級過程! 我寫了一篇《提高博客訪問量的秘技》你可以去看一看 希望以上的回答能對你有所幫助!為你的博客祝福!博得開心快樂!! 你也可以到我那里看看關于博客的建設。
紅狼 狼行天下 嗷嗷嗷!!! 歡迎登陸我的博客 。收起