Python爬虫

内地电影票房总排行榜

2017年内地电影票房总排行榜


这个网站对爬虫设置了重重阻碍

1、查看多页数据需要用户登录

2、奇怪的登录验证码


3、电影票房是一张图片

步骤

在开始爬虫前我们一步一步的解决阻碍

1、权限问题

在未登录时获取多页数据会让我们先登录,当我们在浏览器登录过后,使用python读取到的网页数据还是登录页的代码


我们都知道浏览器向服务器发送请求时都会带上请求头,我们用python直接爬取网页源码时并没有设置请求头,所以服务器并不认识我们,认为我们没有登录。所以只要我们正确的设置了请求头就能正常获取数据了

获取请求头中的cookie(需要先登录)


设置cookie后便能正确的获取网页数据

spider.py

# -*- coding: utf-8 -*-
# @File : spider.py
import requests
from bs4 import BeautifulSoup
import xlwt'''
http://58921.com/alltime/2018
年份票房排行榜
1995 - 2021
'''
base_url = "http://58921.com"
year_url = "http://58921.com/alltime/"
all_url = "http://58921.com/alltime?page="headers = {# Cookie 登录验证"Cookie":"这里是登录后获取到的cookie","User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3947.100 Safari/537.36","Upgrade-Insecure-Requests":"1",
}def get_html(url,encoding):response = requests.get(url,headers=headers)if response.status_code == 200:# 判断请求是否成功response.encoding = encodingreturn response.textelse:return Nonedef spider_year_list(url):'''根据url爬取排行榜 'http://58921.com/alltime/2019?page=1' 第二页每一个年份的数据:return:'''year = url.split("/alltime/")[1]year_list = []# 获取页数html = get_html(url,encoding="utf-8")soup = BeautifulSoup(html, "html.parser")item_list = soup.find("div",class_="item-list")if item_list is not None:pager_number = item_list.find("li", class_="pager_count").find("span",class_="pager_number").get_text()page = int(pager_number.split("/")[1])else:page = 1for i in range(0,page):page_url = '{}?page={}'.format(url,i)print(page_url)html = get_html(page_url,encoding="utf-8")soup = BeautifulSoup(html, "html.parser")center_table = soup.find("div",class_="table-responsive")if center_table is not None:trs = center_table.table.tbody.find_all("tr")for tr in trs:mv_info = []tds = tr.find_all("td")for index,td in enumerate(tds):# print(td)if index == 3: # 票房的图片链接mv_info.append(td.img['src'])else:mv_info.append(td.get_text())year_list.append(mv_info)else:print("无该页数据")print(year_list)save_to_excel("./{}年票房排行榜.xls".format(year),year_list)def spider_all_list(url):'''根据url爬取总票房排行榜 'http://58921.com/alltime?page=1' 第二页:return:'''datalist = []for i in range(0,206):page_url = url+str(i)print(page_url)html = get_html(page_url,encoding="utf-8")soup = BeautifulSoup(html, "html.parser")center_table = soup.find("div",class_="table-responsive")if center_table is not None:trs = center_table.table.tbody.find_all("tr")for tr in trs:mv_info = []tds = tr.find_all("td")for index,td in enumerate(tds):# print(td)if index == 3: # 票房的图片链接mv_info.append(td.img['src'])else:mv_info.append(td.get_text())datalist.append(mv_info)else:print("无该页数据")print(datalist)save_to_excel("./中国电影票房排行榜.xls",datalist)def save_to_excel(savepath,datalist):book = xlwt.Workbook(encoding="utf-8", style_compression=0)  # 创建workbook对象sheet = book.add_sheet('票房排行榜', cell_overwrite_ok=True)  # 创建工作表col = ("年度排名", "历史排名", "电影名称", "总票房", "总人次", "总场次","上映年份","操作")for i in range(0,8):sheet.write(0, i, col[i])  # 列名for i in range(0, len(datalist)):print("第{}条".format(i + 1))data = datalist[i]if len(data) >= 8:# 数据完整才保存for j in range(0, 8):sheet.write(i + 1, j, data[j])book.save(savepath)  # 保存def url_list():'''拼接url:return:'''return [year_url+str(i) for i in range(1995,2021)]def main():for url in url_list():spider_year_list(url)spider_all_list(all_url)if __name__ == '__main__':main()

爬取到的数据

票房是一张图片链接

2、处理票房图片

使用百度图像识别api来读取图片数据

参考链接:https://blog.csdn.net/cool_bot/article/details/90150512

代码

img2num.py
调用百度api识别图片数据

# -*- coding: utf-8 -*-
# @File : img2num.pyfrom aip import AipOcr
import urllib.request
'''
使用百度api读取图片中的文字
'''""" 你的 APPID AK SK """
APP_ID = 'APPID '
API_KEY = 'AK'
SECRET_KEY = 'SK'client = AipOcr(APP_ID, API_KEY, SECRET_KEY)options = {}  # 配置字典
options["language_type"] = "CHN_ENG"  # 识别文字类型
options["detect_direction"] = "true"  # 是否检测图片的朝向
options["detect_language"] = "true"  # 是否检测语言
options["probability"] = "true"  # 是否返回置信度def get_file_content(filePath): # 本地图片with open(filePath, 'rb') as fp:return fp.read()  # 获取图片信息def get_img_word(url):res = urllib.request.urlopen(url)result = client.basicGeneral(res.read(), options)if "words_result" not in result.keys(): # 当识别失败时返回图片地址print(result)print("无结果")return urlword = ""for i in result["words_result"]:word = i['words']print(word)return worddef main():# 测试get_img_word("http://img.58921.com/sites/all/movie/files/protec/b7240de0f1ff2d748abe47d2621e4516.png")if __name__ == '__main__':main()

处理票房图片.py
通过pandas读取上面爬取到的excel文件,然后调用img2num.py文件里 的get_img_word方法转换图片

# -*- coding: utf-8 -*-
# @File : 处理票房图片.py
import img2num
import pandas as pd
import xlwt'''
处理图片
'''data_df = pd.read_excel("./中国电影票房排行榜.xls").head(100)
data_df['总票房'] = data_df['总票房'].apply(lambda x: img2num.get_img_word(x))def save_data():'''将处理后的数据保存到Excel:return:'''datalist = []for row in data_df.iterrows():series = list(row)[1]  # Seriesdatalist.append(list(series))save_to_excel("./转换后的票房数据.xls", datalist)def save_to_excel(savepath,datalist):book = xlwt.Workbook(encoding="utf-8", style_compression=0)  # 创建workbook对象sheet = book.add_sheet('票房排行榜', cell_overwrite_ok=True)  # 创建工作表col = ("年度排名", "历史排名", "电影名称", "总票房", "总人次", "总场次","上映年份","操作")for i in range(0,8):sheet.write(0, i, col[i])  # 列名for i in range(0, len(datalist)):print("第{}条".format(i + 1))data = datalist[i]if len(data) >= 8:# 数据完整才保存for j in range(0, 8):sheet.write(i + 1, j, data[j])book.save(savepath)  # 保存def main():save_data()# print(data_df['总票房'])if __name__ == '__main__':main()

转换过程


转换过程中有一些错误
{‘error_code’: 18, ‘error_msg’: ‘Open api qps request limit reached’}
查看官方文档错误码

如果想要批量转换的话看来要收费
这里只作一点教程,具体需要批量转换的话可以去开通计费

转换后的数据

有的数据还是没有识别出来,如果想全部识别出来的话可以调整为高精度识别

Python爬虫爬取中国电影票房排行榜相关推荐

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

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

  2. 【Python】爬取中国历史票房榜,可视化分析

    [Python]爬取中国历史票房榜,可视化分析 最近电影<哪吒之魔童转世>票房已经超过<流浪地球>,<复联4>.升到中国内地票房第二位.就好有哪些电影排进了历史票房 ...

  3. Python爬虫 爬取豆瓣电影TOP250

    Python爬虫 爬取豆瓣电影TOP250 最近在b站上学习了一下python的爬虫,实践爬取豆瓣的电影top250,现在对这两天的学习进行一下总结 主要分为三步: 爬取豆瓣top250的网页,并通过 ...

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

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

  5. 记第一天使用node做爬虫——爬取猫眼电影票房总榜以及指定电影的豆瓣评论前200条

    首先,我是一个做前端的应届生,今天朋友想让我帮忙爬取猫眼电影票房总榜的数据,但是我之前一点都没接触过爬虫,但我还是说:okk,我试试: 然后试试就逝世,各种坑接踵而来: 提前声明:这篇文章暂时只是获取 ...

  6. 使用python爬取中国电影票房数据并写入csv文件

    环境 PyCharm 2021.1.2 x64 爬取的目标网页 一.代码 import requests from bs4 import BeautifulSoup url = "http: ...

  7. 用Python爬虫爬取豆瓣电影、读书Top250并排序

    更新:已更新豆瓣电影Top250的脚本及网站 概述 经常用豆瓣读书的童鞋应该知道,豆瓣Top250用的是综合排序,除用户评分之外还考虑了很多比如是否畅销.点击量等等,这也就导致了一些近年来评分不高的畅 ...

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

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

  9. python爬虫爬取豆瓣电影信息城市_python爬虫,爬取豆瓣电影信息

    hhhhh开心,搞了一整天,查了不少python基础资料,终于完成了第一个最简单的爬虫:爬取了豆瓣top250电影的名字.评分.评分人数以及短评. 代码实现如下:#第一个最简单的爬虫 #爬取了豆瓣to ...

  10. python爬虫下载电影百度文档_写一个python 爬虫爬取百度电影并存入mysql中

    目标是利用python爬取百度搜索的电影 在类型 地区 年代各个标签下 电影的名字 评分 和图片连接 以及 电影连接 首先我们先在mysql中建表 create table liubo4( id in ...

最新文章

  1. python中的连续比较是什么_在python中提取连续行之间的差异
  2. Python元组常用的操作
  3. jsonp解析 html
  4. node.js的下载,安装以及卸载
  5. Unity 中渲染顺序的理解以及一些坑点 以及2.5D游戏中的渲染排序解决方案
  6. java基础教程知识点,[Java教程]js基础知识点总结
  7. 关于理财险的知识你知道哪些?
  8. PHP textarea防止拖动,textarea dom元素 防止滚动冒泡
  9. java基础中多线程个线程add同一变量时的非原子性问题
  10. igbt原理动画演示视频_简单易懂的IGBT工作原理分析
  11. SIP信令中的PRACK的含义和使用
  12. 机器学习 - 训练集、验证集、测试集
  13. android 隐藏电池,Android8.1隐藏状态栏电池图标
  14. 使用蓝湖UI效果图网站工具下载图标进行压缩
  15. 华硕笔记本快捷键失效(例如fn+f5失效)
  16. openGL增强表面细节----高度贴图
  17. error LNK1120: 2个无法解析的外部命令:vtkRenderingOpenGL_AutoInit(Construct、Destruct),该函数在......中被引用
  18. Docker基础第一步、什么是Docker
  19. 数控g71编程实例带图_数控车G71有凹槽复合循环编程实例
  20. java 双屏_Android实现双屏异显

热门文章

  1. 共享打印机提示服务器没有运行,提示无法共享打印机: “无法显示该属性,后台打印程序服务未运行”...
  2. 02 | 从神经元说起:结构篇
  3. 无油螺杆鼓风机-市场现状及未来发展趋势
  4. python使用UDP协议进行远程桌面共享
  5. 如何才能高效学习,99%的人不知道的高效学习法
  6. 新华社和中移动联手打造的搜索引擎盘古搜索开通
  7. oracle 根据出生日期计算年龄
  8. pdf 旋转视图,为啥不能保存?
  9. 我学了这套性能优化方法论,领导年终奖给我发了6个月
  10. 图形工作站/服务器硬件如何配置?这里有最新最全的硬件配置方案