1. 먼저 13강에 있는 twitter 실습을 필요로한다. 또 sqllite도 다운 받아야 한다.
2. 이번에는 간단하게 twspider.py만 실행 시키면 된다. 어떤 내용일지 읽어보자.
2-1. 아래와 같이 임포트
from urllib.request import urlopen
import urllib.error
import twurl
import json
import sqlite3
import ssl
urllib은 url을 다루기 위해 필요하며
twurl은 twitter api를 이용하기 위한 전자서명을 만드며
json은 url으로 부터 얻어진 json파일을 다루기 위해 필요하며
sqlite3는 얻은 정보를 저장하기 위해서 데이터베이스와 소통하는데 필요하다.
ssl은 인증서 문제를 해결하기 위해 필요하다.
2-2. twitter api와의 접촉을 만들고, 데이터베이스와의 접촉을 만든다.
TWITTER_URL = 'https://api.twitter.com/1.1/friends/list.json'
conn = sqlite3.connect('spider.sqlite')
cur = conn.cursor()
cur.execute('''
CREATE TABLE IF NOT EXISTS Twitter
(name TEXT, retrieved INTEGER, friends INTEGER)''')
sqlit sqlite3.connect를 통해 spider.sqlite라는 데이터베이스와의 커넥션을 만들어 소통하게 한다.
conn.corsor는 실제로 무엇인가를 명령할 수 있게 해준다.
cur.execute(''' CREATE TABLE IF NOT EXISTS Twitter (name TEXT, retrieved INTEGER, friends INTEGER)''')
Twitter라는 테이블을 만들고 name(텍스트), retrieved(정수), friends(정수)라는 칼럼을 생성한다.
# Ignore SSL certificate errors
ctx = ssl.create_default_context()
ctx.check_hostname = False
ctx.verify_mode = ssl.CERT_NONE
python 은 모든 권위에 불복종한다고 한다. 인증서는 개나줘버려?. 인증부분은 잘 모르겠다.
2-3. while문 이하로 반복되면서 친구 목록에 대한 정보를 가져온다.
while True:
acct = input('Enter a Twitter account, or quit: ')
if (acct == 'quit'): break
if (len(acct) < 1):
cur.execute('SELECT name FROM Twitter WHERE retrieved = 0 LIMIT 1')
try:
acct = cur.fetchone()[0]
except:
print('No unretrieved Twitter accounts found')
continue
url = twurl.augment(TWITTER_URL, {'screen_name': acct, 'count': '5'})
print('Retrieving', url)
connection = urlopen(url, context=ctx)
data = connection.read().decode()
headers = dict(connection.getheaders())
print('Remaining', headers['x-rate-limit-remaining'])
js = json.loads(data)
acct = input에서 ID를 받아온다
if (acct == 'quit'): break quit이 입력되면 정지하며
if (len(acct) < 1): 문자의 길이가 0이면
cur.execute('SELECT name FROM Twitter WHERE retrieved = 0 LIMIT 1'), Twitter 테이블에서 친구의 친구가 수집되지 않은 친구 하나를 택한다.
try: acct = cur.fetchone()[0] 위의 명령문으로 하나의 행이 메모리에 있게되며, fethcone[0] 을 통해 name을 가져와 acct에 할당한다.
except: print('No unretrieved Twitter accounts found') continue, 없다면 가로 안의 텍스트를 뽑는다.
2-4. 이제 타겟이 정해졌으니, 데이터를 가져온다.
url = twurl.augment(TWITTER_URL, {'screen_name': acct, 'count': '5'})
print('Retrieving', url)
connection = urlopen(url, context=ctx)
data = connection.read().decode()
headers = dict(connection.getheaders())
print('Remaining', headers['x-rate-limit-remaining'])
js = json.loads(data)
url = twurl.augment를 통해 아이디의 친구목록 상위 5개의 url을 가져올 수 있는 전자서명을 가져오고
connection = urlopen 을 통해 url과 연결을 만들고 decode()로 유니코드화 시킨다.
headers = dict(connection.getheaders())를 통해 남은 횟수를 확인 할 수 있도록 한다.
받아온 데이터는 json.load(data)를 통해 js로 읽어온다.
2-5. 검색한 계정에 대해서 테이블을 업데이트한다.
cur.execute('UPDATE Twitter SET retrieved=1 WHERE name = ?', (acct, ))
cur.execute('UPDATE Twitter SET retrieved=1 WHERE name = ?', (acct, )) acct인 곳의 행에 대해 retrieved를 1로 바꾼다.
2-6. 이제 마지막이다. js에는 user라는 테그가 있는데 그 태그에 대해서 다음과 같이 수행하여 데이터베이스를 완성.
countnew = 0
countold = 0
for u in js['users']:
friend = u['screen_name']
print(friend)
cur.execute('SELECT friends FROM Twitter WHERE name = ? LIMIT 1',
(friend, ))
try:
count = cur.fetchone()[0]
cur.execute('UPDATE Twitter SET friends = ? WHERE name = ?',
(count+1, friend))
countold = countold + 1
except:
cur.execute('''INSERT INTO Twitter (name, retrieved, friends)
VALUES (?, 0, 1)''', (friend, ))
countnew = countnew + 1
print('New accounts=', countnew, ' revisited=', countold)
conn.commit()
friend = u['screen_name'] user안의 screen_name태그를 유니코드화하여 friend로 놓고
cur.execute('SELECT friends FROM Twitter WHERE name = ? LIMIT 1', (friend, )) Twitter테이블에서 이름이 friend인 것을 하나 택한다.
count = cur.fetchone()[0] 데이터베이스의 friends 행의 0번째 값을 가져와 count에 넣어주며
cur.execute('UPDATE Twitter SET friends = ? WHERE name = ?',(count+1, friend)) name이 우리가 검색한 friend 에 대해 friends에 count +1을 해준다.
cur.execute('''INSERT INTO Twitter (name, retrieved, friends)VALUES (?, 0, 1)''', (friend, )) 만약 기존의 데이터베이스에 없는 이름이라면 (friend, 0, 1)행을 넣어준다.
'2019년 혁신성장 청년인재 집중양성(빅데이터) > PYTHON 공부 - PY4E' 카테고리의 다른 글
PHP Forms - GET and POST (Part 2) (0) | 2019.08.05 |
---|---|
클래스란 무엇인가 (0) | 2019.07.25 |
PY4E - Chapter 13 Twitter API (트위터 API를 이용한 크롤링) (0) | 2019.07.18 |
PY4E - Chapter 15 Database, Many to many (3) (0) | 2019.07.14 |
PY4E - Chapter 15 Database (2) (0) | 2019.07.14 |