sql >> Databáze >  >> RDS >> Mysql

Krásná polévka webscrape do mysql

Zde je tedy třeba řešit několik věcí.

dokumenty o PyMySQL jsou docela dobří v tom, jak vás zprovoznit.

Než však budete moci tyto věci vložit do databáze, musíte je uchopit tak, aby se název interpreta a název skladby navzájem spojily. Právě teď získáváte samostatný seznam umělců a skladeb, bez možnosti je přiřadit. Chcete-li to provést, budete chtít iterovat třídu titulního umělce.

Udělal bych to takto -

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

Tím se vytiskne název a interpret pro každou iteraci smyčky recordList.

Pro vložení těchto hodnot do databáze MySQL jsem vytvořil tabulku nazvanou artist_song s následujícím:

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;

Není to nejčistší způsob, jak toho dosáhnout, ale myšlenka je správná. Chceme otevřít připojení k databázi MySQL (nazval jsem svou DB top_40) a vložit pár interpret/název pro každou iteraci smyčky 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()

Edit:Podle mého komentáře si myslím, že je jasnější iterovat přes řádky tabulky:

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. Formát data a času Mysql přidá 10 minut

  2. Podmíněná vložka MySQL

  3. Seznam účtů přidružených k profilu pošty databáze na serveru SQL Server

  4. bezpečné uložení hesla pro api bez jeho šifrování