python微博爬取(仅供学习,其实也没啥学的....),输入检索词,保存为csv格式。

        本示例记录一下python爬取微博遇到的坑以及学到的东西。首先不得不承认pyquery在提取信息方便还是相当便捷的,尤其是本次提取文本信息时,相当给力。可能主要还是对各种解析库不熟练吧,遇到一个说一个好。唉.....

      遇到的第一个问题是url构造的问题,微博构造url还是比较简单的,在爬取搜索关键词后的信息时其url大致为

https://m.weibo.cn/api/container/getIndex?containerid=100103type%3D1%26q%3D%25E4%25B8%258A%25E6%25B5%25B7&page_type=searchall&page=4

中间被变成URL编码的字符串为‘=1&q=关键词’。按道理来说也没有什么难度,但是刚开始我自作聪明,把这些都直接用字符串写了出来,关键词也用汉字写了出来,当请求时就会发现,得到的就不是自己想要的内容。因此:第一个坑就是要将构造的url的这一部分内容自己转码成URL编码格式,其大致方法为:

import    urllib.parse

S = 字符串

urllib.parse(S)

即可将S字符串的内容转换成URL编码格式。         

第二个问题,哦 ...... 第二个问题刚刚发现是我多虑了。第一页url可以直接在后边加page=1,这个没问题。我还以为这个是个坑,刚刚验证了一下,能行。.....

第三个问题,保存为csv时,设置表头。现在还没有解决,目前我只能自己在刚开始先建个表头,后边再追加信息,希望有会的大佬,指点一下,一会我再继续查资料。

第四个问题,csv文件显示问题。将文件保存为utf-8时会发现,去用Wps或者Excel打开时会出现乱码的情况。解决方法就是将保存文件时的编码格式改为windows下excel支持的格式,也就是‘GB18030’。虽然在pycharm中可能显示的是乱码的。但毕竟点击一下Reloading in another encoding就可以看。显然保存时改编码格式还是比较方便的。

另外说一句,火狐看这种json格式的链接体验是真的好。  哈哈......    笑出猪叫

​
​
'''
输入想要搜索话题的关键词将搜索内容保存至以关键词命名的csv文件中
'''
import requests
from pyquery import PyQuery as pq
import csv
import time
import random
import urllib.parse

headers = {
    'user-agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.25 Safari/537.36 Core/1.70.3766.400 QQBrowser/10.6.4163.400',
    'origin': 'https://weibo.com',
}

def get_resposne(url):
    try:
        response = requests.get(url, headers=headers)
        response.encoding = response.apparent_encoding
        response = response.json()
        return response
    except:
        return ''

def parse_response(response):
    mblogs = response['data']['cards']
    datas = []
    for mblog in mblogs:
        if 'mblog' in mblog:
            collections = {}
            mblog = mblog['mblog']
            collections['博主'] = mblog['user']['screen_name']
            collections['微博文本内容'] = pq(mblog['text']).text()
            collections['微博文本长度'] = mblog['textLength']
            collections['评论数'] = mblog['comments_count']
            collections['转发数'] = mblog['reposts_count']
            collections['点赞数'] = mblog['attitudes_count']
            collections['粉丝数'] = mblog['user']['followers_count']
            datas.append(collections)
    return datas

def save_datas(datas, keyword):
    with open(f'{keyword}.csv', 'a', newline='', encoding='gb18030') as csvfile:
        fieldnames = ['博主', '微博文本内容', '微博文本长度', '评论数', '转发数', '点赞数', '粉丝数']
        writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
        writer.writerows(datas)

def main():
    keyword = input('请输入想要搜索的关键词:')
    url_add = '=1&q=' + keyword
    url_add = urllib.parse.quote(url_add)
    with open(f'{keyword}.csv', 'a', newline='', encoding='gb18030') as csvfile:
        writer = csv.writer(csvfile)
        writer.writerow(['博主', '微博文本内容', '微博文本长度', '评论数', '转发数', '点赞数', '粉丝数'])
    base_url = 'https://m.weibo.cn/api/container/getIndex?containerid=100103type{}&page_type=searchall'.format(url_add)
    for page in range(1, 51):
        if page == 1:
            url = base_url
        else:
            url = base_url + '&page=' + 'page'
        response = get_resposne(url)
        if response:
            save_datas(parse_response(response), keyword)
            print('第{}页保存完成'.format(page))
            time.sleep(random.randint(15, 20))
        else:
            break
main()

​

​

                                                                                                                              小胖胖的猪崽

你可能感兴趣的:(爬虫)