python微博爬取(勉强だけで、実はあまり勉强していません....)検索語を入力し、csv形式で保存します.

4111 ワード

この例では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符号化形式に変換できます.         
2つ目の質問ですが、ああ...2つ目の問題は私が心配していることに気づいたばかりです.最初のページurlは直接後にpage=1を加えることができますが、これは大丈夫です.これは穴だと思っていたが、検証したばかりで、できる.......
3つ目の質問は、csvとして保存するときに、ヘッダーを設定します.今はまだ解決していません.今は自分で最初に表を建てて、後で情報を追加するしかありません.できることを望んでいます.教えてください.後で資料を調べ続けます.
4つ目の問題は、csvファイルに問題が表示されます.ファイルをutf-8に保存すると、WpsやExcelで開くと文字化けしてしまいます.解決策は、ファイルを保存する際の符号化フォーマットをwindowsでexcelがサポートするフォーマット、すなわち「GB 18030」に変更することです.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()

​

​

小太りの子豚