본문 바로가기

2019년 혁신성장 청년인재 집중양성(빅데이터)/집중양성과정 프로젝트 01

1. 트위터에서 bitcoin 관련 트윗 크롤링[수집-저장]

비트코인 관련 트위터/신문기사의 감성분석 프로젝트이다.

 

 

1. 먼저 이곳에서 트위터 클로러를 받았다. 트위터 크롤링을 하기 위해서는 API를 이용하거나 직접 여러 사이트를 돌아다니며 수집을 할 수 있는데, 이 친절하신 분이 코드를 짜놨다. 

 

트위터 API 계정도 신청 해놨다. 받는데 시간이 좀 걸릴 것 같다.

 

  https://github.com/taspinar/twitterscraper

 

taspinar/twitterscraper

Scrape Twitter for Tweets. Contribute to taspinar/twitterscraper development by creating an account on GitHub.

github.com

 

2. READMME 파일에 자세한 사항이 적혀있다.

...더보기

Synopsis
#개요
========

A simple script to scrape for Tweets using the Python package requests to retrieve the content and Beautifullsoup4 to parse the retrieved  content.

파이썬 패키지를 이용하여 트윗들을 모아오는 간단한 스크립트다.

콘텐츠를 검색하고 Beautifullsoup4을 이용하여 파싱해준다.

1. Motivation
=============

Twitter has provided `REST
API's <https://dev.twitter.com/rest/public>`__ which can be used by developers to access and read Twitter data. They have also provided a
`Streaming API <https://dev.twitter.com/streaming/overview>`__ which can be used to access Twitter Data in real-time.


트위터는 지금 REST API를 제공하여 트위터 데이터에 접근할 수 있게 해주고 있으며
실시간 데이터도 수집할 수 있게 하고 있다.

Most of the software written to access Twitter data provide a library
which functions as a wrapper around Twitters Search and Streaming API's
and therefore are limited by the limitations of the API's.

대부분의 트위터 데이터에 접근하기 위한 소프트 웨어는 트위터에서 제공하는
API를 wrapper(데이터의 형태를 세팅하는 것)로 포장(wrapper)시켜 놓은 것이기 때문에 API의 한계를 넘지 못한다.


With Twitter's Search API you can only sent 180 Requests every 15
minutes. With a maximum number of 100 tweets per Request this means you
can mine for 4 x 180 x 100 = 72.000 tweets per hour. By using
TwitterScraper you are not limited by this number but by your internet
speed/bandwith and the number of instances of TwitterScraper you are
willing to start.


트위터 API로 해봤자 시간당 72,000개가 한계이다.
TwitterScraper는 오직 사용자의 인터넷속도에 따라 제한 없이 데이터를 받을 수 있다.


One of the bigger disadvantages of the Search API is that you can only
access Tweets written in the **past 7 days**. This is a major bottleneck
for anyone looking for older past data to make a model from. With
TwitterScraper there is no such limitation.

또한 API는 해봤자 7일 전까지만 데이터 수집이 가능하지만
witterScraper에는 제한이 없다.

트윗 하나 당, 다음의 정보를 같이 스크랩한다.


Per Tweet it scrapes the following information:
 + Tweet-id
 + Tweet-url
 + Tweet text
 + Tweet html
 + Tweet timestamp
 + Tweet Epoch timestamp
 + Tweet No. of likes
 + Tweet No. of replies
 + Tweet No. of retweets
 + Username
 + User Full Name
 + User ID
 + Tweet is an retweet
 + Username retweeter
 + Userid retweeter
 + Retweer ID

이와 더불어 아래의 사용자 정보 역시 받아올 수 있다.


In addition it can scrape for the following user information:
 + Date user joined
 + User location (if filled in)
 + User blog (if filled in)
 + User No. of tweets
 + User No. of following
 + User No. of followers
 + User No. of likes
 + User No. of lists
 + User is verified

설치와 사용.


2. Installation and Usage
=========================


pip install twitterscraper을 이용하거나,

같이 동봉된  python setup.py install 을 이용하여 설치한다.


To install **twitterscraper**:

.. code:: python

    (sudo) pip install twitterscraper

or you can clone the repository and in the folder containing setup.py

.. code:: python

    python setup.py install

2.2 The CLI
-----------

 

CLI 는 Comand Line Interface의 약자로 cmd라고 생각하면 쉽다.


You can use the command line application to get your tweets stored to
JSON right away. Twitterscraper takes several arguments:


cmd application을 이용해 트위을 JSON 형식으로 바로 저장 가능하며
Twitterscraper는 여러가지 argument를 취할 수 있습니다.


파이썬에는 매개변수(parameter)와 전달인자(argument)가 있다.


매개변수는 함수의 정의 부분에 나열되어 있는 변수들을 의미하며, 전달인자는 함수를 호출할 때 전달되는 실제 값을 의미한다.


이같은 의미를 명확히 하기 위해 매개변수는 변수(Variable)로, 전달인자는 값(Value)로 보는 것이 일반적이다.
만약 함수가 매개변수를 가질 경우, 

 

각각의 매개변수에 대한 정의를 나열해 놓은 것을 매개변수 목록(Parameter list)

함수를 호출하는 부분에서 전달인자를 나열해 놓을 것을 전달인자 목록(argument list)라고 한다.

-  ``-h`` or ``--help`` Print out the help message and exits.


-  ``-l`` or ``--limit`` TwitterScraper stops scraping when *at least*
   the number of tweets indicated with ``--limit`` is scraped. Since
   tweets are retrieved in batches of 20, this will always be a multiple
   of 20. Omit the limit to retrieve all tweets. You can at any time abort the
   scraping by pressing Ctrl+C, the scraped tweets will be stored safely
   in your JSON file.


 ``-l`` or ``--limit``은 수집되는 수를 제한하는데 단위는 20의 배수이다.
   Ctrl+C를 통해 언제든지 수집을 중단할 수 있으며, 중단시 모든 파일은 JSON에 저장된다.



-  ``--lang`` Retrieves tweets written in a specific language. Currently
   30+ languages are supported. For a full list of the languages print
   out the help message.


``--lang``은 특정 언어만을 선택하여 스크랩핑한다.

30개 이상의 언어가 가능하며 help를 통해 확인할 수 있다.



-  ``-bd`` or ``--begindate`` Set the date from which TwitterScraper
   should start scraping for your query. Format is YYYY-MM-DD. The
   default value is set to 2006-03-21. This does not work in combination with ``--user``.

``-bd`` or ``--begindate``는 시작일을 설정한다.
 Format is YYYY-MM-DD.의 형식으로 작성한다.
 기본 값은 2006년 03월 21일 이다.
``--user``. 기능과는 조합이 불가능하다.



-  ``-ed`` or ``--enddate`` Set the enddate which TwitterScraper should
   use to stop scraping for your query. Format is YYYY-MM-DD. The
   default value is set to today. This does not work in combination with ``--user``.

 ``-ed`` or ``--enddate`` 는 종료 지점을 설정한다.
 포맷은 위와 같다.



-  ``-u`` or ``--user`` Scrapes the tweets from that users profile page.
   This also includes all retweets by that user. See section 2.2.4 in the examples below
   for more information.


``-u`` or ``--user``는 해당 트윗의 유저 프로필 페이지를 스크랩한다.
그 유저의 모든 리트윗을 포함하며, 2.2.4를 보면 예제를 확인할 수 있다.

-  ``--profiles`` twitterscraper will in addition to the tweets, also scrape for the profile
    information of the users who have written these tweets. The results will be saved in the
    file userprofiles_.

`--profiles``, twitterscraper는 해당 트윗을 한 사람의 프로필 정보를 수집한다.
 userprofiles_의 형식으로 저장된다.

-  ``-p`` or ``--poolsize`` Set the number of parallel processes
   TwitterScraper should initiate while scraping for your query. Default
   value is set to 20. Depending on the computational power you have,
   you can increase this number. It is advised to keep this number below
   the number of days you are scraping. For example, if you are
   scraping from 2017-01-10 to 2017-01-20, you can set this number to a
   maximum of 10. If you are scraping from 2016-01-01 to 2016-12-31, you
   can increase this number to a maximum of 150, if you have the
   computational resources. Does not work in combination with ``--user``.



   ``-p`` or ``--poolsize`` TwitterScraper가 설정하는 병렬 프로세스의 수를 설정합니다.


    기본값은 20이며, 당신의 컴퓨터 성능에 따라 이 수를 늘릴 수 있습니다.


    당신이 수집하려는 일수보다는 적게 만드는 것을 추천 합니다.


    예를 들어 1월 10일부터 1월 20일까지 수집한다면 병렬 프로세스의 추천 최대수는 10입니다.


   with ``--user``.와 같이 사용 하지 못합니다.

-  ``-o`` or ``--output`` Gives the name of the output file. If no
   output filename is given, the default filename 'tweets.json' or 'tweets.csv'
   will be used.

 ``-o`` or ``--output``은 결과 파일에 이름을 설정합니다. 만약 이름을 설정하지 않는 다면
'tweets.json' or 'tweets.csv' 로 설정됩니다.


-  ``-c`` or ``--csv`` Write the result to a CSV file instead of a JSON file.

``-c`` or ``--csv``, JSON파일 대신 CSV파일로 결과를 저장합니다.


-  ``-d`` or ``--dump``: With this argument, the scraped tweets will be
   printed to the screen instead of an outputfile. If you are using this
   argument, the ``--output`` argument doe not need to be used.

 ``-d`` or ``--dump``, 결과 파일 대신에 화면 위로 트윗을 보여줍니다. 이것을 사용하고 있다면
 ``--output``은 굳이 사용되지 않습니다.


-  ``-ow`` or ``--overwrite``: With this argument, if the output file already exists
   it will be overwritten. If this argument is not set (default) twitterscraper will
   exit with the warning that the output file already exists.

- # -  ``-ow`` or ``--overwrite``, 이미 결과 파일이 존재한다면, 이 전달인자는 파일을
덮어쓰기 합니다. 만약 이 전달인자가 설정되어 있지 않다면, twitterscraper는 이미 존재한다고 경고 메시지를 보여줍니다.

2.2.1 Examples of simple queries
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Below is an example of how twitterscraper can be used:

``twitterscraper Trump --limit 1000 --output=tweetsT.json``

``twitterscraper Trump -l 1000 -o tweets.json``

``twitterscraper Trump -l 1000 -bd 2017-01-01 -ed 2017-06-01 -o tweets.json``



2.2.2 Examples of advanced queries
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

You can use any advanced query Twitter supports. An advanced query
should be placed within quotes, so that twitterscraper can recognize it
as one single query.

당신은 트위터가 제공하는 어떤 고급 질의라도 사용할 수 있습니다.
고급 질의는 하나의 어구로 되어 있어야 하며, 그래야만 twitterscraper가 이것을 단일 질의로 이해할 수 있습니다.


Here are some examples:

-  search for the occurence of 'Bitcoin' or 'BTC':
   ``twitterscraper "Bitcoin OR BTC" -o bitcoin_tweets.json -l 1000``
-  search for the occurence of 'Bitcoin' and 'BTC':
   ``twitterscraper "Bitcoin AND BTC" -o bitcoin_tweets.json -l 1000``
-  search for tweets from a specific user:
   ``twitterscraper "Blockchain from:VitalikButerin" -o blockchain_tweets.json -l 1000``
-  search for tweets to a specific user:
   ``twitterscraper "Blockchain to:VitalikButerin" -o blockchain_tweets.json -l 1000``
-  search for tweets written from a location:
   ``twitterscraper "Blockchain near:Seattle within:15mi" -o blockchain_tweets.json -l 1000``

You can construct an advanced query on `Twitter Advanced Search <https://twitter.com/search-advanced?lang=en>`__ or use one of the operators shown on `this page <https://lifehacker.com/search-twitter-more-efficiently-with-these-search-opera-1598165519>`__.
Also see `Twitter's Standard operators <https://developer.twitter.com/en/docs/tweets/search/guides/standard-operators.html>`__

아래의 주소로 가서 고급 검색/질의에 대해서 공부할 수 있다.

2.2.3 Examples of scraping user pages
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

You can also scraped all tweets written or retweetet by a specific user.
This can be done by adding the boolean argument ``-u / --user`` argument.
If this argument is used, the search term should be equal to the username.

특정 사용자의 트윗이나 리트윗을 수집할 수 있으며,  ``-u / --user`` argument를 사용할 수 있습니다.
만약, 이 argument가 사용되었다면, 검색 용어는 username과 동일해야 합니다.

Here is an example of scraping a specific user:

``twitterscraper realDonaldTrump --user -o tweets_username.json``

This does not work in combination with ``-p``, ``-bd``, or ``-ed``.

 ``-u / --user``는 ``-p``, ``-bd``, or ``-ed``.와 동시사용이 불가능합니다.

The main difference with the example "search for tweets from a specific user" in section 2.2.2 is that this method really scrapes
all tweets from a profile page (including retweets).
The example in 2.2.2 scrapes the results from the search page (excluding retweets).

"search for tweets from a specific user" in section 2.2.2의 예시와의 차이점은 이 방법은 프로필 패이지로부터 리트윗을 포함한 모든 트윗을 가져온다는 것입니다.

2.3 From within Python
----------------------

You can easily use TwitterScraper from within python:

파이썬과 함께 TwitterScraper를 사용할 수 있습니다.
::

    from twitterscraper import query_tweets

    if __name__ == '__main__':
        list_of_tweets = query_tweets("Trump OR Clinton", 10)

        #print the retrieved tweets to the screen:
        for tweet in query_tweets("Trump OR Clinton", 10):
            print(tweet)

        #Or save the retrieved tweets to file:
        file = open(“output.txt”,”w”)
        for tweet in query_tweets("Trump OR Clinton", 10):
            file.write(tweet.encode('utf-8'))
        file.close()


2.4 Scraping for retweets
----------------------

A regular search within Twitter will not show you any retweets.
Twitterscraper therefore does not contain any retweets in the output.

To give an example: If user1 has written a tweet containing ``#trump2020`` and user2 has retweetet this tweet,
a search for ``#trump2020`` will only show the original tweet.

The only way you can scrape for retweets is if you scrape for all tweets of a specific user with the ``-u / --user`` argument.

일반적인 검색은 어떤 리트윗도 보여주지 않는다.
Twitterscraper은 그러므로 결과물에 어떤 리트윗도 포함하지 않는다.
예를 들면, 어떤 사람이 #trump2020를 썼다면, 이 글을 리트위한 user2의 트윗은 보여주지 않는다.
한가지 방q버은 리트윗한 사람의 모든 트윗을 with the ``-u / --user``통해 가져오는 것이다.


2.5 Scraping for User Profile information
----------------------
By adding the argument ``--profiles`` twitterscraper will in addition to the tweets, also scrape for the profile information of the users who have written these tweets.
The results will be saved in the file "userprofiles_".

Try not to use this argument too much. If you have already scraped profile information for a set of users, there is no need to do it again :)
It is also possible to scrape for profile information without scraping for tweets.
Examples of this can be found in the examples folder.


``--profiles``, twitterscraper는  트윗과 관련된 모든 프로필 정보를 가져옵니다.
 이걸 너무 자주 사용하지 마라. 프로필 정보를 이미 가져 왔다면, 필요가 없다.

3. Output
=========

All of the retrieved Tweets are stored in the indicated output file. The
contents of the output file will look like:


모든 획득된 트윗은 지정된 결과 파일에 저장 된다. 파일의 정보는 아래와 같다.

::

    [{"fullname": "Rupert Meehl", "id": "892397793071050752", "likes": "1", "replies": "0", "retweets": "0", "text": "Latest: Trump now at lowest Approval and highest Disapproval ratings yet. Oh, we're winning bigly here ...\n\nhttps://projects.fivethirtyeight.com/trump-approval-ratings/?ex_cid=rrpromo\u00a0\u2026", "timestamp": "2017-08-01T14:53:08", "user": "Rupert_Meehl"}, {"fullname": "Barry Shapiro", "id": "892397794375327744", "likes": "0", "replies": "0", "retweets": "0", "text": "A former GOP Rep quoted this line, which pretty much sums up Donald Trump. https://twitter.com/davidfrum/status/863017301595107329\u00a0\u2026", "timestamp": "2017-08-01T14:53:08", "user": "barryshap"}, (...)
    ]

3.1 Opening the output file
---------------------------

In order to correctly handle all possible characters in the tweets
(think of Japanese or Arabic characters), the output is saved as utf-8
encoded bytes. That is why you could see text like
"\u30b1 \u30f3 \u3055 \u307e \u30fe ..." in the output file.

트윗의 여러가지 가능한 특성들을 올바르게 다루기 위해서, utf-8파일로 인코딩할 필요가 있다.
그것이 바로 당신이 이런 텍스트를 파일에서 볼 수 있는 이유다.

What you should do is open the file with the proper encoding:

.. figure:: https://user-images.githubusercontent.com/4409108/30702318-f05bc196-9eec-11e7-8234-a07aabec294f.PNG

   Example of output with Japanese characters

# 적절한 인코딩 을 통하여 파일을 열어야 한다.

3.1.2 Opening into a pandas dataframe
---------------------------

After the file has been opened, it can easily be converted into a pandas DataFrame

::

    import pandas as pd
    df = pd.read_json('tweets.json', encoding='utf-8')

 파일이 오픈되면 쉽게 판다스 파일로 변경할 수 있습니다.

 

3. 위의 설명서에 나와 있는데로 

1. twitterscraper가 있는 폴더에서 cmd 명령 : python setup.py install 

python setup.py install 

2. cmd 창에서 twitterscraper "BTC OR 비트코인" --limit 1000 --output=bit_kor.json --lang ko --  -bd 2017-01-01 -ed 2017-06-01

twitterscraper "BTC OR 비트코인" --limit 1000 --output=bit_kor.json --lang ko  -bd 2017-01-01 -ed 2017-06-01

 

3. json 파일을 pandas DataFrame 형태로 저장

import json
import pandas as pd
with open('bit_kor.json') as json_file : # bit_kor.json파일에 json_file이라는 핸들을 만들고
    json_data = json_file.read() # 그 파일을 읽어들여 json_data로 저장
bit_json = json.loads(json_data) # json_data를 json.loads를 하여 딕셔너리 형태로 받아오며
#print(bit_json) #작동 확인

bit_json_df = pd.DataFrame(bit_json, columns=['text']) # bit_json의 'text'컬럼을 pd.datafram형태로 저장
print(bit_json_df) # 확인

4. cmd 창에서 확인

 

 

5. 만든 pd.DataFrame을 csv파일 형태로 저장

 

import json
import pandas as pd
with open('bit_kor.json') as json_file : # bit_kor.json파일에 json_file이라는 핸들을 만들고
    json_data = json_file.read() # 그 파일을 읽어들여 json_data로 저장
bit_json = json.loads(json_data) # json_data를 json.loads를 하여 딕셔너리 형태로 받아오며
#print(bit_json) #작동 확인

bit_json_df = pd.DataFrame(bit_json, columns=['text']) # bit_json의 'text'컬럼을 pd.datafram형태로 저장
#print(bit_json_df) # 확인

bit_json_df.to_csv("bit_kor.csv", mode='w') #df을 csv로 저장, 현재 디렉토리에 저장됨.