爬虫课程设计(期末实训答辩作品)
前言
这个小项目是我本次python实训独立完成的作品,这次实训是由企业给我们上课并验收答辩,这个作品也是拿了一个优秀小组作品。本次作品分为爬虫源码、前端服务器源码、前端源码,由于前端服务器源码与前端源码的代码太多,我就没有放在这个文章上面,只有爬虫代码,如果有需要的,可以联系我分享全部的源码。所以这篇文章主要是我这次项目的遇到的问题与在这次实训中获取的经验。
本次实训的的目的
本次实训的教学内容是爬取一个网站(自己随便选择一个网站),将你想要的信息爬取下来,然后爬取的信息数据清洗,存入数据库,并搭建web服务器与前端页面,使web服务器与数据库可以数据交互,前端页面与web服务器可以进行数据交互,将清洗的数据用合适的统计图展示在前端,并从中分析价值。
数据库的建立
排名、番名、标签、播放总数、追番人数、开播日期,连载状态、评分、评分人数(rank、name、tips、play_num、people、date、status、point、point_num)
CREATE TABLE cartoon (
ct_rank VARCHAR(3) ,
ct_name VARCHAR(30),
ct_tips VARCHAR(30),
ct_play_num VARCHAR(10),
ct_people VARCHAR(10),
ct_date VARCHAR(20),
ct_status VARCHAR(20),
ct_point VARCHAR(5),
ct_point_num VARCHAR(10)
);
爬虫代码展示
from selenium import webdriver
from selenium.webdriver.common.by import By
import pymysql
if __name__ == '__main__':
conn = pymysql.connect(host='localhost', user='root', password='root', charset='utf8mb4')
cursor = conn.cursor()
cursor.execute("create database if not exists cartoon;")
conn.select_db("cartoon")
cursor.execute("""CREATE TABLE IF NOT EXISTS news (
ct_rank VARCHAR(3) ,
ct_name VARCHAR(30),
ct_tips VARCHAR(30),
ct_play_num VARCHAR(10),
ct_people VARCHAR(10),
ct_date VARCHAR(20),
ct_status VARCHAR(20),
ct_point VARCHAR(5),
ct_point_num VARCHAR(10)
);""")
driver = webdriver.Chrome()
driver.get("https://www.bilibili.com/v/popular/rank/bangumi")
neaItems=driver.find_elements(By.XPATH, "//*[@id='app']/div/div[2]/div[2]/ul/li")
num= len(neaItems)
print(num)
work_url = []
# i = 0
for neaItem in neaItems:
link_element = neaItem.find_element(By.XPATH, "div/div[1]/a")
url = link_element.get_attribute("href")
work_url.append(url)
# i += 1
# if i == 5:
# break
print(work_url)
driver.close()
elems = []
for i in work_url:
driver1 = webdriver.Chrome()
driver1.get(i)
link_element = driver1.find_element(By.XPATH, "//*[@id='__next']/div[2]/div[2]/div[2]/div/div[2]/a")
url = link_element.get_attribute("href")
driver1.close()
print(url)
driver2 = webdriver.Chrome()
driver2.get(url)
rank = work_url.index(i) + 1
name = driver2.find_element(By.XPATH, "//*[@id='app']/div[1]/div[2]/div/div[2]/div[1]/span[1]").text
tip = driver2.find_elements(By.XPATH, "//*[@id='app']/div[1]/div[2]/div/div[2]/div[1]/span[2]/span")
tips = ''
for i in tip:
if tips == '':
tips = i.text
continue
j = i.text
tips = tips + ',' + j
play_num = driver2.find_element(By.XPATH, "//*[@id='app']/div[1]/div[2]/div/div[2]/div[2]/div[1]/span[1]/em").text
people = driver2.find_element(By.XPATH, "//*[@id='app']/div[1]/div[2]/div/div[2]/div[2]/div[1]/span[2]/em").text
date = driver2.find_element(By.XPATH, "//*[@id='app']/div[1]/div[2]/div/div[2]/div[3]/span[1]").text
status = driver2.find_element(By.XPATH, "//*[@id='app']/div[1]/div[2]/div/div[2]/div[3]/span[2]").text
point = driver2.find_element(By.XPATH, "//*[@id='app']/div[1]/div[2]/div/div[2]/div[2]/div[2]/div/div[1]").text
try:
point_num = driver2.find_element(By.XPATH,"//*[@id='app']/div[1]/div[2]/div/div[2]/div[2]/div[2]/div/div[2]/div[1]").text
except Exception :
point_num = '评分人数不足'
driver2.close()
print(rank)
print(tips)
print(name)
print(play_num)
print(people)
print(date)
print(status)
print(point)
print(point_num)
elem = {
"rank":str(rank),
"name":name,
"tips":tips,
"play_num":play_num,
"people":people,
"date":date,
"status":status,
"point":point,
"point_num":point_num
}
elems.append(elem)
sql = "insert into news(ct_rank,ct_name,ct_tips,ct_play_num,ct_people,ct_date,ct_status,ct_point,ct_point_num) values(%s,%s,%s,%s,%s,%s,%s,%s,%s)"
for item in elems:
cursor.execute(sql, (
item['rank'], item['name'], item['tips'], item['play_num'], item['people'], item['date'], item['status'],
item['point'], item['point_num']))
conn.commit()
cursor.close()
conn.close()
代码作用:连接本地的数据库,然后判断本地的数据里是否有cartoon的数据库,如果没有cartoon数据库就创建,然后与cartoon建立连接,在里面检查里面是否存在一个news的表,如果没有这个表就创建一个。接下来就是爬虫操作了,本次爬取的是b站热门动漫的相关信息,首先创建一个Chrome浏览器的实例对象,然后与b站热门番剧榜网站建立连接,根据目标网站的html结构爬取自己需要的内容,我想爬取的信息不在这个页面上面,需要进行深度爬取,意味着我需要进入榜单上每个动漫的详细页面并在里面爬取相关信息,具体步骤就看代码吧。
本次实训收获
- 了解如何使用python中的selenium库对网页的信息进行爬取,并保存在数据库中
- 了解使用Tomcat,并使用搭建后端服务器实现与数据库的数据交互
- 了解使用 AJAX 请求在不重新加载整个页面的情况下与服务器进行异步通信