用Python爬取了上万部电影的排名,周末周末好带女神一起去

x33g5p2x  于2021-12-07 转载在 Python  
字(4.7k)|赞(0)|评价(0)|浏览(383)

一、写在前面

好不容易女神喊我去看电影,但是她问我准备看什么,那我不得好好准备准备~

二、准备工作

1、使用的软件

  • python 3.8 (开源 免费的)
  • Pycharm (YYDS python最好用的编辑器 不接受反驳…)

软件及安装讲解:软件安装包/安装视频讲解

2、使用的模块

3、爬虫思路

无论你爬取任何网站数据,都是可以按照这个几步骤来。

1. 明确需求

我们要爬取的内容是什么 https://movie.douban.com/top250
要分析我们的想要数据,可以从哪里获取,哪里来的… (数据来源分析)
用这个开发者工具进行抓包(数据包)分析

  • 静态网页:网页上面看到的数据内容,在网页源代码里面都有
  • 动态网站:抓包分析

2. 发送请求 (开发者工具里面headers)

对于那个网址发送请求,发送什么样的请求,携带那些请求头参数。

3. 获取数据

获取服务器返回的数据内容,看服务器数据格式是什么样的,或者说我们想要的数据是什么样的;
获取文本数据 response.text ;
获取服务器json字典数据 response.json() ;
获取二进制数据 response.content 保存视频/音频/图片/特定格式的文件内容,都是获取二进制数据;

4. 解析数据

提供我们想要的数据内容

5. 保存数据

保存本地

三、代码解析

1、导入模块

导入一下我们需要用到的模块

  1. import requests # 数据请求模块 pip install requests
  2. import parsel # 数据解析模块 pip install parsel
  3. import csv # 保存表格数据

2、创建文件

快速批量替换 全选内容 使用正则表达式 替换内容

  1. f = open('豆瓣数据.csv', mode='a', encoding='utf-8', newline='')
  2. csv_writer = csv.DictWriter(f, fieldnames=[
  3. '电影名字',
  4. '导演',
  5. '主演',
  6. '年份',
  7. '国家',
  8. '电影类型',
  9. '评论人数',
  10. '评分',
  11. '概述',
  12. '详情页',
  13. ])
  14. csv_writer.writeheader()

3、获取数据

  1. for page in range(0, 250, 25):
  2. url = f'https://movie.douban.com/top250?start={page}&filter='
  3. # headers 请求头 用来伪装python代码 为了防止爬虫程序被服务器识别出来,
  4. # User-Agent 浏览器的基本标识 用户代理 直接复制粘贴的
  5. # 披着羊皮的狼 爬虫程序 >>> 狼 headers >>> 羊皮 服务器数据 >>> 羊圈
  6. headers = {
  7. 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.45 Safari/537.36'
  8. }
  9. # 发送请求 get
  10. # 通过requests数据请求模块里面get请求方法 对于 url以及发送请求并且携带header请求头, 最后用response变量接收返回数据
  11. response = requests.get(url=url, headers=headers)
  12. # 获取数据
  13. # print(response.text)
  14. # 解析数据 re正则表达式 css选择器 xpath 那一种更方便 更加舒服 就用哪一个
  15. # json 键值对取值
  16. # 提取我们想要的数据内容
  17. # 把获取下来的 response.text 网页字符串数据 转成selector 对象
  18. selector = parsel.Selector(response.text)
  19. # <Selector xpath=None data='<html lang="zh-CN" class="ua-windows ...'> 对象
  20. # css选择器 根据标签属性提取数据
  21. # 第一次解析数据, 获取所有li标签
  22. lis = selector.css('.grid_view li') # css选择器语法
  23. # selector.xpath('//*[@class="grid_view"]/li') # xpath写法
  24. # [] 列表, 如果说我想要一一提取列表里面的元素 怎么做?

4、解析数据

  1. for li in lis:
  2. try:
  3. # span:nth-child(1) 组合选择器 表示的选择第几个span标签
  4. # 1 选择第一个span标签 text 获取标签文本数据
  5. title = li.css('.hd a span:nth-child(1)::text').get()
  6. href = li.css('.hd a::attr(href)').get() # 详情页
  7. # li.xpath('//*[@class="hd"]/a/span(1)/text()').get()
  8. # get返回字符串数据 getall 是返回列表数据
  9. # get获取第一个标签数据 getall 获取所有的
  10. move_info = li.css('.bd p::text').getall()
  11. actor_list = move_info[0].strip().split(' ') # 列表索引位置取值
  12. # print(actor_list)
  13. date_list = move_info[1].strip().split('/') # 列表索引位置取值
  14. director = actor_list[0].replace('导演: ', '').strip() # 导演
  15. actor = actor_list[1].replace('主演: ', '').replace('/', '').replace('...', '') # 演员
  16. date = date_list[0].strip() # 年份
  17. country = date_list[1].strip() # 国家
  18. move_type = date_list[2].strip() # 电影类型
  19. comment = li.css('.star span:nth-child(4)::text').get().replace('人评价', '') # 评论人数
  20. star = li.css('.star span:nth-child(2)::text').get() # 星级
  21. world = li.css('.inq::text').get() # 概述
  22. # 字符串的高级方法
  23. # replace() 字符串替换的方法 strip() 去除字符串左右两端的空格 split() 分割 之后返回的列表
  24. # 字符串如何去除空格呢?
  25. # print(title, actor_list, date_list)
  26. dit = {
  27. '电影名字': title,
  28. '导演': director,
  29. '主演': actor,
  30. '年份': date,
  31. '国家': country,
  32. '电影类型': move_type,
  33. '评论人数': comment,
  34. '评分': star,
  35. '概述': world,
  36. '详情页': href,
  37. }

5、写入数据

  1. csv_writer.writerow(dit)

6、输出数据

  1. print(title, director, actor, date, country, move_type, comment, star, world, href, sep=' | ')
  2. except:
  3. pass

所有代码

所有代码我就没写到目录里面,奖励给全部看完的你,不然有些人看到目录就直接点过来看全部代码了,哈哈~

  1. import requests
  2. import parsel
  3. import csv
  4. f = open('豆瓣数据.csv', mode='a', encoding='utf-8', newline='')
  5. csv_writer = csv.DictWriter(f, fieldnames=[
  6. '电影名字',
  7. '导演',
  8. '主演',
  9. '年份',
  10. '国家',
  11. '电影类型',
  12. '评论人数',
  13. '评分',
  14. '概述',
  15. '详情页',
  16. ])
  17. csv_writer.writeheader()
  18. for page in range(0, 250, 25):
  19. url = f'https://movie.douban.com/top250?start={page}&filter='
  20. headers = {
  21. 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.45 Safari/537.36'
  22. }
  23. response = requests.get(url=url, headers=headers)
  24. selector = parsel.Selector(response.text)
  25. lis = selector.css('.grid_view li') # css选择器语法
  26. for li in lis:
  27. try:
  28. title = li.css('.hd a span:nth-child(1)::text').get()
  29. href = li.css('.hd a::attr(href)').get() # 详情页
  30. move_info = li.css('.bd p::text').getall()
  31. actor_list = move_info[0].strip().split(' ') # 列表索引位置取值
  32. date_list = move_info[1].strip().split('/') # 列表索引位置取值
  33. director = actor_list[0].replace('导演: ', '').strip() # 导演
  34. actor = actor_list[1].replace('主演: ', '').replace('/', '').replace('...', '') # 演员
  35. date = date_list[0].strip() # 年份
  36. country = date_list[1].strip() # 国家
  37. move_type = date_list[2].strip() # 电影类型
  38. comment = li.css('.star span:nth-child(4)::text').get().replace('人评价', '')
  39. star = li.css('.star span:nth-child(2)::text').get() # 星级
  40. world = li.css('.inq::text').get() # 概述
  41. dit = {
  42. '电影名字': title,
  43. '导演': director,
  44. '主演': actor,
  45. '年份': date,
  46. '国家': country,
  47. '电影类型': move_type,
  48. '评论人数': comment,
  49. '评分': star,
  50. '概述': world,
  51. '详情页': href,
  52. }
  53. csv_writer.writerow(dit)
  54. print(title, director, actor, date, country, move_type, comment, star, world, href, sep=' | ')
  55. except:
  56. pass

注释对照前面,完整代码不给注释,为了你们认真学习我真的是挠破脑袋了。

四、写在最后

最后当然是老规矩,视频教程安排上。

【Python爬虫】女神问我周末去看什么电影,当时我就把热门电影排行爬了一遍,冲冲冲!

大家看完记得来个三连,你的给力就是我的动力~

相关文章