idea+python插件/python
一、需求分析二、思路分析 1.爬取网页1. 运用代码获取豆瓣电影Top250里面电影的相关信息:
- 影片详情链接;
- 影片名称;
- 影片图片链接;
- 影片评分;
- 影片评价人数;
- 影片概况;
- 影片相关信息。
2.将爬取到的信息进行存储
1. 存储到excel;
2. 存储到数据库中(sqlite)。
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’:并复制其内容
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站上有相应的教学视频,可以搜索学习,如对哪些地方还有疑惑,可看视频的详解。好好学习,天天向上!



