利用python爬取豆瓣电影top250
利用python爬取豆瓣电影top250:
注:本内容只是作为个人学习记录
1、业务分析
进入网页https://movie.douban.com/top250
可以看见每部电影都呈现在眼前,点击电影进去可以看见更详细的信息:以下就是这次准备提取的数据
返回top250页面,还需要查看一下如何提取每个电影的url,显然一个页面只能有25个电影入口,需要进行翻页再到下一页收集每部电影的url。所以翻页也要看以下如何操作。
这里使用开发者工具(点击F12查看源代码)点击左上角按键直接看指针点击的位置信息
*大体方法都是如此,利用开发者工具查看想要的内容,然后根据内容使用etree中的xpath语法去提取,该内容可以去csdn其他博主上找,简书,菜鸟教程也都有。这里附上W3school的xpath学习网址
2、代码实现
下面是寻找标签及内容的xpath
0 电影排名 //div[@class="top250"]/span[@class="top250-no"]/text()1 电影标题 //span[@property="v:itemreviewed"]/text()2 导演 //span[@class='attrs']/a[@rel='v:directedBy']/text()3 上映年份 //span[@class="year"]/text()4 豆瓣评星 //div[@class="item"]/span[@class]/text()5 评价人数 //span[@property="v:votes"]/text()6 剧情介绍 //span[@property="v:summary"][position()<=1]/text()7 每个电影的url //div[@id="content"]//div[@class="hd"]/a/@href8 下一页 //link[@rel="next"]/@href
接下来时看代码了
import os # 这里用于打开写入的文件
import csv # csv读取
import pymysql # 链接数据库
import pandas as pd # 用于写入csv
import numpy as np # 设定随机时间停歇,降低封ip的几率
import requests # 用于网页请求
import time # 用于显示当前时间
from lxml import etree # 解析base_url = "https://movie.douban.com/top250"headers = {'Host': "movie.douban.com",'User-Agent': "[这里就不附上了,用浏览器F12直接复制即可]"
}
下面是部分代码,用于show大体上的操作。 代码注释比较清晰,就不进行详细解释。
def get_movies_url(self):"""获得250个电影的url"""movies_url = []url = self.base_url # 这是最开始的网页loss = []for i in range(1, 12):try:print(f"正在访问:{url}")respond = requests.get(url, headers=self.headers).text # 取得源代码re_html = etree.HTML(respond) # 解析网页# 获得当前页面的25个电影的url(是一个列表,最后会成为10*25的二维列表)movies_url.append(re_html.xpath('//div[@id="content"]//div[@class="hd"]/a/@href'))print(f"第{i}次访问成功!")# 准备模仿点击下一页(其实就是获得next url)next_url = re_html.xpath('string(//link[@rel="next"]/@href)')url = self.base_url + next_url # 拼接print(f"即将访问:{url}")# 提示错误,并且将访问失败的url写入列表 方便后来重新访问except Exception as reason:print(f"第{i}次访问失败原因:{reason.args}")print(f"访问失败url:{url}")loss.append(url)if url == self.base_url: # 到最后会没有next url 所以拼接后可能是最开头那一页print("访问结束")break # 这样就退出去freeze(1, 3) # 随机暂停self.all_url = [x for i in movies_url for x in i] # 展开 维度2->1if loss:print("有访问失败的页面,已经返回")self.loss_page = loss
def get_in_info(self):"""进入每一个url进行解析每一个电影各种属性都存放在一个字典中然后写入列表最后得到的是列表中有多个字典每个字典存着每个电影的属性"""assert (self.all_url is not None)if not (self.all_url is not None):raise AssertionError('You have to get movies urls first')# with open('movies_info', 'a+', encoding='utf-8') as file:all_info = []loss = []# 这是字典的keys 和 valueslist_keys = ['No.', 'title', 'director', 'year', 'type', 'stars', 'eval_people_num', 'summary']list_values = ['string(//div[@class="top250"]/span[@class="top250-no"])','string(//span[@property="v:itemreviewed"])','string(//span[@class="attrs"]/a[@rel="v:directedBy"])','//span[@class="year"]/text()','//span[@property="v:genre"]/text()','//div[@class="item"]/span[@class]/text()','string(//span[@property="v:votes"])','//span[@property="v:summary"]/text()']self.key = list_keysself.values = list_valuesfor x, i in enumerate(self.all_url):dic = {} # 每一部电影的信息用一个字典存放,再放入列表中try:cur_re = requests.get(i, headers=self.headers).text # 访问当前一部电影cur_html = etree.HTML(cur_re) # 解析for n, m in enumerate(list_values): # 准备写入字典if n == 5:# 评星内容 删除前后空白并且设计一定的格式在融合例如 : 5星:98% 4星:1%...dic[list_keys[n]] = ''.join([y.strip() + ' ' if t % 2 != 0 else y.strip() + ':'for t, y in enumerate(cur_html.xpath(m))])elif n == 7:# 剧情介绍dic[list_keys[n]] = ''.join([y.strip() for y in cur_html.xpath(m)])elif n == 3 or 4:# 年份和类型dic[list_keys[n]] = str(''.join(cur_html.xpath(m)) + ')').strip('()')else:# 其他直接获取,因为在values中设置成了string()获取,直接是字符串dic[list_keys[n]] = cur_html.xpath(m)if n == 0:# 排名,将其设置为int类型方便数据库中排序dic[list_keys[n]] = int(cur_html.xpath(m)[3:])# print(dic[list_keys[n]])print(f"第{x + 1}次获取信息成功!")except Exception as reason:print(f"第{x + 1}次获取信息失败:原因:{reason.args}")print(f"获取信息失败url:{i}")loss.append(i) # 保存 访问失败的网页# freeze(0, 3) # "冷却时间"all_info.append(dic) # 每一次都存入一个列表当中self.all_info = all_infoif loss:print(f"有访问失败电影网页\n已经返回")self.loss_movies = loss
def write_in_csv(self):"""写入文件"""assert (self.all_info is not None)if not (self.all_info is not None):raise AssertionError('You have to get movies infos first') data = pd.DataFrame(self.all_info)data.to_csv(self.file, mode='a', encoding='utf_8_sig') # 防止乱码的编码方式os.system(self.file)print("Work Done!")
# 最后存入数据库
def write_in_database(self):db_config = {'host': 'localhost', # 需要连接ip'port': 3306, # 默认端口3306'user': 'root', # 用户名.'password': '**********', # 用户密码'db': 'douban_top250', # 进入的数据库名.'charset': 'utf8' # 编码方式.}# 建立连接mq = pymysql.connect(**db_config)# 创建游标对象cursor = mq.cursor()# 读取csv文件# 若是用utf-8则出现# 报错'utf-8' codec can't decode byte 0xc9 in position 67: invalid continuation byte# 最后选择gbk编码方式了= =、with open(self.file, 'r', encoding='gbk') as f: # 打开文件read = csv.reader(f) # 返回可迭代对象,转换成列表方便操作for i in list(read)[1:]: # 第一行(0行)是columns 数据库中已经创建,不入x = tuple(i[1:]) # 第一列(0列)是自动形成的从0开始的有序数列,我们有排名能够对应电影,不写进数据库sql = "INSERT INTO db_250 VALUES" + str(x) # * INSERT INTO * - 向数据库表中插入数据cursor.execute(sql) # 执行SQL语句mq.commit() # 提交数据cursor.close() # 关闭游标mq.close() # 关闭数据库
最后的最后就是成果啦!!!
当当当当!!! 查看方式:使用Navicat 数据库管理工具
可以看见最后还是有一些乱码 ???的,这是再to_csv和读取写入数据库时产生的问题,具体也不清楚何种编码方式才好,utf-8产生的问题在上方的存入数据库的代码块中写到。希望不久后,自己能够发现改进办法
也十分乐意接受路过的大佬们指点!!!请指教。
原创作品 by GreediVic
2021/4/22
利用python爬取豆瓣电影top250相关推荐
- python爬取豆瓣电影top250_利用python爬取豆瓣电影Top250,并把数据放入MySQL数据库...
在学习了python基础后,一心想着快速入门爬虫,因为我就是为爬虫而学的python,所以就找了这个豆瓣电影来爬取.好了,废话不多说,进入正题 1.找到网页并分析网页结构 首先进入豆瓣电影Top250 ...
- python爬取豆瓣电影top250的代码_Python爬虫——爬取豆瓣电影Top250代码实例
利用python爬取豆瓣电影Top250的相关信息,包括电影详情链接,图片链接,影片中文名,影片外国名,评分,评价数,概况,导演,主演,年份,地区,类别这12项内容,然后将爬取的信息写入Excel表中 ...
- Python爬取豆瓣电影top250的电影信息
Python爬取豆瓣电影top250的电影信息 前言 一.简介 二.实例源码展示 小结 前言 相信很多小伙伴在学习网络爬虫时,老师们会举一些实例案例讲解爬虫知识,本文介绍的就是经典爬虫实际案例–爬取豆 ...
- 源码大公开!Python爬取豆瓣电影Top250源代码,赶紧收藏!
哈喽~大家好,我是恰恰.不知道是不是有很多小伙伴跟我一样,很喜欢看电影,尤其是那种别人推荐的豆瓣高分电影,所以学Python就有一个好处,用Python爬取豆瓣电影那是分分钟的事,再也不用因为有些电影 ...
- python爬取豆瓣电影top250编码_Python学习日记1| 用python爬取豆瓣电影top250
今天是3.17号. 离毕业论文开题只剩下不到15天,自己这边还不知道要写什么好,问了导师,导师给的范围超级广泛,实在是想吐槽.想了几天,决定了要尽快给老师说自己的想法和方向,做什么还是靠自己比较靠谱. ...
- python爬取豆瓣电影top250并保存为xlsx_python抓取豆瓣电影Top250数据并写入Excel
douban python抓取豆瓣电影Top250数据并写入Excel 1.将目标网站上的页面抓取下来 2.将抓取下来的数据根据一定的规则进行提取 create table `tb_movie`( i ...
- Python网络爬虫:利用正则表达式爬取豆瓣电影top250排行前10页电影信息
在学习了几个常用的爬取包方法后,转入爬取实战. 爬取豆瓣电影早已是练习爬取的常用方式了,网上各种代码也已经很多了,我可能现在还在做这个都太土了,不过没事,毕竟我也才刚入门-- 这次我还是利用正则表达式 ...
- python爬取豆瓣电影top250_用Python爬取豆瓣电影TOP250分析
/ 01 / Scrapy 之前了解了pyspider框架的使用,但是就它而言,只能应用于一些简单的爬取. 对于反爬程度高的网站,它就显得力不从心. 那么就轮到Scrapy上场了,目前Python中使 ...
- 零基础爬虫----python爬取豆瓣电影top250的信息(转)
今天利用xpath写了一个小爬虫,比较适合一些爬虫新手来学习.话不多说,开始今天的正题,我会利用一个案例来介绍下xpath如何对网页进行解析的,以及如何对信息进行提取的. python环境:pytho ...
最新文章
- Windows Socket编程笔记之最简单的小Demo
- npm安装过程出现的问题及解决方式
- 使用 Oracle GoldenGate 进行实时数据集成
- codevs1002 搭桥
- 《DBNotes:Join算法的前世今生》
- rails4 ajax 例子,Ajax和Rails 4:创建实例变量并更新视图而不刷新
- python idle 中文_Python IDLE 中文乱码问题
- 多方法调用 一个出错 集体回滚_一个@Transaction哪里来这么多坑?
- 为什么链接oracle报错,PG连接Oracle报错解决
- 拼图登陆拼图二维码验证_如何使用拼图快速轻松地构建静态网站
- java 编写无状态代码,一种真正实现RMI无状态化的方法续:JVM源码修改步骤
- 聊聊spring for kafka对consumer的封装与集成
- java day43【Filter:过滤器 、Listener:监听器】
- Mac电脑如何把备忘录添加到通知栏组件中?
- 目录字串最后都不要带目录分隔符
- 易到CEO巩振兵被曝本周已离职 其称“在开会”
- python实现免费同声传译 (离线语音识别+免费翻译接口+系统声音录制)
- win7计算机摄像头怎么打开,Win7笔记本摄像头怎么打开?Win7笔记本打开摄像头的方法...
- TabLayout+ViewPager实现tab切换
- vue 自定义指令v-directive
热门文章
- 怎样通过一根网线,一台电脑,做到月入过万。
- 计算卫星高度角、方位角
- 自动化爬取淘宝数据--(保存到文本中)
- 高富帅seajs使用示例及spm合并压缩工具露脸
- 用计算机打爸爸妈妈,打破限制,我们可以这样远程教父母用手机,向日葵UUPro真香...
- elementUI中el-table每行异常高度原因排查,累死
- 家的范围 Home on the Range【USACO 3.3 】
- Unity Transform 检视器快速复制粘贴
- 题解 [SP4354][AcWing137]TWINSNOW - Snowflakes/雪花雪花雪花
- java计算机毕业设计中国民航酒店分销系统源码+系统+lw+数据库+调试运行