0

Web サイトのソースを MySQL データベースに保存しようとしています。ソースは urllib を使用して正常に取得されます。次にデータを保存します。データベースとの接続は問題ありません。挿入ステートメントからソースを削除するとすべて問題ないため、問題はソースの保存にあります。

    # get the webpage source
    f = urllib.urlopen(row_urls['url'])
    source_fetched = f.read()
    f.close()

    # Save the webpage source
    scrapy_url_id = row_urls['id']
    url = row_urls['url']
    created = datetime.datetime.now()
    source = unicode(source_fetched,'utf-8')

    cur_webpage_save = con.cursor(mdb.cursors.DictCursor)
    cur_webpage_save.execute("""INSERT INTO webpage(scrapy_url_id,url,created,source) VALUES('%s', '%s', '%s', '%s');""" %(scrapy_url_id, url, created, source))

エスケープする必要がある文字に何か問題があると思います。これを試しましたが、同じエラーが生成されます。

    cur_webpage_save.execute(mdb.escape_string("""INSERT INTO webpage(scrapy_url_id,url,created,source) VALUES('%s', '%s', '%s', '%s');""" %(scrapy_url_id, url, created, source)))

以下にエラーが表示されます。私は何を間違っていますか...

Traceback (most recent call last):
File "clean.py", line 55, in <module>
cur_webpage_save.execute(mdb.escape_string("""INSERT INTO webpage(scrapy_url_id,url,created,source) VALUES('%s', '%s', '%s', '%s');""" %(scrapy_url_id, url, created, source)))
File "/usr/lib/python2.7/dist-packages/MySQLdb/cursors.py", line 174, in execute
self.errorhandler(self, exc, value)
File "/usr/lib/python2.7/dist-packages/MySQLdb/connections.py", line 36, in defaulterrorhandler
raise errorclass, errorvalue
_mysql_exceptions.ProgrammingError: (1064, "You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '\\'4\\', \\'http://example.com/test.html?id=108185\\', \\'2012-10-28' at line 1")
4

1 に答える 1

1

文字列フォーマットを使用してデータをデータベースに入れるのではなく、代わりに SQL パラメータを使用してください。

cur_webpage_save.execute("""INSERT INTO webpage(scrapy_url_id,url,created,source) VALUES(%s, %s, %s, %s);""", (scrapy_url_id, url, created, source))

MySQLdb の場合、構文はほぼ同じで、一重引用符を削除するだけです。

データベース アダプタによって、それぞれが適切に引用符%sで囲まれた文字列値に置き換えられます。これにより、SQL インジェクション攻撃も防止されます。

于 2012-10-28T17:30:25.557 に答える