本次将爬取的网易云课程信息存入数据库,首先需要对课程数据进行分析,然后根据课程数据信息创建对应的数据表中的字段。最后,将爬取的课程数据写入到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("执行结束")