Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Webscrape súp đẹp thành mysql

Vì vậy, có một số điều cần giải quyết ở đây.

tài liệu về PyMySQL khá giỏi trong việc giúp bạn thiết lập và vận hành.

Tuy nhiên, trước khi bạn có thể đưa những thứ này vào cơ sở dữ liệu, bạn cần lấy chúng theo cách mà nghệ sĩ và tên bài hát được liên kết với nhau. Ngay bây giờ, bạn đang nhận được một danh sách các nghệ sĩ và bài hát riêng biệt, không có cách nào để liên kết chúng. Bạn sẽ muốn lặp lại lớp nghệ sĩ tiêu đề để thực hiện việc này.

Tôi sẽ làm điều này như vậy -

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

Thao tác này sẽ in tiêu đề và nghệ sĩ cho mỗi lần lặp lại của vòng lặp recordList.

Để chèn các giá trị này vào MySQL DB, tôi đã tạo một bảng có tên artist_song với những điều sau:

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;

Đây không phải là cách sạch sẽ nhất để giải quyết vấn đề này, nhưng ý tưởng là rất tốt. Chúng tôi muốn mở một kết nối đến MySQL DB (tôi đã gọi là DB top_40 của mình) và chèn một cặp nghệ sĩ / tiêu đề cho mỗi lần lặp lại của vòng lặp 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()

Chỉnh sửa:Theo nhận xét của tôi, tôi nghĩ rằng việc lặp lại các hàng trong bảng sẽ rõ ràng hơn:

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. PHP MySQL TẢI DỮ LIỆU THÔNG TIN Trợ giúp

  2. Cách xuất &nhập người dùng hiện tại (với các đặc quyền của nó!)

  3. Spring Boot / JPA / mySQL - mối quan hệ nhiều đối một tạo ra quá nhiều truy vấn SQL

  4. Cách giám sát việc triển khai MySQL với Prometheus &Grafana tại ScaleGrid

  5. Cách tạo mối quan hệ trong MySQL