豆瓣电影 Top 250 (douban.com)

#导包
import requests
from bs4 import BeautifulSoup
import pandas as pd

第一步:下载所有页面(共10个)的HTML

【1】构造分页数字列表page_indexs

【2】构造函数download_all_htmls,下载列表所有页面的HTML

1、先添加请求头headers(爬取的网站有反爬虫机制,要向服务器发出爬虫请求,需要添加请求头headers。不然响应状态是418,正常情况应该是200。)

2、利用for循环取到页面列表中的每一个页面的网址url

3、用requests.get函数获取html网页(构造一个向服务器请求资源的url对象,并添加headers参数。返回的是一个包含服务器资源的Response对象。)

4、r.status_code返回http请求的返回状态:200表示连接成功,返回418表示爬取的网站有反爬虫机制,要向服务器发出爬虫请求,需要添加请求头headers

5、htmls.append(r.text)添加每个url对应的页面内容列表htmls

text()方法:返回文本内容

第二步:解析HTML得到数据

【1】构造函数parse_single_html,用于解析单个html得到数据

1、找到每部电影

find()方法:只返回第一个匹配到的对象

find(name, attrs, recursive, text, **wargs) # recursive 递归的,循环的

find_all()方法:返回所有匹配到的结果

find_all(name, attrs, recursive, text, limit, **kwargs)

此处形参用class_的原因:

参考:(13条消息) BeautifulSoup中find和find_all的使用_OCISLU的博客-CSDN博客

soup.find("div",class_="article").find("ol",class_="grid_view").find_all("div",class_="item")

2、用for循环对每部电影取相应类型的数据

get_text()方法:获取文本内容

#排名
rank=article_item.find("div",class_="pic").find("em").get_text()
#电影名称
title=info.find("div",class_="hd").find("span",class_="title").get_text() 
stars=(info.find("div",class_="bd").find("div",class_="star").find_all("span")            #stars里含有4个span,返回一个列表)#5星评分
rating_star=stars[0]["class"][0]  #第一个span中的class属性的第一个值#10分评分
rating_num=stars[1].get_text()   #评论人数
comments=stars[3].get_text()    

3、将每部电影的信息存到字典中,并作为列表的一个元素添加到datas列表中去

字符串替换replace()方法:

datas.append({"排名":rank,"电影名":title,"5星评价":rating_star.replace("rating","").replace("-t",""),"10分评分":rating_num,"评价人数":comments.replace("人评价","")})

【2】执行所有HTML页面的解析

#对每一个HTML页面进行解析,并将结果添加到列表all_datas
all_datas=[]
for html in htmls:all_datas.extend(parse_single_html(html))

第三步:将结果存入Excel

df=pd.DataFrame(all_datas)
df.to_excel("豆瓣top250电影榜单.xlsx")

第四步:DataFrame数据导入MySQL

import sqlalchemy
from sqlalchemy import create_engine#建立连接
conn = create_engine('mysql+pymysql://root:123@localhost:3306/crawl?charset=utf8')
#写入数据,‘replace’表示如果同名表存在就替换掉
df.to_sql(name='douban', con=conn,if_exists='replace',index=False,index_label='排名',dtype={'排名': sqlalchemy.types.BigInteger(),'电影名': sqlalchemy.types.String(length=20),'5星评价': sqlalchemy.types.BigInteger(),'10分评分':  sqlalchemy.types.BigInteger(),'评价人数':  sqlalchemy.types.BigInteger(),})

【完整代码】

import requests
from bs4 import BeautifulSoup
import pandas as pdpage_indexs=range(0,250,25)def download_all_htmls():#先添加请求头headersheaders={'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.71 Safari/537.36 Edg/94.0.992.38'}htmls=[]    #存放各个url对应的页面内容for idx in page_indexs:url=f"https://movie.douban.com/top250?start={idx}&filter="print("crawl html:",url)   #url是通过http协议存取资源的一个路径,它就像我们电脑里面的一个文件的路径一样r=requests.get(url,headers = headers)   #获取html网页(构造一个向服务器请求资源的url对象),并添加headers参数。r返回的是一个包含服务器资源的Response对象,包含从服务器返回的所有相关资源。if r.status_code!=200:         # r.status_code 返回http请求的返回状态(200表示连接成功)raise Exception("error")   # 返回418表示:爬取的网站有反爬虫机制,要向服务器发出爬虫请求,需要添加请求头headers#print(r.status_code)htmls.append(r.text)   # r.text 获取url对应的页面内容return htmlshtmls=download_all_htmls()def parse_single_html(html):soup=BeautifulSoup(html,'html.parser')    #构建BeautifulSoup实例(第一个参数是要匹配的内容;第二个参数是要采用的模块,即规则)article_items=(                         #返回一个列表,代表每个article的信息soup.find("div",class_="article")    # find() 只返回第一个匹配到的对象.find("ol",class_="grid_view").find_all("div",class_="item")   # find_all() 返回所有匹配到的结果(此处返回所有电影))datas=[]   #将数据存到列表里面for article_item in article_items:rank=article_item.find("div",class_="pic").find("em").get_text()  #获取排名info=article_item.find("div",class_="info")title=info.find("div",class_="hd").find("span",class_="title").get_text()   #获取电影名称stars=(info.find("div",class_="bd").find("div",class_="star").find_all("span")            #stars里含有4个span)#print(stars)rating_star=stars[0]["class"][0]    #获取5星评分rating_num=stars[1].get_text()     #获取10分评分comments=stars[3].get_text()    #获取评论人数datas.append({"排名":rank,"电影名":title,"5星评价":rating_star.replace("rating","").replace("-t",""),"10分评分":rating_num,"评价人数":comments.replace("人评价","")})return datasall_datas=[]
for html in htmls:all_datas.extend(parse_single_html(html))df=pd.DataFrame(all_datas)import sqlalchemy
from sqlalchemy import create_engine
#建立连接
conn = create_engine('mysql+pymysql://root:123@localhost:3306/crawl?charset=utf8')
#写入数据,t_stock_trade_date为数据库表名,‘replace’表示如果同名表存在就替换掉
df.to_sql(name='douban', con=conn,if_exists='replace',index=False,index_label='排名',dtype={'排名': sqlalchemy.types.BigInteger(),'电影名': sqlalchemy.types.String(length=20),'5星评价': sqlalchemy.types.BigInteger(),'10分评分':  sqlalchemy.types.BigInteger(),'评价人数':  sqlalchemy.types.BigInteger(),})
print('ok')

豆瓣电影:TOP250榜单爬虫相关推荐

  1. No.1 豆瓣电影Top250榜单

    豆瓣电影Top250榜单 一.简介 网址:https://movie.douban.com/top250 效果:下载Top250的电影封面 使用框架:requests.re 难度系数:✩ 二.教程 1 ...

  2. 对豆瓣电影Top250榜单的一些探索性分析

    业余打发时间看电影是个不错的选择,但是如果看了一部无聊糟心的电影就得不偿失了,所以一些电影方面的榜单就出现了,可以为这些选择困难患者提供一个不错的指南,那些是经典是值得看的,而那些电影不值得你浪费一两 ...

  3. 摆脱剧荒!教你用 Python 一步步爬取豆瓣电影新榜单

    本文以豆瓣电影(非TOP250)为例,从数据爬取.清洗与分析三个维度入手,详解和还原数据爬取到分析的全链路. 作者 | 周志鹏 责编 | 郭   芮 旁友,暑假,已经过了一大半了. 这个遥远而炙热的名 ...

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

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

  5. python爬取豆瓣电影top250_Python 爬取豆瓣电影Top250排行榜,爬虫初试

    from bs4 import BeautifulSoup import openpyxl import re import urllib.request import urllib.error # ...

  6. python爬取豆瓣电影top250_【Python3爬虫教程】Scrapy爬取豆瓣电影TOP250

    今天要实现的就是使用是scrapy爬取豆瓣电影TOP250榜单上的电影信息. 步骤如下: 一.爬取单页信息 首先是建立一个scrapy项目,在文件夹中按住shift然后点击鼠标右键,选择在此处打开命令 ...

  7. 第一期:【python爬虫】豆瓣电影top250

    1.首先看最后的爬取结果 还有电影的信息,我保存的是csv文件.可以学到爬虫的相关知识和数据保存的信息. 删除信息,直接上代码. 红色圆点旁边的是清空.(如上图所示) 下面请求中的第一个或者前几个(如 ...

  8. 豆瓣电影TOP250爬虫及可视化分析笔记

      人类社会已经进入大数据时代,大数据深刻改变着我们的工作和生活.随着互联网.移动互联网.社交网络等的迅猛发展,各种数量庞大.种类繁多.随时随地产生和更新的大数据,蕴含着前所未有的社会价值和商业价值! ...

  9. Python爬虫豆瓣电影top250

      我的另一篇博客,Python爬虫豆瓣读书评分9分以上榜单   有了上次的基础,这次简单爬了下豆瓣上电影TOP250,链接豆瓣电影TOP250.   打开链接,查看网页源代码,查找我们需要的信息的字 ...

最新文章

  1. springmvc java中转发_Springmvc中的转发重定向和拦截器的示例
  2. 【tf.keras】TensorFlow 1.x 到 2.0 的 API 变化
  3. linux 擦脚印工具,linux一步一脚印---rm命令
  4. mysql 值到99999后不增值了_MySQL数据库之更新语句精解(一)
  5. java handler的用法_Handler和内部类的正确用法
  6. mmap mprotect详解
  7. Python_文件_日记管理系统
  8. Spring boot 上传文件大小限制
  9. 建模步骤_古建设计 | sketchup建模步骤教程(简易入门版)
  10. python列表用来有序存放一组_Python期末习题练习
  11. 关于Win10系统下VIA HD AUDIO威盛声卡没声音问题 - 有效解决办法
  12. RJ45和RJ11的线序以及用途
  13. 替换和修复系统User32.dll文件
  14. 外贸出口流程全图(转)
  15. 多功能扫描仪设备 可识别护照
  16. 统信UOS应用商店十月活动
  17. 【HR面试100问】一篇文章根治各种HR面的套路问题,文章给出参考答案~持续更新
  18. 鸿蒙系统1004无标题,华为P50 Pro外观基本确认:居中开孔全面屏首发鸿蒙操作系统...
  19. 常见计算机主机内部硬件设备,计算机的硬件主要包括中央处理器、储存器、输出设备和...
  20. 看,那人好像一个产品狗,对,这就是产品狗

热门文章

  1. 乐鑫(ESPRESSIF) ESP32 ESP-IDF设置环境变量出现“安全频道支持出错”问题的解决办法
  2. 生成数据库设计文档小技巧
  3. Echarts异步加载后端接口返回的Json数据生成图表
  4. Hurst Exponent金融时间序列分析以及在股票上的运用
  5. Python 实现 PTA 平台 基础编程题目集
  6. 情感类短视频如何定位?五种情感短视频类型分享,总有一种适合你
  7. HCIE 华为虚拟化解决方案2
  8. 基于CTP的程序化交易系统开发(一)
  9. Spectator view——Hololens第三人称视角技术的详细实现过程
  10. ipv4中的子网掩码