1

Chris Reevesの一連のチュートリアルから Web スクレイピング手法を学んでいます。本当に素晴らしいものです、あなたはそれをチェックする必要があります.

チュートリアル番号の例で問題が発生しました。10では、Chris が mySQL データベースへの接続について説明しています。まず、データベースのテーブルに値をコミットしないという問題がありました。その後、コメントで、conn.commit()どのビデオの作成者が彼のプログラムに含まれていないかが不明であることを発見しました。コードのこの部分をプログラムに追加しましたが、うまく機能しています。今では次のようになっています。

from threading import Thread
import urllib
import re
import MySQLdb

conn = MySQLdb.connect(host="127.0.0.1",port=3307,user="root",passwd="root",db="stock_data")

query = "INSERT INTO tutorial (symbol) values('AAPL')"
x = conn.cursor()
x.execute(query)
conn.commit()
row = x.fetchall()

それは私のローカルデータベースに接続し、列シンボルの下のテーブルチュートリアルにAAPLを正常に追加します。

私の問題は、外部の .txt ファイルから 4 文字のシンボルを読み取り、すべてを同じデータベースに追加するコードのマルチスレッド部分を追加すると思われる Chris のチュートリアルの 2 番目の部分から始まりました。

私のプログラムが次のようになったとき:

from threading import Thread
import urllib
import re
import MySQLdb

gmap = {}

def th(ur):
    base = "http://finance.yahoo.com/q?s="+ur
    regex = '<span id="yfs_l84_'+ur.lower()+'">(.+?)</span>'
    pattern = re.compile(regex)
    htmltext = urllib.urlopen(base).read()
    results = re.findall(pattern,htmltext)
    try:
        gmap[ur] = results [0]
    except:
        print "got an error"

symbolslist = open("threads/symbols.txt").read()
symbolslist = symbolslist.replace(" ","").split(",")

print symbolslist

threadlist = []

for u in symbolslist:
    t = Thread(target=th,args=(u,))
    t.start()
    threadlist.append(t)

for b in threadlist:
    b.join()

conn = MySQLdb.connect(host="127.0.0.1",port=3307,user="root",passwd="root",db="stock_data")

for key in gmap.keys():
    print key,gmap[key]
    query = "INSERT INTO tutorial (symbol,last) values("
    query = query+"'"+key+"',"+gmap[key]+")"
    x = conn.cursor()
    x.execute(query)
    conn.commit()
    row = x.fetchall()

これはChris の例とほとんど同じです(ただし、外部ログイン データを使用せず、コードで直接使用しますが、それは問題ではありません)、すべてのスレッドでエラーが発生し、次のようになります。

Exception in thread Thread-474:
Traceback (most recent call last):
  File "C:\Python27\lib\threading.py", line 810, in __bootstrap_inner
    self.run()
  File "C:\Python27\lib\threading.py", line 763, in run
    self.__target(*self.__args, **self.__kwargs)
  File "threads/threads2.py", line 12, in th
    htmltext = urllib.urlopen(base).read()
  File "C:\Python27\lib\urllib.py", line 87, in urlopen
    return opener.open(url)
  File "C:\Python27\lib\urllib.py", line 208, in open
    return getattr(self, name)(url)
  File "C:\Python27\lib\urllib.py", line 345, in open_http
    h.endheaders(data)
  File "C:\Python27\lib\httplib.py", line 969, in endheaders
    self._send_output(message_body)
  File "C:\Python27\lib\httplib.py", line 829, in _send_output
    self.send(msg)
  File "C:\Python27\lib\httplib.py", line 791, in send
    self.connect()
  File "C:\Python27\lib\httplib.py", line 772, in connect
    self.timeout, self.source_address)
  File "C:\Python27\lib\socket.py", line 571, in create_connection
    raise err
IOError: [Errno socket error] [Errno 10060] A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond

そして、これは、私が言ったように、Thread-474 の 1 つのエラーにすぎませんが、Thread-441、Thread-390、Thread-391 などのように、IDE の複数のスレッドでエラーが発生しています...

私は何が欠けていますか?それはコードまたはMySqlサーバーのセットアップにあるのですか? クリスの例のすべてによれば、それはうまくいくはずです

誰か助けて?

4

2 に答える 2