关于使用Python中的urllib、re、pymysql、bs4等模块实现豆瓣电影top250数据爬取
需要导入的模块
import re
import urllib.request
import xlwt #如果要保存到excel表格中可以导入这个模块
from bs4 import BeautifulSoup
import pymysql.cursors
定义一个函数启动项
def main():
#将函数存放在总函数下面
datalist = Data(target_url)
SaveData(datalist)
if __name__ == '__main__':
main()
获取并定义目标的url路径
target_url = "https://movie.douban.com/top250?start="
定义一个headers,防止被网站识别为爬虫
header = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.89 Safari/537.36 SLBrowser/7.0.0.1071 SLBChan/30"}
将上面的定义写一个函数来访问豆瓣,同时将返回的数据进行“utf-8”解码之后返回
def askURL(url):
request = urllib.request.Request(url, headers=header)
soup = urllib.request.urlopen(request)
html = ""
html = soup.read().decode("utf-8")
return html
写一个正则表达式的规律方便后期Data函数调用
findlink = re.compile(r'<a href="(.*?)">')
findImg = re.compile(r'<img.*rc="(.*?)"',re.S) #re.S的意思是忽略换行符号对链接的影响
findtitle = re.compile(r'<span class="title">(.*)</span>')
findscore = re.compile(r'<span class="rating_num" property="v:average">(.*)</span>')
findpeople = re.compile(r'<span>(.*)人评价</span>')
findinq = re.compile(r'<span class="inq">(.*)</span>')
定义一个函数来接数据
def Data(url):
datalist = []
for i in range(0,10):
url = target_url + str(i * 25) #写个循环来取到不同页面的链接
i+=1
html = askURL(url)
soup = BeautifulSoup(html, "html.parser")
for item in soup.find_all('div',class_="item"): #在返回的数据中寻找'div',class_="item"类型的数据
data = []
item = str(item) ##将item进行字符串化方便后期的正则提取
# 电影详情链接
link = re.findall(findlink,item)[0]
data.append(link)
# 电影图片
img = re.findall(findImg,item)[0]
data.append(img)
# 电影名称
title = re.findall(findtitle, item)
if (len(title)==2):
ctitle = title[0]
data.append(ctitle)
otitle = title[1].replace("\xa0/\xa0","") #将数据中的"\xa0/\xa0"用空格代替
data.append(otitle)
else:
data.append(title[0])
data.append(" ")
# 电影评分
score = re.findall(findscore, item)[0]
data.append(score)
# 电影评价人数
people = re.findall(findpeople, item)[0]
data.append(people)
# 电影概况
if len(re.findall(findinq, item))==0: #判断是否为空值
inq = " "
data.append(inq)
else:
inq = re.findall(findinq, item)[0]
data.append(inq)
datalist.append(data)
return datalist
将返回的数据导入到MySQL数据库,写一个保存路径
def path():
cone = pymysql.connect(user='root',password='123456',host='localhost',port=3306,database='test',charset='utf8') #登入到MySQL数据库
c = cone.cursor() #写一个光标控制器
#用sql语句来创建一个表来存放数据
sql = '''
create table movie(
movielink text not null,
imglink text not null,
title text not null,
English text not null,
score double not null,
people int not null,
inq text not null
);
'''
c.execute(sql) #执行上面的sql语句
cone.commit() #保存数据
cone.close() #关闭
保存数据到MySQL
def SaveData(datalist):
path() #将路径函数执行
cone = pymysql.connect(user='root', password='123456', host='localhost', port=3306, database='test', charset='utf8') #登入数据库
cur = cone.cursor() #定义光标
for data in datalist: #从datalist中取出每一步电影的数据
for index in range(len(data)):
data[index] = '"' + data[index] + '"'
sql = '''insert into movie values(%s)'''%",".join(data) #键入占位符并用,将数据分隔开
cur.execute(sql)
cone.commit()
cur.close()
cone.close()
保存数据到excel
def savaData(datalist):
workbook = xlwt.Workbook(encoding="utf-8",style_compression=0)
sheet = workbook.add_sheet("sheet1",cell_overwrite_ok=True)
col = ("电影详情链接","图片链接","电影名称","English Name","电影评分","电影评价人数","电影概况")
for i in range(0,7):
sheet.write(0,i,col[i])
for i in range(0,250):
print("%d条插入完毕"%i)
data = datalist[i]
data.append(data)
for j in range(0,7):
sheet.write(i+1,j,data[j])
workbook.save("Test.xls")
ps:该项目是一个爬虫新手总结大佬的方法写出的,希望大佬们不喜勿喷,多多指点。