目录
目标
1.爬虫代码
1.1运行结果
1.2爬虫难点
1.2.1编写正则表达式:
1.3爬虫中的不足
1.3.1抓取的动漫播放链接不够完整
2.GUI展现爬虫内容
2.1思路
2.2运行结果
2.3GUI设计难点
2.3.1按标题查询--模糊查询
爬取来源链接:https://m.agefans.org/rank
爬取出排行榜1~100个动漫的排名、名称、热度的全部信息,将信息存储在sqlite3数据库中,并且最终用GUI展现出爬取出的结果。
import requests import re import sqlite3 def get_page(url):#返回url的HTML源码 response = requests.get(url) if response.status_code==200: return response.text else: return '失败' def parse_html(html):#解析参数html的HTML源码 #正则表达式匹配动漫排名,播放链接,名称,人气值 pattern=re.compile('<li class="row mb-1 rank-item">.*?rank.*?>(\d+)</span>.*?href="(.*?)".*?age-text-blue small.*?>(.*?)</span>.*?col-3 small text-truncate.*?>(.*?)</span>', re.S) result=re.findall(pattern, html) return result def link_html():#抓取来源html html = get_page('https://m.agefans.org/rank') result1 = parse_html(html) return result1 def save_db():#将爬取到的数据存储到sqlite中 result1=link_html() con=sqlite3.connect(r'...\AGE.db') con.execute("""DROP TABLE data""") con.execute("create table data (rank primary key,link,title,rating)") cur=con.cursor() cur.executemany("insert into data(rank,link,title,rating) values(?,?,?,?)",result1) con.commit() cur.close() con.close() if __name__ == '__main__': save_db()
用DB Browser for SQLite查看AGE.db爬取的内容(展示1~35条信息)
排名:.*?rank.*?>(\d+)</span>
链接:.*?href="(.*?)"
名称:.*?age-text-blue small.*?>(.*?)</span>
热度:.*?col-3 small text-truncate.*?>(.*?)</span>
每个网站对应的页面元素组成各不相同,需要根据实际所需要爬取的网站写出对应的正则表达式。CTRL+SHIFT+I进入检查页面查看元素。
链接link因为网站的<a>标签内的href不是绝对路径而是相对路径,爬取出来的链接并不能直接跳转,没找到能够将相对路径换成绝对路径的方法
import tkinter import tkinter.messagebox from tkinter.messagebox import * import tkinter.ttk import tkinter as tk import sqlite3 from PIL import ImageTk, Image from tkinter import ttk import pymysql win=tkinter.Tk() #页面大小 win.geometry("1390x750") win.title('AGE排行榜') #标题 label=tkinter.Label(win,compound = 'center',text='AGE动漫排行榜',font=('黑体',40),fg='#db7093',bg='#add8e6',width='500') label.pack() #背景图片 imgpath = (r'...\1.jpg')#背景图片路径 img = Image.open(imgpath) canvas = tk.Canvas(win, width=2500, height=1000, bd=0) photo = ImageTk.PhotoImage(img) canvas.create_image(690, 280, image=photo) canvas.pack() from tkinter import * Label(win, text="关键字查询:",bg='#add8e6',font=('黑体',15)).place(x=500, y=80, width=120, height=25) selecttitle = StringVar() Entry(win, textvariable=selecttitle).place(x=650, y=80, width=300, height=25) # 数据库位置 database = (r'...\AGE.db') # 显示函数 def showAllInfo(): # 将之前显示的内容删除 x = dataTreeview.get_children() for item in x: dataTreeview.delete(item) # 连接数据库 con = sqlite3.connect(database) cur = con.cursor() cur.execute("select * from data") lst = cur.fetchall() for item in lst: dataTreeview.insert("", 100, text="line1", values=item) cur.close() con.close() #按标题查询 def showTitle(): if selecttitle.get() == "": showerror(title='提示', message='输入不能为空') else: x = dataTreeview.get_children() for item in x: dataTreeview.delete(item) con = sqlite3.connect(database) cur = con.cursor() content="'%"+selecttitle.get()+"%'" #进行模糊查询 cur.execute("select * from data where title like "+content) lst = cur.fetchall() if len(lst) == 0: #判断如果查询不到则提示查询不到窗口 showerror(title='提示', message='此动漫暂未上榜,或检查输入信息是否正确') else:#否则显示查询几条记录窗口 showinfo(title='提示', message='查询到'+str(len(lst))+"条数据") for item in lst: dataTreeview.insert("", 100, text="line1", values=item) cur.close() con.close() tkinter.Button(win,text='查询全部',width=40,command=showAllInfo,font=(12)).place(x=800, y=125, width=120, height=30) Button(win, text="按标题查询", command=showTitle,font=(12)).place(x=550, y=125, width=120, height=30) #列表sqlite数据 dataTreeview = ttk.Treeview(win, show='headings', column=('rank','link', 'title', 'rating')) dataTreeview.column('rank', width=2, anchor="center") dataTreeview.column('link', width=20, anchor="center") dataTreeview.column('title', width=350, anchor="center") dataTreeview.column('rating', width=15, anchor="center") dataTreeview.heading('rank', text='排名') dataTreeview.heading('link', text='链接') dataTreeview.heading('title', text='名称') dataTreeview.heading('rating', text='热度') dataTreeview.place(x=200, y=180, width=1000, height=300) #滚动条 s = tkinter.Scrollbar(dataTreeview, command=dataTreeview.yview) s.pack(side="right", fill="y") dataTreeview.config(yscrollcommand=s.set) win.mainloop()
根据前面爬取的数据得到的数据库,实现GUI界面与SQLite数据库相连,即可查看排行榜信息,并且实现了能够查看全部信息,或者根据动漫名称关键字搜索可得相关信息。
除了可以按照标题查找,还能在此基础上拓展出按照热度、链接查找等功能。
content="'%"+selecttitle.get()+"%'"