Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Webscrape sup yang indah ke mysql

Jadi ada beberapa hal yang perlu diperhatikan di sini.

dokumen di PyMySQL cukup baik untuk membuat Anda aktif dan berjalan.

Sebelum Anda dapat memasukkan hal-hal ini ke dalam basis data, Anda harus mengambilnya sedemikian rupa sehingga artis dan nama lagu dikaitkan satu sama lain. Saat ini Anda mendapatkan daftar artis dan lagu yang terpisah, tanpa cara untuk mengaitkannya. Anda akan ingin mengulangi kelas artis-judul untuk melakukan ini.

Saya akan melakukan ini seperti itu -

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

Ini akan mencetak judul dan artis untuk setiap iterasi dari loop recordList.

Untuk memasukkan nilai-nilai ini ke dalam DB MySQL, saya membuat tabel bernama artist_song dengan sebagai berikut:

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;

Ini bukan cara terbersih untuk melakukan ini, tetapi idenya masuk akal. Kami ingin membuka koneksi ke MySQL DB (saya telah memanggil DB top_40 saya), dan memasukkan pasangan artis/judul untuk setiap iterasi dari loop 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()

Sunting:Per komentar saya, saya pikir lebih jelas untuk mengulangi baris tabel sebagai gantinya:

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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Mengeluarkan semua kesalahan PHP ke database bukan error_log

  2. Kesalahan MySQL 1093 - Tidak dapat menentukan tabel target untuk pembaruan dalam klausa FROM

  3. Menulis satu kueri untuk beberapa kueri dengan kondisi tabel yang sama

  4. PILIH beberapa catatan untuk masing-masing DISTINCT dalam satu kueri

  5. Saya perlu auto_increment bidang di MySQL yang bukan kunci utama