利用python相关的库进行爬取豆瓣网Top250部电影的信息 BeautifulSoup:解析网页数据 urllib:伪装成浏览器向豆瓣服务器发送信息 re:去除多余的标签,拿到最终想要的结果 xlwt:将得到的结果保存到excel
一共分为3个功能模块 1.得到URL的网页内容
def askURL(url): head = { # 模拟浏览器头部信息,向豆瓣服务器发送消息 "User-Agent": "Mozilla / 5.0(Windows NT 10.0; Win64; x64) AppleWebKit / 537.36(KHTML, like Gecko) Chrome / 80.0.3987.122 Safari / 537.36" } request = urllib.request.Request(url, headers=head) html = "" try: response = urllib.request.urlopen(request) html = response.read().decode("utf-8") except urllib.error.URLError as e: if hasattr(e, "code"): print(e.code) if hasattr(e, "reason"): print(e.reason) return html2.爬取网页
def getData(baseurl): datalist = [] for i in range(0, 10): # 调用获取页面信息的函数,10次 url = baseurl + str(i * 25) html = askURL(url) # 保存获取到的网页源码 # 2.逐一解析数据 soup = BeautifulSoup(html, "html.parser") for item in soup.find_all('div', class_="item"): # 查找符合要求的字符串,形成列表 data = [] # 保存一部电影的所有信息 item = str(item) # 添加链接 link = re.findall(findLink, item)[0] # re库用来通过正则表达式查找指定的字符串 data.append(link) # 添加图片 imgSrc = re.findall(findImgSrc, item)[0] data.append(imgSrc) # 添加电影名 titles = re.findall(findTitle, item) # 片名可能只有一个中文名,没有外国名 if (len(titles) == 2): ctitle = titles[0] # 添加中文名 data.append(ctitle) otitle = titles[1].replace("/", "") # 去掉无关的符号 data.append(otitle) # 添加外国名 else: data.append(titles[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()) # 去掉前后的空格 datalist.append(data) # 把处理好的一部电影信息放入datalist return datalist3.保存数据
def saveData(datalist, savepath): print("开始保存....") book = xlwt.Workbook(encoding="utf-8", style_compression=0) # 创建workbook对象 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 + 1)) data = datalist[i] for j in range(0, 8): sheet.write(i + 1, j, data[j]) # 数据 book.save(savepath)完整代码
# -*- codeing = utf-8 -*- # @Time : 2020/6/30 10:52 # @Author : Jin # @File : doubaner2.py # @Software: PyCharm from bs4 import BeautifulSoup # 网页解析,获取数据 import re # 正则表达式,进行文字匹配 import urllib.request, urllib.error # 制定URL,获取网页数据 import xlwt # 进行excel操作 def main(): baseurl = "https://movie.douban.com/top250?start=" # 1.爬取网页 datalist = getData(baseurl) savepath = "豆瓣电影Top250.xls" # 3.保存数据 saveData(datalist, savepath) # 影片详情链接的规则 findLink = re.compile(r'<a href="(.*?)">') # 影片图片 findImgSrc = re.compile(r'<img.*src="(.*?)"', re.S) # re.S 让换行符包含在字符中 # 影片片名 findTitle = re.compile(r'<span class="title">(.*)</span>') # 影片评分 findRating = re.compile(r'<span class="rating_num" property="v:average">(.*)</span>') # 找到评价人数 findJudge = re.compile(r'<span>(\d*)人评价</span>') # 找到概况 findInq = re.compile(r'<span class="inq">(.*)</span>') # 找到影片的相关内容 findBd = re.compile(r'<p class="">(.*?)</p>', re.S) # 爬取网页 def getData(baseurl): datalist = [] for i in range(0, 10): # 调用获取页面信息的函数,10次 url = baseurl + str(i * 25) html = askURL(url) # 保存获取到的网页源码 # 2.逐一解析数据 soup = BeautifulSoup(html, "html.parser") for item in soup.find_all('div', class_="item"): # 查找符合要求的字符串,形成列表 data = [] # 保存一部电影的所有信息 item = str(item) # 添加链接 link = re.findall(findLink, item)[0] # re库用来通过正则表达式查找指定的字符串 data.append(link) # 添加图片 imgSrc = re.findall(findImgSrc, item)[0] data.append(imgSrc) # 添加电影名 titles = re.findall(findTitle, item) # 片名可能只有一个中文名,没有外国名 if (len(titles) == 2): ctitle = titles[0] # 添加中文名 data.append(ctitle) otitle = titles[1].replace("/", "") # 去掉无关的符号 data.append(otitle) # 添加外国名 else: data.append(titles[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()) # 去掉前后的空格 datalist.append(data) # 把处理好的一部电影信息放入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 / 80.0.3987.122 Safari / 537.36" } request = urllib.request.Request(url, headers=head) html = "" try: response = urllib.request.urlopen(request) html = response.read().decode("utf-8") 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("开始保存....") book = xlwt.Workbook(encoding="utf-8", style_compression=0) # 创建workbook对象 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 + 1)) data = datalist[i] for j in range(0, 8): sheet.write(i + 1, j, data[j]) # 数据 book.save(savepath) if __name__ == "__main__": main() print("爬取完毕!")最终保存的xls文件概览: