sql >> データベース >  >> RDS >> Mysql

mysqlへの美しいスープwebscrape

    したがって、ここで対処することがいくつかあります。

    PyMySQLのドキュメント 立ち上げて実行するのはかなり得意です。

    ただし、これらをデータベースに入れる前に、アーティストと曲の名前が相互に関連付けられている方法でそれらを取得する必要があります。現在、アーティストと曲の個別のリストを取得しており、それらを関連付ける方法はありません。これを行うには、タイトルアーティストクラスを繰り返し処理する必要があります。

    私はそうするようにします-

    from urllib import urlopen
    from bs4 import BeautifulSoup
    import pymysql.cursors
    
    # Webpage connection
    html = urlopen("http://www.officialcharts.com/charts/singles-chart/19800203/7501/")
    
    # Grab title-artist classes and iterate
    bsObj = BeautifulSoup(html)
    recordList = bsObj.findAll("div", {"class" : "title-artist",})
    
    # Now iterate over recordList to grab title and artist
    for record in recordList:
         title = record.find("div", {"class": "title",}).get_text().strip()
         artist = record.find("div", {"class": "artist"}).get_text().strip()
         print artist + ': ' + title
    

    これにより、recordListループの反復ごとにタイトルとアーティストが出力されます。

    これらの値をMySQLDBに挿入するために、artist_songというテーブルを作成しました。 次のように:

    CREATE TABLE `artist_song` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `artist` varchar(255) COLLATE utf8_bin NOT NULL,
      `song` varchar(255) COLLATE utf8_bin NOT NULL,
      PRIMARY KEY (`id`)
      ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin
      AUTO_INCREMENT=1;
    

    これは、これを実行するための最もクリーンな方法ではありませんが、アイデアは健全です。 MySQL DBへの接続を開き(DBをtop_40と呼びます)、recordListループの反復ごとにアーティストとタイトルのペアを挿入します。

    from urllib import urlopen
    from bs4 import BeautifulSoup
    import pymysql.cursors
    
    
    # Webpage connection
    html = urlopen("http://www.officialcharts.com/charts/singles-chart/19800203/7501/")
    
    # Grab title-artist classes and store in recordList
    bsObj = BeautifulSoup(html)
    recordList = bsObj.findAll("div", {"class" : "title-artist",})
    
    # Create a pymysql cursor and iterate over each title-artist record.
    # This will create an INSERT statement for each artist/pair, then commit
    # the transaction after reaching the end of the list. pymysql does not
    # have autocommit enabled by default. After committing it will close
    # the database connection.
    # Create database connection
    
    connection = pymysql.connect(host='localhost',
                                 user='root',
                                 password='password',
                                 db='top_40',
                                 charset='utf8mb4',
                                 cursorclass=pymysql.cursors.DictCursor)
    
    try:
        with connection.cursor() as cursor:
            for record in recordList:
                title = record.find("div", {"class": "title",}).get_text().strip()
                artist = record.find("div", {"class": "artist"}).get_text().strip()
                sql = "INSERT INTO `artist_song` (`artist`, `song`) VALUES (%s, %s)"
                cursor.execute(sql, (artist, title))
        connection.commit()
    finally:
        connection.close()
    

    編集:私のコメントによると、代わりにテーブルの行を反復処理する方が明確だと思います:

    from urllib import urlopen
    from bs4 import BeautifulSoup
    import pymysql.cursors
    
    
    # Webpage connection
    html = urlopen("http://www.officialcharts.com/charts/singles-chart/19800203/7501/")
    
    bsObj = BeautifulSoup(html)
    
    rows = bsObj.findAll('tr')
    for row in rows:
        if row.find('span', {'class' : 'position'}):
            position = row.find('span', {'class' : 'position'}).get_text().strip()
            artist = row.find('div', {'class' : 'artist'}).get_text().strip()
            track = row.find('div', {'class' : 'title'}).get_text().strip()
    



    1. MYSQL、非常に遅い順序

    2. 日付を月の名前と年に変換する

    3. Wordpress SQL:投稿カテゴリとタグを取得

    4. SQLServerのすべてのテーブルを検索して文字列を検索します