Python爬虫 爬取豆瓣电影TOP250

最近在b站上学习了一下python的爬虫,实践爬取豆瓣的电影top250,现在对这两天的学习进行一下总结

主要分为三步:

  1. 爬取豆瓣top250的网页,并通过正则表达式将需要的信息摘取下来
  2. 将这些信息存入excel表格中
  3. 将这些信息存入MySQL数据库中(复习一下python对数据库的操作)

对豆瓣电影TOP250网页的爬取

进入豆瓣top250

看它的URL

可以发现start=0时是第一页,点击第二页的时候是start=25,根据这个规律就可以将全部10页的网页都爬取下来。

首先要导入几个python库,分别是urllib,BeautifulSoup,re,可以解决网络请求,网页解析和正则表达式提取所需内容的问题。

代码

from bs4 import BeautifulSoup
import re
import urllib.request,urllib.errordef main():print("开始爬取数据")baseUrl = "https://movie.douban.com/top250?start="dataList = getData(baseUrl) #爬取数据print("爬取数据完成")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>') # 提取评分
findJudgeNum = 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(url):dataList = []for i in range(0,10):tmp_url = url + str(i*25)html = askURL(tmp_url)# 逐一解析网页soup = BeautifulSoup(html,"html.parser")for item in soup.find_all("div",class_="item"):item = str(item)data = []link = re.findall(findLink,item)[0] # 获取影片链接data.append(link)imgSrc = re.findall(findImgSrc,item)[0]data.append(imgSrc)title = re.findall(findTitle,item)if len(title) == 2:ctitle = title[0]data.append(ctitle)foreign_title = title[1].replace("/","")data.append(foreign_title)else:ctitle = title[0]foreign_title = " " # 没有外文名时留空data.append(ctitle)data.append(foreign_title)rating = re.findall(findRating,item)[0]data.append(rating)judgeNum = re.findall(findJudgeNum,item)[0]data.append(judgeNum)inq = re.findall(findInq,item)if len(inq) != 0:inq = inq[0].replace("。","")data.append(inq)else:inq = " "data.append(inq)bd = re.findall(findBd,item)[0]bd = re.sub(r'<br(\s+)?/>(\s+)?'," ",bd) # 去掉bd中的<br/>data.append(bd.strip()) # 去掉前后的空格dataList.append(data)return dataListdef askURL(url):head = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.105 Safari/537.36"}# 伪装成浏览器req = urllib.request.Request(url,headers=head)html = ""try:response = urllib.request.urlopen(req)html = response.read().decode("utf-8")# 得到网页except urllib.error.HTTPError as e:if hasattr(e,"code"):print(e.code)if hasattr(e,"reason"):print(e.reason)return htmlif __name__ == "__main__":main()

分析

在main函数里创建一个getData函数来获取爬取到的网页数据,在getData函数里使用askURL函数得到每一个网页,在askURL里尤其要注意头部的伪装,将python爬虫程序伪装成浏览器访问样式

当然豆瓣也使用了对同一ip访问过于频繁的过滤,所以如果访问的太过频繁被403了,可以考虑增加使用代理ip来伪装程序,我就在调试的过程中被ban了,不过由于不想买代理ip,并且网上找到的免费的代理ip全都没用,我就直接梯子开全局模式将https请求的ip改到别的地区了。

通过一次askURL可以得到一页25部电影的网页代码,然后先对豆瓣的这个网页代码分析一下,看看一会要提取的数据在哪些标签中,打开网页源码,找到包含电影信息的标签

<li><div class="item"><div class="pic"><em class="">1</em><a href="https://movie.douban.com/subject/1292052/"><img width="100" alt="肖申克的救赎" src="https://img2.doubanio.com/view/photo/s_ratio_poster/public/p480747492.webp" class=""></a></div><div class="info"><div class="hd"><a href="https://movie.douban.com/subject/1292052/" class=""><span class="title">肖申克的救赎</span><span class="title">&nbsp;/&nbsp;The Shawshank Redemption</span><span class="other">&nbsp;/&nbsp;月黑高飞(港)  /  刺激1995(台)</span></a><span class="playable">[可播放]</span></div><div class="bd"><p class="">导演: 弗兰克·德拉邦特 Frank Darabont&nbsp;&nbsp;&nbsp;主演: 蒂姆·罗宾斯 Tim Robbins /...<br>1994&nbsp;/&nbsp;美国&nbsp;/&nbsp;犯罪 剧情</p><div class="star"><span class="rating5-t"></span><span class="rating_num" property="v:average">9.7</span><span property="v:best" content="10.0"></span><span>2255328人评价</span></div><p class="quote"><span class="inq">希望让人自由。</span></p><p><span class="gact"><a href="https://movie.douban.com/wish/200078450/update?add=1292052" target="_blank" class="j a_collect_btn" name="sbtn-1292052-wish" rel="nofollow">想看</a></span>&nbsp;&nbsp;<span class="gact"><a href="https://movie.douban.com/collection/200078450/update?add=1292052" target="_blank" class="j a_collect_btn" name="sbtn-1292052-collection" rel="nofollow">看过</a></span>&nbsp;&nbsp;</p></div></div></div></li>

这里只简述一下,源码就不全部粘贴了,可以发现每部电影都在<div class=“item”>中,于是只需要在得到的网页中把类是item的这一块提取出来就行了

soup = BeautifulSoup(html,"html.parser")
for item in soup.find_all("div",class_="item"):

也就是这两句的作用,将得到的网页通过html解析器来解析,然后找到div标签中类是item的所有字符,剩下的就是对这些字符的正则表达式提取了,使用re库即可很容易的办到,网上也有很多关于正则表达式的讲解,比如菜鸟教程,本次用到的基本就是懒惰匹配和贪婪匹配。

将这些信息都保存到二维列表dataList中,这样每一行都保存的就是一部电影的信息,至此,对250部电影信息的提取就结束了。

将电影信息保存到excel表中

就是将列表内容保存到excel中,使用python可以很方便的解决,只需要导入xlwt库就可以了。

代码

def main():print("开始爬取数据")baseUrl = "https://movie.douban.com/top250?start="dataList = getData(baseUrl) #爬取数据print("爬取数据完成")savePath = r'spider.xls'saveData(dataList,savePath) #保存数据到excel中def saveData(dataList,savePath):book = xlwt.Workbook(encoding="utf-8")sheet = book.add_sheet('豆瓣电影top250',cell_overwrite_ok=True)col = ("影片链接","图片链接","影片中文名称","影片外文名","评分","评论人数","影片介绍","影片背景")for i in range(len(col)):sheet.write(0,i,col[i])for k in range(len(dataList)):data = dataList[k]for j in range(len(data)):sheet.write(k+1,j,data[j])book.save(savePath)if __name__ == "__main__":main()

分析

主要注意的就是编码的问题,防止储存的时候出现乱码,当然把所有创建的文件都改成utf-8就完了。

保存后的结果:

可以看出保存的结果非常成功,我发现这些top250的电影大部分都看过,不过大陆电影里没有路边野餐让我有点可惜,毕赣的这个电影给人的感觉也不输这些top,这里指路一下知乎里对它的介绍吧,《路边野餐》究竟讲了个什么故事?。

将信息保存到MySQL中

温习一下python链接mysql数据库的操作,将这些东西存进数据库里,当然和上面一样引入一个pymysql的库就能大大简化操作了。

代码

def main():print("开始爬取数据")baseUrl = "https://movie.douban.com/top250?start="dataList = getData(baseUrl) #爬取数据print("爬取数据完成")print(len(dataList))savePath = r'spider.xls'saveData(dataList,savePath) #保存数据到excel中print("保存数据到excel表中完成")sm = SaveMySQL("用户名","密码","数据库名",dataList) #保存数据到MySQL中sm.createTable()sm.insertData()print("保存数据到MySQL中完成")class SaveMySQL:def __init__(self, user:str, password:str, database:str, dataList:List):self.user = userself.password = passwordself.database = databaseself.dataList = dataListdef createTable(self):conn = pymysql.connect("localhost",self.user,self.password,self.database)cur = conn.cursor()sql1 = "drop table if exists moive_doubanTOP250;"sql2 = '''create table moive_doubanTOP250(id int primary key auto_increment,link varchar(255),imgsrc varchar(255),chinese_name varchar(100),foreign_name varchar(100),rating float,judgeNum int,Inq varchar(255),Bd varchar(255));'''cur.execute(sql1)cur.execute(sql2)conn.commit()conn.close()def insertData(self):conn = pymysql.connect("localhost",self.user,self.password,self.database)cur = conn.cursor()for data in self.dataList:for index in range(len(data)):data[index] = '"'+data[index]+'"'sql = '''insert into moive_doubanTOP250(link,imgsrc,chinese_name,foreign_name,rating,judgeNum,Inq,Bd)values(%s)'''%",".join(data)cur.execute(sql)conn.commit()conn.close()if __name__ == "__main__":main()

分析

这次采取使用python类的方式来写,也当作一起复习了,主要操作就是连接数据库,然后创建游标,游标执行写好的SQL语句,然后提交,关闭连接。

在SaveMySQL这个类里主要就是2个方法,一个创建表,一个插入数据,都比较简单,需要注意的是在写插入数据的SQL的时候,用join函数把每一个数据用逗号隔开,也就是这种写法

sql = '''insert into moive_doubanTOP250(link,imgsrc,chinese_name,foreign_name,rating,judgeNum,Inq,Bd)values(%s)'''%",".join(data)

非常方便,不愧是python。

保存结果:

发现movie拼错了。。。有点无语

中间这一些问号是爬取网页提取的时候没有换掉的\x0,没有太大的问题,想换的话直接

bd = re.findall(findBd,item)[0].replace("\x0"," ")

或者用re里面的sub都可以解决。

总结

这次学习的爬虫知识比较简单,爬的网页也只是对html进行了一些分析,上手还是很快的,基本上就是对Python的库的调用,只能说python永远滴神,当然对于防止被ban也有一定的了解了,学到了网络中应用层的一些机制,这学期计网就是我永远的痛。。。

找个时间继续深入了解一下这个爬虫吧,希望还能写下一篇爬虫的博客。

对了,附上完整的代码:

#!/usr/bin/env python3
# -*- coding: utf-8 -*-'WebSpider Module'__author__ = 'Handson Huang'from bs4 import BeautifulSoup
import re # 正则表达式
import urllib.request,urllib.error
import xlwt
import pymysql
from typing import Listdef main():print("开始爬取数据")baseUrl = "https://movie.douban.com/top250?start="dataList = getData(baseUrl)                      # 爬取数据print("爬取数据完成")print(len(dataList))                             # 判断是否爬取到内容savePath = r'spider.xls'saveData(dataList,savePath)                      #保存数据到excel中print("保存数据到excel表中完成")sm = SaveMySQL("用户名","密码","数据库名",dataList) #保存数据到MySQL中sm.createTable()sm.insertData()print("保存数据到MySQL中完成")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>') # 提取评分
findJudgeNum = 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(url):dataList = []for i in range(0,10):tmp_url = url + str(i*25)html = askURL(tmp_url)# 逐一解析网页soup = BeautifulSoup(html,"html.parser")for item in soup.find_all("div",class_="item"):item = str(item)data = []link = re.findall(findLink,item)[0] # 获取影片链接data.append(link)imgSrc = re.findall(findImgSrc,item)[0]data.append(imgSrc)title = re.findall(findTitle,item)if len(title) == 2:ctitle = title[0]data.append(ctitle)foreign_title = title[1].replace("/","")data.append(foreign_title)else:ctitle = title[0]foreign_title = " " # 没有外文名时留空data.append(ctitle)data.append(foreign_title)rating = re.findall(findRating,item)[0]data.append(rating)judgeNum = re.findall(findJudgeNum,item)[0]data.append(judgeNum)inq = re.findall(findInq,item)if len(inq) != 0:inq = inq[0].replace("。","")data.append(inq)else:inq = " "data.append(inq)bd = re.findall(findBd,item)[0]bd = re.sub(r'<br(\s+)?/>(\s+)?'," ",bd) # 去掉bd中的<br/>data.append(bd.strip()) # 去掉前后的空格dataList.append(data)return dataListdef askURL(url):head = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.105 Safari/537.36"}req = urllib.request.Request(url,headers=head)html = ""try:response = urllib.request.urlopen(req)html = response.read().decode("utf-8")except urllib.error.HTTPError as e:if hasattr(e,"code"):print(e.code)if hasattr(e,"reason"):print(e.reason)return html#保存数据到excel表里
def saveData(dataList,savePath):book = xlwt.Workbook(encoding="utf-8")sheet = book.add_sheet('豆瓣电影top250',cell_overwrite_ok=True)col = ("影片链接","图片链接","影片中文名称","影片外文名","评分","评论人数","影片介绍","影片背景")for i in range(len(col)):sheet.write(0,i,col[i])for k in range(len(dataList)):data = dataList[k]for j in range(len(data)):sheet.write(k+1,j,data[j])book.save(savePath)# 保存数据到mysql里
class SaveMySQL:def __init__(self, user:str, password:str, database:str, dataList:List):self.user = userself.password = passwordself.database = databaseself.dataList = dataListdef createTable(self):conn = pymysql.connect("localhost",self.user,self.password,self.database)cur = conn.cursor()sql1 = "drop table if exists moive_doubanTOP250;"sql2 = '''create table moive_doubanTOP250(id int primary key auto_increment,link varchar(255),imgsrc varchar(255),chinese_name varchar(100),foreign_name varchar(100),rating float,judgeNum int,Inq varchar(255),Bd varchar(255));'''cur.execute(sql1)cur.execute(sql2)conn.commit()conn.close()def insertData(self):conn = pymysql.connect("localhost",self.user,self.password,self.database)cur = conn.cursor()for data in self.dataList:for index in range(len(data)):data[index] = '"'+data[index]+'"'sql = '''insert into moive_doubanTOP250(link,imgsrc,chinese_name,foreign_name,rating,judgeNum,Inq,Bd)values(%s)'''%",".join(data)cur.execute(sql)conn.commit()conn.close()if __name__ == "__main__":main()

Python爬虫 爬取豆瓣电影TOP250相关推荐

  1. Python爬虫爬取豆瓣电影Top250

    爬虫爬取豆瓣Top250 文章目录 爬虫爬取豆瓣Top250 完整代码 第一步获取整个网页并以html来解析 正则表达式来匹配关键词 所有信息写入列表中 存入Excel中 效果如图 本文学习自B站UP ...

  2. python爬取豆瓣电影top250的代码_Python爬虫——爬取豆瓣电影Top250代码实例

    利用python爬取豆瓣电影Top250的相关信息,包括电影详情链接,图片链接,影片中文名,影片外国名,评分,评价数,概况,导演,主演,年份,地区,类别这12项内容,然后将爬取的信息写入Excel表中 ...

  3. python爬虫爬取豆瓣电影排行榜并通过pandas保存到Excel文件当中

    我们的需求是利用python爬虫爬取豆瓣电影排行榜数据,并将数据通过pandas保存到Excel文件当中(步骤详细) 我们用到的第三方库如下所示: import requests import pan ...

  4. Python爬虫爬取豆瓣电影评论内容,评论时间和评论人

    Python爬虫爬取豆瓣电影评论内容,评论时间和评论人 我们可以看到影评比较长,需要展开才能完整显示.但是在网页源码中是没有显示完整影评的.所以我们考虑到这部分应该是异步加载的方式显示.所以打开网页的 ...

  5. python爬虫爬取豆瓣读书Top250

    python爬虫爬取豆瓣读书Top250 话不多说,直接上代码! from urllib.request import urlopen, Request from bs4 import Beautif ...

  6. python爬取豆瓣电影top250_Python爬虫——爬取豆瓣电影Top250代码实例

    利用python爬取豆瓣电影Top250的相关信息,包括电影详情链接,图片链接,影片中文名,影片外国名,评分,评价数,概况,导演,主演,年份,地区,类别这12项内容,然后将爬取的信息写入Excel表中 ...

  7. python BeautifulSoup爬取豆瓣电影top250信息并写入Excel表格

    豆瓣是一个社区网站,创立于2005年3月6日.该网站以书影音起家,提供关于书籍,电影,音乐等作品信息,其描述和评论都是由用户提供的,是Web2.0网站中具有特色的一个网站. 豆瓣电影top250网址: ...

  8. python豆瓣电影top250爬虫课程设计_[教程]图文:爬虫爬取豆瓣电影top250

    window环境下 使用python脚本爬取豆瓣 环境安装 python python开发环境 jupyter python web IDE requests python requests模块用于向 ...

  9. python爬虫爬取豆瓣电影信息城市_Python爬虫入门 | 2 爬取豆瓣电影信息

    这是一个适用于小白的Python爬虫免费教学课程,只有7节,让零基础的你初步了解爬虫,跟着课程内容能自己爬取资源.看着文章,打开电脑动手实践,平均45分钟就能学完一节,如果你愿意,今天内你就可以迈入爬 ...

最新文章

  1. Revit API导出GBXML
  2. PHP stripos strpos,strpos()和stripos()函数的区别
  3. python链式赋值与C++赋值的结果比较与分析
  4. 如何在不同的浏览器中设置Selenium网格以并行执行
  5. Redux从设计到源码
  6. 【Spring】spring depend-on 到底是干什么的?
  7. 解析网页(KMP算法实现部分)
  8. CCNA CCNP全套教材 CCNA CCNP视频 CCNA CCNP最新题库解析
  9. Java通过 JDBC 连接数据库操作
  10. 《PRML》学习笔记2.2——多项式分布和狄利克雷分布
  11. SpringBoot数据访问CannotGetJdbcConnectionException: Failed to obtain JDBC Connection异常的解决方式。
  12. 嗖嗖移动业务大厅——功能分析
  13. 期权定价模型之Heston模型--参数校准与定价【附python代码】
  14. FPGA基础之VGA(三)移动方块
  15. 《开源软件架构》--nginx配置与内部(三)
  16. 机器学习——霍夫丁不等式【转】
  17. JDK8 after时间日期api
  18. 微信小程序云开发教程-手把手:获取微信订阅消息的模板ID
  19. Linux nice命令简要介绍
  20. 0基础学RS(十四)VTP(VLAN中继协议)作用及配置

热门文章

  1. C语言:有一个一维数组score,内放10个学生成绩,求平均成绩。
  2. wordpress 安全保密hacks
  3. WPS word中插入“批注”不显示
  4. MySQL数据库中如何查询分组后每组中的最后一条记录?
  5. 如何做好开发组长工作
  6. 中创|又临双11淘宝崩了,中心化存储难以支撑
  7. Codeforce 1296 E String Coloring
  8. 中文字符 简体繁体相互转换
  9. 初学者学习网页设计用什么软件最好?
  10. BDL語法知識 变量的初始话