700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > python爬虫-豆瓣电影Top250

python爬虫-豆瓣电影Top250

时间:2022-12-10 14:24:12

相关推荐

python爬虫-豆瓣电影Top250

豆瓣电影Top250

一、准备环境

idea+python插件/python

一、需求分析

1. 运用代码获取豆瓣电影Top250里面电影的相关信息:

影片详情链接;影片名称;影片图片链接;影片评分;影片评价人数;影片概况;影片相关信息。

2.将爬取到的信息进行存储

1. 存储到excel;

2. 存储到数据库中(sqlite)。

二、思路分析

1.爬取网页

1.先打开豆瓣电影Top250网页,通过右键“检查”来观察网页,完成正则表达式的编写:

2. 获得“模拟浏览器头部信息,向豆瓣服务器发送消息”的数据,如:

"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/",'Cookie':...#长这样的数据

方法:

看图片步骤,找到"User-Agent": 和 ‘Cookie’:并复制其内容

2. 保存数据

1.保存到excel

引用 import xlwt # 进行excel操作

定义方法 def saveData(datalist,savepath)

2.保存到数据库sqlite

引用 import sqlite3 # 进行数据库操作

定义方法 def saveData2DB(datalist, dbpath)

加入sqlite数据库

通过点File右边的+,找到方法中定义生成的sqlite数据库,之后点击Test Connection,如果Test不成功就按照步骤加载即可

三、代码实现

# coding:utf-8from bs4 import BeautifulSoup # 网页解析,获取数据import re # 正则表达式,进行文字匹配import urllib.request, urllib.error # 指定url,获取网页数据import xlwt # 进行excel操作import sqlite3 # 进行数据库操作def main():baseurl = "/top250?start=0"# 1.爬取网页dataList = getData(baseurl)askUrl(baseurl)getData(baseurl)# savapath = "D:/data/python/豆瓣电影Top250.xls"dbpath = "movie.db"#保存到数据库# 3.保存数据# saveData(dataList,savapath)saveData2DB(dataList,dbpath)# askUrl("/top250?start=")#定义全局变量#影片详情链接的规则(正则表达式)findLink = pile(r'<a href="(.*?)">')#创建正则表达式对象,表示规则(字符串的模式) 加 r 是达到忽视内容里面有/等符号#影片名称的正则表达式findName = pile(r'<span class="title">(.*)</span>')#影片图片findImgSrc = pile(r'<img.*src="(.*?)"',re.S)#因为.是不包含换行符的,所以加上re.S是让换行符包含在字符中#影片评分findRating = pile(r'<span class="rating_num" property="v:average">(.*)</span>')#找到评价人数findJudge = pile(r'<span>(\d*)人评价</span>')#找到概况findInq = pile(r'<span class="inq">(.*)</span>')#找到影片的相关内容findBd = pile(r'<p class="">(.*?)</p>',re.S)#加上re.S是为了忽视换行符 加问号表示0次到1次,不加会得到其它很多的内容# 爬取网页def getData(baseurl):datalist = []for i in range(0,10 ): #调用获取页面信息的函数 10次 10*25=250url = baseurl + str(i*25)html = askUrl(url) #保存获取到的网页源码# 2.解析数据soup = BeautifulSoup(html,"html.parser")for item in soup.find_all('div',class_="item"):#查找符合要求的字符串,形成列表# print(item)#为了查看电影itme的全部信息data=[]#保存一部电影的所有信息item=str(item)#转化成字符串#找到对象,获取到影片详情链接link = re.findall(findLink,item)[0]#re库用来通过正则表达式查找指定的字符串 ||链接data.append(link)#添加链接imgSrc = re.findall(findImgSrc,item)[0]data.append(imgSrc)#添加图片name = re.findall(findName,item)if(len(name)==2):cName = name[0]#中文名data.append(cName)oName = name[1].replace("/","")#英文名 因为源数据有/,而我们这里不需要/,所以用replace把/去掉data.append(oName)else:#只有一个的情况下data.append(name[0])data.append(" ")#因为之后要把数据存储到数据库,所以即使没有数据也要留出空格,保证数据的统一rating = re.findall(findRating,item)[0]data.append(rating)#评分judgeNum = re.findall(findJudge,item)[0]data.append(judgeNum)#评价人数inq = re.findall(findInq,item)#概况if(len(inq)!=0):inq = inq[0].replace("。","")#替换掉句号data.append(inq)else:data.append(" ")bd = re.findall(findBd,item)[0]#相关内容bd = re.sub('<br(\s+)?/>(\s+)?'," ",bd)#这里是去掉<br/>bd = re.sub('/'," ",bd)#替换/data.append(bd.strip())#strip() 去掉前后的空格datalist.append(data)#把处理好的一步电影信息放入datalist#print(data)# for title in soup.find_all('div',class_="item"):#data2 = []#title = str(title)#name = re.findall(findName,title)[0]#re库用来通过正则表达式来查找指定的字符串 ||电影名#print(name)# print(datalist)return datalist#得到指定的一个url的网页内容def askUrl(url):head = {#模拟浏览器头部信息,向豆瓣服务器发送消息"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/",'Cookie':...#这一块的数据没有完,由于每个人的不一样,所以这里提供的是获取的方法,方法在“爬取网页”的第二点。}#用户代理 表示告诉豆瓣服务器,我们是什么类型的机器,浏览器(本质上是告诉浏览器,我们可以接受什么水平的文件内容request = urllib.request.Request(url,headers=head)html = ""try:response = urllib.request.urlopen(request)html = response.read().decode("utf-8")#print(html)except urllib.error.URLError as e:if hasattr(e,"code"):print(e.code)if hasattr(e,"reason"):print(e.reason)return html# 保存数据def saveData(datalist,savepath):print("save......")book = xlwt.Workbook(encoding="utf-8", style_compression=0)sheet = book.add_sheet("豆瓣电影Top250",cell_overwrite_ok=True)col = ("电影详情链接","图片链接","电影中文名","电影其它名称","评分","评价次数","概况","相关信息")for i in range(0, 8):sheet.write(0,i,col[i])#列名for i in range(0,250):print("写入第%d条"%i)data = datalist[i]for j in range(0,8):sheet.write(i+1,j,data[j])#获取数据book.save(savepath)#保存数据def saveData2DB(datalist, dbpath):init_db(dbpath)conn = sqlite3.connect(dbpath)cursor = conn.cursor()#1获取游标for data in datalist:for index in range(len(data)):if index == 4 or index == 5:continuedata[index] = '"'+data[index]+'"'#给取出值加上双引号sql = '''insert into movie250(info_link, pic_link, cname, ename, score,rated, instroduction, info)values(%s)'''%",".join(data)print(sql)#先测试可不可行cursor.execute(sql)mit()cursor.close()conn.close()print("save to database ......")#创建初始化数据def init_db(dbpath):sql = ''' create table movie250(id integer primary key autoincrement,info_link text,pic_link text,cname varchar,ename varchar,score numeric ,rated numeric ,instroduction text,info text) ''' #创建数据表conn = sqlite3.connect(dbpath) #如果这个路径存在就连接,不存在就创建cursor = conn.cursor()#获取游标cursor.execute(sql)mit()conn.close()if __name__=="__main__":#调用方法main()init_db("movietest.db")print("爬取完毕!")

可分每个方法块测试,B站上有相应的教学视频,可以搜索学习,如对哪些地方还有疑惑,可看视频的详解。好好学习,天天向上!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。