爬取微博数据

第一步:分析网址

这里以女明星李冰冰的网页版微博作为爬取对象。

打开 Chrome 浏览器的调试功能,进入NETWORK,得知微博数据的的接口是 https://m.weibo.cn/api/container/getIndex ,提取参数。

id=1192515960&
luicode=10000011&
lfid=100103type%3D3%26q%3D%E6%9D%8E%E5%86%B0%E5%86%B0&
featurecode=20000320&
type=user&
containerid=1076031192515960

再来分析接口的返回结果,返回数据是一个JSON字典结构,total 是微博总条数,每一条具体的微博内容封装在 cards 数组中,具体内容字段是里面的 text 字段。

{
    "cardlistInfo": {
        "containerid": "1076031192515960", "total": 4754, "page": 2 }, "cards": [ { "card_type": 9, "mblog": { "created_at": "08-26", "idstr": "4145069944506080", "text": "瑞士一日游圆满结束...", } }] }

第二步:构建请求头和查询参数

分析完网页后,用 requests 爬取数据。

headers = {
    "Host": "m.weibo.cn", "Referer": "https://m.weibo.cn/u/1705822647", "User-Agent": "Mozilla/5.0 (iPhone; CPU iPhone OS 9_1 like Mac OS X) AppleWebKit/601.1.46 (KHTML, like Gecko) " "Version/9.0 Mobile/13B143 Safari/601.1", } params = {"id": "{id}", "luicode": "20000174", "featurecode": "20000320", "type": "uid", "value": "1705822647", "containerid": "{containerid}", "page": "{page}"} 

id是微博用户的id

containerid具体不明,可能是相关参数

page 分页参数

第三步:构造简单爬虫

通过返回的数据能查询到总微博条数 total,爬取数据直接利用 requests 提供的方法把 json 数据转换成 Python 字典对象,从中提取出所有的 text 字段的值并放到 blogs 列表中,提取文本之前进行简单过滤。顺便把数据写入文件。

def fetch_data(uid=None, container_id=None): """  抓取数据,并保存到CSV文件中  :return:  """ page = 0 total = 4754 blogs = [] for i in range(0, total // 10): params['id'] = id params['page'] = str(page) params['containerid'] = container_id res = requests.get(url, params=params, headers=HEADERS) cards = res.json().get("cards") for card in cards: # 每条微博的正文内容 if card.get("card_type") == 9: text = card.get("mblog").get("text") text = clean_html(text) blogs.append(text) page += 1 print("抓取第{page}页,目前总共抓取了 {count} 条微博".format(page=page, count=len(blogs))) with codecs.open('weibo1.txt', 'w', encoding='utf-8') as f: f.write("\n".join(blogs))


第四步:分词处理并构建词云

爬虫了所有数据之后,先进行分词,这里用的是jieba分词,按照中文语境将句子进行分词处理,分词过程中过滤掉停止词,处理完之后找一张参照图,然后根据参照图通过词语拼装成图。

def generate_image():
    data = [] jieba.analyse.set_stop_words("./stopwords.txt") with codecs.open("weibo1.txt", 'r', encoding="utf-8") as f: for text in f.readlines(): data.extend(jieba.analyse.extract_tags(text, topK=20)) data = " ".join(data) mask_img = imread('./52f90c9a5131c.jpg', flatten=True) wordcloud = WordCloud( font_path='msyh.ttc', background_color='white', mask=mask_img ).generate(data) plt.imshow(wordcloud.recolor(color_func=grey_color_func, random_state=3), interpolation="bilinear") plt.axis('off') plt.savefig('./heart2.jpg', dpi=1600)

词云图:
 
  
 
 

猜你喜欢

转载自www.cnblogs.com/zhichong/p/8916391.html