栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

python爬虫-豆瓣电影Top250

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

python爬虫-豆瓣电影Top250

豆瓣电影Top250 一、准备环境

idea+python插件/python

一、需求分析

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

  1. 影片详情链接;
  2. 影片名称;
  3. 影片图片链接;
  4. 影片评分;
  5. 影片评价人数;
  6. 影片概况;
  7. 影片相关信息。

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-8

from bs4 import BeautifulSoup  # 网页解析,获取数据
import re  # 正则表达式,进行文字匹配
import urllib.request, urllib.error  # 指定url,获取网页数据
import xlwt  # 进行excel操作
import sqlite3  # 进行数据库操作


def main():
    baseurl = "https://movie.douban.com/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("https://movie.douban.com/top250?start=")

#定义全局变量
#影片详情链接的规则(正则表达式)
findlink = re.compile(r'')#创建正则表达式对象,表示规则(字符串的模式)  加 r 是达到忽视内容里面有/等符号
#影片名称的正则表达式
findName = re.compile(r'(.*)')
#影片图片
findImgSrc = re.compile(r',re.S)#因为.是不包含换行符的,所以加上re.S是让换行符包含在字符中
#影片评分
findRating = re.compile(r'(.*)')
#找到评价人数
findJudge = re.compile(r'(d*)人评价')
#找到概况
findInq = re.compile(r'(.*)')
#找到影片的相关内容
findBd = re.compile(r'

(.*?)

',re.S)#加上re.S是为了忽视换行符 加问号表示0次到1次,不加会得到其它很多的内容 # 爬取网页 def getData(baseurl): datalist = [] for i in range(0,10 ): #调用获取页面信息的函数 10次 10*25=250 url = 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('(s+)?'," ",bd)#这里是去掉
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: continue data[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) conn.commit() 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) conn.commit() conn.close() if __name__=="__main__": #调用方法 main() init_db("movietest.db") print("爬取完毕!")

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

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/580559.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号