Python爬虫之路-爬取在线课程并存入MySQL数据库

本次将爬取的网易云课程信息存入数据库,首先需要对课程数据进行分析,然后根据课程数据信息创建对应的数据表中的字段。最后,将爬取的课程数据写入到MySQL数据库。

使用PyMySQL模块操作数据库,流程如下:
 连接数据库
使用PyMySQL的connect()方法连接数据库,代码如下:

# 连接数据库,示例为本机mysql
01	conn = pymysql.connect(host='localhost',
02	                port=3306,
03	                user='root',
04	                passwd='root',
05	                db='flask',
06	                charset='utf8')
07	cur = conn.cursor()

 查询数据
使用PyMySQL的execute()方法可以执行SQL语句,例如根据课程ID查询数据,代码如下:

01	# 根据course_id查找course表中记录
02	sql = f'select course_id from course where course_id = {course_id}'
03	# 执行SQL语句
04	cur.execute(sql)
05	# 查找一条记录
06	course = cur.fetchone()

 批量写入数据库
每次写入一条记录效率较低,使用批量写入数据库可以提高运行效率。PyMySQL的executemany()方法可以批量写入数据库,代码如下:

01	sql_course = """insert into course
02	values (%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s)
03	"""
04	# exetemany方法插入多条记录
05	cur.executemany(sql_course, course_data)

 提交操作
写入操作完成后,需要将其提交到数据库,可以使用conn连接对象的commit方法提交数据。代码如下:

conn.commit() # 提交到数据库

 关闭连接
操作完成以后,关闭游标,关闭连接,代码如下:

01	cur.close()  # 关闭游标
02	conn.close()  # 关闭数据库连接

实例代码

import requests
import pymysql

conn = pymysql.connect(
    host="localhost",
    port=3306,
    user="root",
    passwd="root",
    db="spider",
    charset="utf8"
)
cur = conn.cursor()


def get_json(index):
    # 爬虫功能
    url = "https://study.163.com/p/search/studycourse.json"

    payload = {
    
    
        "activityId": 0,
        "keyword": "python",
        "orderType": 5,
        "pageIndex": index,
        "pageSize": 50,
        "priceType": -1,
        "qualityType": 0,
        "relativeOffset": 0,
        "searchTimeType": -1,
    }

    headers = {
    
    
        "accept": "application/json",
        "content-type": "application/json",
        "origin": "https://study.163.com",
        "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36"
    }

    try:
        response = requests.post(url, json=payload, headers=headers)
        content = response.json()
        if content and content["code"] == 0:
            return content
        return None

    except:
        print("出错了")


def get_course(content):
    course_list = content["result"]["list"]
    return course_list


def save_to_mysql(course_list):
    course_data = []
    for item in course_list:
        course_value = (
            0, item["courseId"], item["productName"], item["provider"], item["score"],
            item["learnerCount"], item["lectorName"], item["originalPrice"],
            item["discountPrice"], item["imgUrl"], item["bigImgUrl"], item["description"]
        )
        course_data.append(course_value)

    string_s = ('%s,' * 12)[:-1]
    sql_course = f"insert into course values ({string_s})"
    cur.executemany(sql_course, course_data)


def main(index):
    content = get_json(index)  # 获取json数据
    course_list = get_course(content)  # 获取第index页的50条件记录
    save_to_mysql(course_list)  # 写入到excel


if __name__ == "__main__":
    print("开始执行")
    total_page_count = get_json(1)["result"]["query"]["totlePageCount"]  # 总页数
    for index in range(1, total_page_count + 1):
        main(index)
    cur.close()
    conn.commit()
    conn.close()
    print("执行结束")

猜你喜欢

转载自blog.csdn.net/Yuyu920716/article/details/114176117