【问题标题】:Python global name 'urls' is not defined IssuePython全局名称'urls'未定义问题
【发布时间】:2018-01-28 18:48:52
【问题描述】:

虽然urls 定义正确,但我确实不断收到"global name 'urls' is not defined" 并且url 数据不是insertedMYSQL。关于在哪里有什么建议吗?我在这里犯错了吗?

# ! /usr/bin/python

# Description : This script can collect the URLs from Tweets and Records them into research MYSQL DB.

from __future__ import print_function
import tweepy
import json
import MySQLdb
from dateutil import parser

WORDS = ['security']

# CREDENTAILS
CONSUMER_KEY = ""
CONSUMER_SECRET = ""
ACCESS_TOKEN = ""
ACCESS_TOKEN_SECRET = ""

HOST = "192.168.150.94"
USER = "root"
PASSWD = "blah"
DATABASE = "tweets"


def store_data(tweet_url):
    db = MySQLdb.connect(host=HOST, user=USER, passwd=PASSWD, db=DATABASE,
                         charset="utf8")
    cursor = db.cursor()
    insert_query = "INSERT INTO  tweet_url (urls) VALUES (%s)"
    cursor.execute(insert_query, (urls))
    db.commit()
    cursor.close()
    db.close()
    return


class StreamListener(tweepy.StreamListener):
    def on_connect(self):
        print("We are now connected to the streaming API.")

    def on_error(self, status_code):
        print('An Error has occured: ' + repr(status_code))
        return False

    def on_data(self, data):
        try:
            datajson = json.loads(data)
            web_url = datajson['entities']['urls']
            print(web_url)
            for i in web_url:
                web_urls = i['expanded_url']
                urls = web_urls
            print(urls)
        store_data(urls)

    except Exception as e:
    print(e)


auth = tweepy.OAuthHandler(CONSUMER_KEY, CONSUMER_SECRET)
auth.set_access_token(ACCESS_TOKEN, ACCESS_TOKEN_SECRET)
listener = StreamListener(api=tweepy.API(wait_on_rate_limit=True))
streamer = tweepy.Stream(auth=auth, listener=listener)
print("Tracking: " + str(WORDS))
streamer.filter(track=WORDS)

【问题讨论】:

  • 您明白如果web_url 为空,那么urls 将不存在,对吧?

标签: python mysql


【解决方案1】:

只需将函数store_data中的参数urls重命名为tweet_url即可

def store_data(tweet_url):
    db = MySQLdb.connect(host=HOST, user=USER, passwd=PASSWD, db=DATABASE,
                         charset="utf8")
    cursor = db.cursor()
    insert_query = "INSERT INTO  tweet_url (urls) VALUES (%s)"
    cursor.execute(insert_query, (tweet_url))

您希望存储数据的方式仍不清楚。如果你在循环之后调用store_data,它只存储最后一个值,你最好将每个值存储在一个列表中:

def on_data(self, data):
    try:
        datajson = json.loads(data)
        web_url = datajson['entities']['urls']
        print(web_url)
        urls = []
        for i in web_url:
            urls.append((i['expanded_url'],)) 
            # stores a tuple to make it easy in the database insertion
        print(urls)
        store_data(urls)
    except:
         [...]

这种方式需要在 store_data 内部进行另一个小修复:

def store_data(urls):
    db = MySQLdb.connect(host=HOST, user=USER, passwd=PASSWD, db=DATABASE,
                         charset="utf8")
    cursor = db.cursor()
    insert_query = "INSERT INTO  tweet_url (urls) VALUES (%s)"
    cursor.executemany(insert_query, urls)
    db.commit()
    cursor.close()
    db.close()
    return

【讨论】:

  • 谢谢 Moureu,改了!工作正常
  • PRmonreu :但是这里有一个停止,当推文“web_url”中有两个以上的 URL 时,我收到“字符串格式化期间并非所有参数都转换”错误。但是当推文上只有一个 URL 时,它就会被插入到 MYSQL 中。 ?
  • @Arun 检查此post 以了解可能有什么问题,在store_data() 中,urls 需要是一个元组列表(里面有一个expanded_url)。 executemany 将遍历此列表。
【解决方案2】:

在您的函数store_data() 中,您使用的是未定义的urls,因为您传递给函数的是tweet_url

您需要将函数参数更改为 urls 而不是 tweet_url,如下所示:

def store_data(urls):
    # ...

或者在你的函数体中将urls更改为tweet_url

# ...
cursor.execute(insert_query, (tweet_url))
# ...

并确保您修复on_data() 方法中的缩进如下:

class StreamListener(tweepy.StreamListener):
    # ...

    def on_data(self, data):
        try:
            datajson = json.loads(data)
            web_url = datajson['entities']['urls']
            print(web_url)
            for i in web_url:
                web_urls = i['expanded_url']
                urls = web_urls
            print(urls)
            store_data(urls)
        except Exception as e:
            print(e)

【讨论】:

  • 啊,快!对不起 !谢谢:)
猜你喜欢
  • 2014-11-09
  • 2017-02-03
  • 2013-08-23
  • 2013-11-12
  • 2014-12-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-26
相关资源
最近更新 更多