爬取时间:2020-03-13爬取难度:★★☆☆☆☆这次采用的存储方式是sql数据库存储

爬取豆瓣Top250

  • 一、循环爬取网页模板
  • 二、解析与处理模块
    • 1、BeautifulSoup解析电影名称,评分信息和评论人数
    • 2、BeautifulSoup解析其他详细信息
    • 3、整合
  • 三、保存文本内容以及图片
  • 四、数据存储
  • 五、在mysql中创建表格
    • 1、建立连接
    • 2、创建表格
  • 六、完整代码
  • 七、数据截图
  • 八、程序的不足之处

一、循环爬取网页模板

打开豆瓣电影top榜单,请求地址为:https://movie.douban.com/top250
通关观察,我们可以发现每页展示25条电影信息,多次翻页我们可以观察到url的变化:
第一页:https://movie.douban.com/top250
第二页:https://movie.douban.com/top250?start=25&filter=
第三页:https://movie.douban.com/top250?start=50&filter=
通过以上我们可以看到每一页的“start= ”后面的数字跟随每一页的具体数值而改变。 电影总共有250部,以此类推,我们可以知道共10页。那么这10页要如何跳转呢?我么可以看下面的代码:

url = 'https://movie.douban.com/top250?start=%d&filter='
......# 页面的跳转def start_download(self):while self.dstart < self.dtotal:durl = self.durl%self.dstart# print(durl)self.load_page(durl)self.dstart += self.dstepbreak    # 如果爬取全部可以直接放开

根据上面的url链接,再通过下面的自定义函数,实现页面跳转的功能。

二、解析与处理模块

再定义解析函数之前,我们需要添加一个并定义一个报错函数:

from urllib import errordef req_page(self,url):# 请求异常处理pass

详细看下这个函数req_page(),首先我们打开网页,如果出现错误,会打印出来,好让你可以根据错误修改程序,如果正常,就会跳转至下面的自定义功能函数:

        def req_page(self,url):try:req=urllib.request.Request(url=url,headers=headers)req = urlopen(req)except error.HTTPError as e:print('catch e:',e)return Noneexcept:print('url request error:',url)return Noneif req.code!=200:returnpageinfo = req.read().decode('utf-8')return pageinfo

1、BeautifulSoup解析电影名称,评分信息和评论人数

首先我们需要再网页中查看电影名称,评分信息和评论人数等信息:
①电影名称

通过上面的图片我们知道,爬取的内容很简单,只需爬取span标签下的title就行了,代码如下:

            listdiv = obj.find_all('div',class_='hd')for div in listdiv:# print(div)murl = div.find('a').get('href')mname = div.find('span',class_='title').get_text()print(mname)

②评分信息

分析页面我们知道评分在<strong class="ll rating_num" property="v:average">9.7</strong>这个标签内,我们只需查找标签为property="v:average"就可以了,代码如下:

mscore = obj.find('div',class_="rating_self clearfix")score = mscore.find(property="v:average").get_text()

③评论人数

分析页面我们知道评分在<span property="v:votes">1921019</span>这个标签内,我们只需查找标签为property="v:votes"就可以了,代码如下:

votes = mscore.find(property="v:votes").get_text()

2、BeautifulSoup解析其他详细信息


通过上面的网页分析,我们可以发现,这些详细信息都存放在<div id = "info">中,下面我们要做的就是将这些文字提取出来:

        def parse_minfo(self,url,mname):pinfo = self.req_page(url)if not pinfo:returnobj = BeautifulSoup(pinfo,'html5lib')minfo = obj.find('div',id='info')tinfo = minfo.get_text()

3、整合

上面的工作做完以后,我们需要把爬取的列表切割成字典,代码如下:

        # 把列表切割成字典def parse_text(self,minfo):# listt = minfo.split('\n')  # 切分listt = [item.strip()for item in  minfo.split('\n') if item.strip(' ')]# # print(listt)        # 此种打印有点问题listt = [item.split(':') for item in listt]listt = [items for items in listt if len(items) == 2 and items[0].strip() and items[1].strip()]print(listt)dinfo = dict(listt)return dinfo

这是我们就可以把这部分的代码完整实现:

        def parse_minfo(self,url,mname):pinfo = self.req_page(url)if not pinfo:returnobj = BeautifulSoup(pinfo,'html5lib')minfo = obj.find('div',id='info')tinfo = minfo.get_text()dinfo = self.parse_text(tinfo)mscore = obj.find('div',class_="rating_self clearfix")score = mscore.find(property="v:average").get_text()votes = mscore.find(property="v:votes").get_text()dinfo['评分'] = scoredinfo['评论人数'] = votesdinfo['片名'] = mnameprint(dinfo.keys())for item in dinfo.items():print(item)

三、保存文本内容以及图片

如果完成上面的操作,这时候我们就需要对他们进行保存了。保存之前我们还要对这些进行一些规范与调试,这些暂时不做细讲,直接上代码:

 # 保存文本内容def load_page(self,url):pinfo = self.req_page(url)if not pinfo:returnobj = BeautifulSoup(pinfo,'html5lib')listdiv = obj.find_all('div',class_='hd')for div in listdiv:# print(div)murl = div.find('a').get('href')mname = div.find('span',class_='title').get_text()print(murl,mname)minfo = self.parse_minfo(murl,mname)if minfo:keys = [ '片名','导演','编剧', '主演', '类型', '制片国家/地区','语言', '上映日期', '片长', '又名','评分', '评论人数']self.infohd.write(keys,minfo)break# 保存图片def load_img(self,info):print("callhere load img:",info)req=urllib.request.Request(url=info[1],headers=headers)imgreq = urlopen(req)img_c = imgreq.read()path = r'D:\\test\\'+ info[0]+'.jpg'print('path:', path)imgf = open(path,'wb')imgf.write(img_c)imgf.close()

四、数据存储

数据存储一般情况下,单独写在一起比较好,这是我们创建一个minfo_save的文件,并定义一个 mysqlHandler的类型:

import pymysqlclass mysqlHandler(object):def __init__():passdef write():passdef close():pass

在这个函数中,我们我们指定编码类型,以及key和所爬取内容的对应关系。
代码如下:

    def __init__(self,host='localhost',user='root',passwd='',dbname='',tbname=''):self.dbcon = pymysql.connect(host,user,passwd,dbname,charset = 'utf8')self.cur = self.dbcon.cursor()self.tname = tbnameself.id = 1       # 默认值# 编写sql语句def write(self,keys,info):sql = 'insert into %s values'%self.tnamevalues = '(%s)'%(('%s,'*(len(keys)+1))[:-1])sql += valuesrowinfo = [info.get(key, ' ') for key in keys]rowinfo.insert(0,self.id)self.id += 1self.cur.execute(sql,rowinfo)self.dbcon.commit()  # 入库def close(self):self.dbcon.close()

五、在mysql中创建表格

1、建立连接

2、创建表格

六、完整代码

①minfo_spider

# =============================================
# --*-- coding: utf-8 --*--
# @Time    : 2020-03-16
# @Author  : 李华鑫
# @CSDN    : https://blog.csdn.net/qq_16146103
# @FileName: douban250.py
# @Software: PyCharm
# =============================================from urllib.request import urlopen
import urllib
from bs4 import BeautifulSoup
from urllib import error
from minfo_save import mysqlHandlerheaders = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36',
'Cookie':'bid=wjbgW95-3Po; douban-fav-remind=1; __gads=ID=f44317af32574b60:T=1563323120:S=ALNI_Mb4JL8QlSQPmt0MdlZqPmwzWxVvnw; __yadk_uid=hwbnNUvhSSk1g7uvfCrKmCPDbPTclx9b; ll="108288"; _vwo_uuid_v2=D5473510F988F78E248AD90E6B29E476A|f4279380144650467e3ec3c0f649921e; trc_cookie_storage=taboola%2520global%253Auser-id%3Dff1b4d9b-cc03-4cbd-bd8e-1f56bb076864-tuct427f071; viewed="26437066"; gr_user_id=7281cfee-c4d0-4c28-b233-5fc175fee92a; dbcl2="158217797:78albFFVRw4"; ck=4CNe; _pk_ref.100001.4cf6=%5B%22%22%2C%22%22%2C1583798461%2C%22https%3A%2F%2Faccounts.douban.com%2Fpassport%2Flogin%3Fredir%3Dhttps%253A%252F%252Fmovie.douban.com%252Ftop250%22%5D; _pk_ses.100001.4cf6=*; __utma=30149280.1583974348.1563323123.1572242065.1583798461.8; __utmb=30149280.0.10.1583798461; __utmc=30149280; __utmz=30149280.1583798461.8.7.utmcsr=accounts.douban.com|utmccn=(referral)|utmcmd=referral|utmcct=/passport/login; __utma=223695111.424744929.1563344208.1572242065.1583798461.4; __utmb=223695111.0.10.1583798461; __utmc=223695111; __utmz=223695111.1583798461.4.4.utmcsr=accounts.douban.com|utmccn=(referral)|utmcmd=referral|utmcct=/passport/login; push_noty_num=0; push_doumail_num=0; _pk_id.100001.4cf6=06303e97d36c6c15.1563344208.4.1583798687.1572242284.'}
url = 'https://movie.douban.com/top250?start=%d&filter='class spider_douban250(object):#  页面初始化def __init__(self,url = None, start = 0, step = 25 , total = 250,savehd=None):self.durl = urlself.dstart = startself.dstep =stepself.dtotal = totalself.infohd = savehd# 页面的跳转def start_download(self):while self.dstart < self.dtotal:durl = self.durl%self.dstart# print(durl)self.load_page(durl)self.dstart += self.dstepbreak    # 如果爬取全部可以直接放开def req_page(self,url):# 请求异常处理try:req=urllib.request.Request(url=url,headers=headers)req = urlopen(req)except error.HTTPError as e:print('catch e:',e)return Noneexcept:print('url request error:',url)return Noneif req.code!=200:returnpageinfo = req.read().decode('utf-8')return pageinfo# 把列表切割成字典def parse_text(self,minfo):# listt = minfo.split('\n')  # 切分listt = [item.strip()for item in  minfo.split('\n') if item.strip(' ')]# # print(listt)        # 此种打印有点问题listt = [item.split(':') for item in listt]listt = [items for items in listt if len(items) == 2 and items[0].strip() and items[1].strip()]print(listt)dinfo = dict(listt)return dinfo#  对返回值进行处理def parse_minfo(self,url,mname):pinfo = self.req_page(url)if not pinfo:returnobj = BeautifulSoup(pinfo,'html5lib')minfo = obj.find('div',id='info')tinfo = minfo.get_text()dinfo = self.parse_text(tinfo)mscore = obj.find('div',class_="rating_self clearfix")score = mscore.find(property="v:average").get_text()votes = mscore.find(property="v:votes").get_text()dinfo['评分'] = scoredinfo['评论人数'] = votesdinfo['片名'] = mnameprint(dinfo.keys())for item in dinfo.items():print(item)return dinfo# 保存文本内容def load_page(self,url):pinfo = self.req_page(url)if not pinfo:returnobj = BeautifulSoup(pinfo,'html5lib')listdiv = obj.find_all('div',class_='hd')for div in listdiv:# print(div)murl = div.find('a').get('href')mname = div.find('span',class_='title').get_text()print(murl,mname)minfo = self.parse_minfo(murl,mname)if minfo:keys = [ '片名','导演','编剧', '主演', '类型', '制片国家/地区','语言', '上映日期', '片长', '又名','评分', '评论人数']self.infohd.write(keys,minfo)break# 保存图片def load_img(self,info):print("callhere load img:",info)req=urllib.request.Request(url=info[1],headers=headers)imgreq = urlopen(req)img_c = imgreq.read()path = r'D:\\test\\'+ info[0]+'.jpg'print('path:', path)imgf = open(path,'wb')imgf.write(img_c)imgf.close()sql = mysqlHandler('localhost','root','199712','minfo1','mvinfo')    # 此处这些都要记住自己的,每个人都不一样的
spider = spider_douban250(url,start=0,step=25,total=10,savehd=sql)
spider.start_download()

②minfo_save

# =============================================
# --*-- coding: utf-8 --*--
# @Time    : 2020-03-16
# @Author  : 李华鑫
# @CSDN    : https://blog.csdn.net/qq_16146103
# @FileName: douban250.py
# @Software: PyCharm
# =============================================import pymysqlclass mysqlHandler(object):def __init__(self,host='localhost',user='root',passwd='',dbname='',tbname=''):self.dbcon = pymysql.connect(host,user,passwd,dbname,charset = 'utf8')self.cur = self.dbcon.cursor()self.tname = tbnameself.id = 1       # 默认值# 编写sql语句def write(self,keys,info):sql = 'insert into %s values'%self.tnamevalues = '(%s)'%(('%s,'*(len(keys)+1))[:-1])sql += valuesrowinfo = [info.get(key, ' ') for key in keys]rowinfo.insert(0,self.id)self.id += 1self.cur.execute(sql,rowinfo)self.dbcon.commit()  # 入库def close(self):self.dbcon.close()if __name__ == '__main__':sql = mysqlHandler('localhost','root','199712','minfo1','mvinfo')sql.write([],[])sql.close()

七、数据截图

八、程序的不足之处

程序不足的地方:豆瓣电影有反爬机制,由于没有添加时间间隔,以及IP代理池没有构建以及多线程的使用,在爬取一百多条数据的时候,IP会被封禁,第二天才会解封。如果有能力的可以添加多个User—Agent、添加时间间隔以及使用多个代理IP进行完善代码。
除此之外,由于此代码没有用较为常用的requests库,可以考虑使用此库。

采用sql存储的方法保存所爬取的豆瓣电影相关推荐

  1. java 爬取评论,Java基于WebMagic爬取某豆瓣电影评论的实现

    目的 搭建爬虫平台,爬取某豆瓣电影的评论信息. 准备 webmagic是一个开源的Java垂直爬虫框架,目标是简化爬虫的开发流程,让开发者专注于逻辑功能的开发.webmagic的核心非常简单,但是覆盖 ...

  2. 剧荒不慌 | 手把手教你爬取+DIY豆瓣电影新榜单

    作者 | 吹牛Z 来源 | 数据不吹牛(ID:shujubuchuiniu) 本文以豆瓣电影(非TOP250)为例,从数据爬取.清洗与分析三个维度入手,详解和还原数据爬取到分析的全链路.阅读全文大概需 ...

  3. python项目实战分析:爬取时光网电影TOP100

    前言 相信大家在各种看到的都是爬取猫眼,豆瓣电影排行榜TOP100的案例,下面为大家介绍爬取时光网的案例分析,用另一个方式来获取电影TOP100,下面就开始看看实现的过程吧 导入第三方库 用来显示信息 ...

  4. python爬虫excel数据_最简单的爬数据方法:Excel爬取数据,仅需6步

    原标题:最简单的爬数据方法:Excel爬取数据,仅需6步 在看到这篇文章的时候,大家是不是都还停留在对python爬虫的迷恋中,今天就来教大家怎样使用微软的Excel爬取一个网页的后台数据,注:此方法 ...

  5. 大数据Python爬取B站电影排行榜——爬取信息

    大数据Python爬取B站电影排行榜-信息爬取 前言 一.配置环境 二.爬取B站电影排行榜top100 1.找到B站电影排行榜top100网页 2.用URL进行爬取信息 三.建立Excel表并导出 总 ...

  6. 如何利用 C# 爬取「猫眼电影专业版:票房」数据!

    在现代生活中,看电影已经成为大家的一种休闲方式. 前几天,我们介绍了 如何利用 C# 爬取「猫眼电影:热映口碑榜」及对应影片信息!,通过这份"热映口碑"榜单,我们可以看到大家对当前 ...

  7. python学习之爬取ts流电影

    爬取ts流电影文件记录 需求 程序结构目录 编写代码 基本思路 代码编写 优化 需求 **前言**最近学习Python,语法规则.变量等也看完了,但是觉得啥也没记住,打开py不知道写啥,只能print ...

  8. Crawler:基于BeautifulSoup库+requests库实现爬取2018最新电影《后来的我们》热门短评

    Crawler:基于BeautifulSoup库+requests库实现爬取2018最新电影<后来的我们>热门短评 目录 输出结果 实现代码 输出结果 实现代码 # -*- coding: ...

  9. 从imdb爬取ml-100k的电影封面

    从imdb爬取ml-100k的电影封面 ml-100k:数据集,只用到了./ml-100k/u.item result: 电影封面 电影id.jpg,可以用u.item找到id->电影名称对应关 ...

最新文章

  1. python函数模块概念_python中模块和包的概念
  2. Python流程控制语句
  3. linux沙箱隔离_Linux沙箱技术介绍
  4. 计算机组装与维修预习,《计算机组装与维修》预习报告、实习报告撰写要求.docx...
  5. json 来实现 php 与 javascript,用 Json 来实现 PHP 与 JavaScript 间数据交换
  6. LaTeX tikz初探——利用emoji画GPS卫星2D分布图(2)
  7. windows笔记-【内核对象线程同步】概述
  8. vs2010启动越来越慢解决方法
  9. linux 中文字体 推荐,Linux 下何种字体最好看
  10. 图灵工业机器人说明书_图说人工智能:机器人极简史
  11. windows文件夹正在使用
  12. 台式机单硬盘安装黑苹果体验
  13. 违章查询免费api接口代码
  14. 使用python及相关库实现AQI分析与预测
  15. python 编写获取阿里巴巴行业分类数据代码
  16. 刘盈盈计算机科学与技术,四川省2013年度中等职业学校省级优秀毕业生名单_29131...
  17. 吹爆苹果新款 M1 电脑!
  18. HackTheBox-Beatles
  19. 计算机高中教育日志,高中日记范文
  20. 自己做量化交易软件(4)通通量化分析框架构成2

热门文章

  1. vue项目中 img标签加载失败(404)方法,@error事件
  2. Win8Metro(C#)数字图像处理--2.17图像木刻效果
  3. Chkconfig 作用与原理小结
  4. 蓝桥杯算法训练ALGO-1003——礼物
  5. 我国首办素质体育机器人比赛 让机器人变运动员
  6. 解决[<Element i at 0x18a666abf08>]问题
  7. 宝塔服务器重启后redis启动报错pid file is exits
  8. 查询各门课程的最高分、最低分、平均成绩
  9. 卡米洛特程 全景图:一种假说
  10. scrollTop()方法