第三课、《爬取电影信息》
《爬取电影信息》
- 1、准备工作
- 2、分析网页
- 1、打开网页
- 2、选取2019年的电影并分析其网页链接
- 3、分析ajax包的链接
- (1)查看ajax包是否内容正确
- (2)分析ajax包的链接的规律
- (3)用for循环爬取网页所有电影的ajax链接
- 3、抓取ajax包
- 1、检查网页
- 2、查询ajax的代理和请求方式
- (1)代理方式
- (2)字典
- 3、请求网页
- (1)正常请求
- (2)cookie值
- (3)cookie值的查询
- (4)放入请求代码的headers中
- (5)加入cookie值后请求的运行结果为:
- (6)将其赋值给response
- (7)json解析
- (8)选取要爬取的内容
- 4、筛选信息
- 1、导入筛选信息的包
- 2、提取信息
- (1)提取电影名
- 3、查看内容xpath路径
- (1)查看内容所在主要路径
- (2)查看内容所在路径
- (3)编写路径
- (4)爬取信息
- (5)更改部分内容爬取其他年份的电影
- 6、代码异常处理
- 1、在爬取2020年的电影时出现了一些问题
- 2、处理异常代码
- (1)try函数
- (2)查找错误地方
- (3)对代码进行加工
- (4)2020年电影输出效果
- 5、保存
- 1、保存为csv格式
- 2、将代码汇总
- 6、查看
1、准备工作
和上一次课的准备工作一致。
2、分析网页
1、打开网页
2、选取2019年的电影并分析其网页链接
2019年电影票房
第一页:http://movie.mtime.com/boxoffice/#CN/2019
第二页:http://movie.mtime.com/boxoffice/#CN/2019
…
最后一页:http://movie.mtime.com/boxoffice/#CN/2019
发现每一页的网页链接都是一样的,所以直接爬取网页的链接是不可取的,我们采取上次课的学习内容,用ajax抓包的方式来爬取链接
3、分析ajax包的链接
(1)查看ajax包是否内容正确
发现内容确实是我们所想要的内容
(2)分析ajax包的链接的规律
第一页:http://movie.mtime.com/boxoffice/?year=2019&area=china&type=MovieRankingYear&category=all&page=0&display=list×tamp=1587174581492&version=07bb781100018dd58eafc3b35d42686804c6df8d&dataType=json
第二页:http://movie.mtime.com/boxoffice/?year=2019&area=china&type=MovieRankingYear&category=all&page=1&display=list×tamp=1587174599209&version=07bb781100018dd58eafc3b35d42686804c6df8d&dataType=json
…
最后一页:http://movie.mtime.com/boxoffice/?year=2019&area=china&type=MovieRankingYear&category=all&page=9&display=list×tamp=1587174613531&version=07bb781100018dd58eafc3b35d42686804c6df8d&dataType=json
发现链接之间有变化的为page和timestamp两个部分
(3)用for循环爬取网页所有电影的ajax链接
for page in range(10):#为“for page in range(0,10,1)”的简写print ("正在爬取%s页。。。。。"%(page+1))url = "http://movie.mtime.com/boxoffice/?year=2020&area=china&type=MovieRankingYear&category=all&page=%s&display=list×tamp=1586758678446&version=07bb781100018dd58eafc3b35d42686804c6df8d&dataType=json"%page
3、抓取ajax包
1、检查网页
2、查询ajax的代理和请求方式
按照顺序点击,并查找
(1)代理方式
(2)字典
3、请求网页
(1)正常请求
import requests
url = "http://movie.mtime.com/boxoffice/?year=2019&area=china&type=MovieRankingYear&category=all&page=0&display=list×tamp=1586758678446&version=07bb781100018dd58eafc3b35d42686804c6df8d&dataType=json"
headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.149 Safari/537.36'
}
requests.get(url= url)
运行结果为:
结果输出为521不是200,说明有错误。
(2)cookie值
上面的请求失误是因为网页有反爬虫,这里我们需要一个身份证明,就是“cookie”,将其放入代理中来伪装我们的身份,来跳过网页的反爬虫。
(3)cookie值的查询
与查找代理一样的步骤
(4)放入请求代码的headers中
import requests
url = "http://movie.mtime.com/boxoffice/?year=2019&area=china&type=MovieRankingYear&category=all&page=0&display=list×tamp=1587175350317&version=07bb781100018dd58eafc3b35d42686804c6df8d&dataType=json"
headers = {'Cookie':'_userCode_=2020418943319761; _userIdentity_=2020418943319882; userId=0; defaultCity=%25E5%258C%2597%25E4%25BA%25AC%257C290; _ydclearance=0727d3a1a8b8c2b43ce53545-898d-4121-b3ae-c28cad83fd56-1587181343; _tt_=1B6780C77FCA13619F3729D19CEA8D35; Hm_lvt_6dd1e3b818c756974fb222f0eae5512e=1587174213; Hm_lpvt_6dd1e3b818c756974fb222f0eae5512e=1587174213; __utma=221034756.2128731208.1587174213.1587174213.1587174213.1; __utmc=221034756; __utmz=221034756.1587174213.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); __utmb=221034756.2.10.1587174213',
'User-Agent':' Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.108 Safari/537.36'
}
requests.get(url=url, headers=headers)
注意在两条代码之间要加分隔符“,”
(5)加入cookie值后请求的运行结果为:
运行结果为200,说明请求成功了
(6)将其赋值给response
response=requests.get(url=url, headers=headers)
(7)json解析
将抓取的包用json解析器解析,其解析结果如下:
可以看出,解析后,我们想要的内容在html中
(8)选取要爬取的内容
response.json()["html"]
运行结果为:
4、筛选信息
1、导入筛选信息的包
from lxml import etree #导入解析库html_etree = etree.HTML(response.json()["html"]) # 看成一个筛子,树状
2、提取信息
(1)提取电影名
name= html_etree.xpath('/html/body/div[3]/div[2]/div[1]/div[2]/div/dd[1]/div/div[2]/h3/a')
运行结果为:
发现提取不了想要的内容
(有时候直接复制内容的xpath路径会失效,这里引入知识点,“手动输入 路径“)
3、查看内容xpath路径
(1)查看内容所在主要路径
可以看出电影的所有内容都是在==class=“boxofficelist”==下
(2)查看内容所在路径
(3)编写路径
第一部电影名的xpath路径:/html/body/div[3]/div[2]/div[1]/div[2]/div/dd[1]/div/div[2]/h3/a
第二部电影名的xpath路径:/html/body/div[3]/div[2]/div[1]/div[2]/div/dd[2]/div/div[2]/h3/a
…
第十部电影名的xpath路径:/html/body/div[3]/div[2]/div[1]/div[2]/div/dd[10]/div/div[2]/h3/a
可以看出只有dd标签后的内容发生了变化
所以其路径可以写为如下形式:
//div[@class="boxofficelist"]/div/dd[1]/div/div[2]/h3/a
(4)爬取信息
爬取的代码如下(选取电影的排名、电影名、导演、演员、评分人数为爬取信息):
dd = html_etree.xpath('//div[@class="boxofficelist"]/div/dd')
for item in dd:rank = item.xpath('./div/div[1]/i/text()')name = item.xpath('./div/div[2]/h3/a/text()')director = item.xpath('./div/div[2]//p[3]/a/text()') #在导演"director"处使用了模糊匹配;这里"div[2]"和"p[3]"之间应该有"b"的,但是b没有被定义,代码会识别不出来,去掉b保留"/"后代码会匹配相似的内容actor = item.xpath('./div/div[2]//p[4]/a/text()') #这里的"a"原应该是分[1]、[2]的,但是我吗要把所有演员都爬取下来,选择去掉后缀来表示爬取全部。act = "、".join(actor) #拼接字符串,将两个字段拼接为一个act = [act] # 将数值转换为数组score = item.xpath('./div/div[3]/p[2]/text()')score = score[0].replace("人评分", "") #替换掉“人评分”,类似于正则表达式的替代,可以使用这种方式将不需要的内容替换掉。score = [score]result = (rank+name+director+act+score)# 将输出结果赋值给"result",字段相加则表示为一个数组
其运行结果为:
(5)更改部分内容爬取其他年份的电影
网页链接:
url = “http://movie.mtime.com/boxoffice/?year=2019&area=china&type=MovieRankingYear&category=all&page=%s&display=list×tamp=1587175350317&version=07bb781100018dd58eafc3b35d42686804c6df8d&dataType=json”%page
将年份改为“2018”、“2020”,对应爬取相应年份的电影
6、代码异常处理
1、在爬取2020年的电影时出现了一些问题
这时候引入知识点
2、处理异常代码
因为跨页爬取时,列表超出了循环,代码就会自动终止,为了避免发生这种情况,我们可以使用 try函数来跳过这些错误
(1)try函数
try:print() #输出可运行的内容
except:pass #对不可输出的内容进行跳过的操作break #跳出函数
(2)查找错误地方
可以看到有的电影没有评分,我们就在爬取的信息上添加try函数
(3)对代码进行加工
我们将这种特殊的页面的代码进行加工:
dd = html_etree.xpath('//div[@class="boxofficelist"]/div/dd')for item in dd:try:rank = item.xpath('./div/div[1]/i/text()')director = item.xpath('./div/div[2]//p[3]/a/text()') actor = item.xpath('./div/div[2]//p[4]/a/text()')act = "、".join(actor)act = [act]try:score = item.xpath('./div/div[3]/p[2]/text()')score = score[0].replace("人评分", "")score = [score]except:passday = item.xpath('./div/div[2]/p[1]/strong[1]/text()')name = item.xpath('./div/div[2]/h3/a/text()')result = (rank+name+director+act+score)print (result)writer.writerow(result)except: print ("此处错误")break
(4)2020年电影输出效果
5、保存
1、保存为csv格式
保存的代码
import csv
# 创建文件夹并打开
fp = open("./文件名.csv", 'a', newline='', encoding = 'utf-8-sig')
writer = csv.writer(fp) #我要写入
# 写入内容
writer.writerow(('排名', '名称', '链接', '星级', '评分', '评价人数'))
#关闭文件夹
fp.close()
2、将代码汇总
import requests,csv,time, re
from lxml import etree
startTime = time.time() #记录起始时间
headers = {"Cookie":"_userCode_=2020418943319761; _userIdentity_=2020418943319882; userId=0; defaultCity=%25E5%258C%2597%25E4%25BA%25AC%257C290; _tt_=1B6780C77FCA13619F3729D19CEA8D35; Hm_lvt_6dd1e3b818c756974fb222f0eae5512e=1587174213; __utmc=221034756; __utmz=221034756.1587174213.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); __utma=221034756.2128731208.1587174213.1587174213.1587180393.2; _ydclearance=b4fbd963ad758a29f9342628-d2be-4383-819c-45bd5d4f2137-1587188617; Hm_lpvt_6dd1e3b818c756974fb222f0eae5512e=1587181435","User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.108 Safari/537.36"
}
# 创建文件夹并打开
fp = open("./电影信息2019.csv", 'a', newline='', encoding = 'utf-8-sig')
writer = csv.writer(fp) #我要写入
writer.writerow(('排名', '名称', '导演', '演员', '评分'))
for page in range(10):print ("正在爬取%s页。。。。。"%(page+1))url = "http://movie.mtime.com/boxoffice/?year=2019&area=china&type=MovieRankingYear&category=all&page=%s&display=list×tamp=1587175350317&version=07bb781100018dd58eafc3b35d42686804c6df8d&dataType=json"%pageresponse = requests.get(url=url, headers=headers)html_etree = etree.HTML(response.json()["html"])# 提取信息dd = html_etree.xpath('//div[@class="boxofficelist"]/div/dd')for item in dd:rank = item.xpath('./div/div[1]/i/text()')name = item.xpath('./div/div[2]/h3/a/text()')director = item.xpath('./div/div[2]//p[3]/a/text()') #在导演"director"处使用了模糊匹配;这里"div[2]"和"p[3]"之间应该有"b"的,但是b没有被定义,代码会识别不出来,去掉b保留"/"后代码会匹配相似的内容actor = item.xpath('./div/div[2]//p[4]/a/text()') #这里的"a"原应该是分[1]、[2]的,但是我吗要把所有演员都爬取下来,选择去掉后缀来表示爬取全部。act = "、".join(actor) #拼接字符串,将两个字段拼接为一个act = [act] # 将数值转换为数组score = item.xpath('./div/div[3]/p[2]/text()')score = score[0].replace("人评分", "") #替换掉“人评分”,类似于正则表达式的替代,可以使用这种方式将不需要的内容替换掉。score = [score]result = (rank+name+director+act+score)# 将输出结果赋值给"result",字段相加则表示为一个数组print(result)writer.writerow(result)
fp.close()
endTime =time.time()#获取结束时的时间
useTime =(endTime-startTime)
print ("该次所获的信息一共使用%s秒"%useTime)
其运行结果为:
至此爬取结束
6、查看
在文件夹中可以查看csv文件
打开csv文件查看
2018
2019
2020
至此爬取成功。
第三课、《爬取电影信息》相关推荐
- python爬取电影信息并插入至MySQL数据库
在上篇博文中,博主使用python爬取了豆瓣电影的影片信息,接下来,博主考虑到在之前做的JavaWeb电影院项目中需要向数据库中一个个的插入影片数据,十分的繁琐,那么在使用了python爬虫后,这个操 ...
- Node.js 爬虫爬取电影信息
Node.js 爬虫爬取电影信息 本文地址:https://blog.csdn.net/weixin_45580251/article/details/107669713 爬取的是1905电影网的信息 ...
- 爬虫项目三:爬取选课信息
爬虫项目三:爬取whut-jwc选课信息 项目实现:主要获得通识选修.个性选课.英语体育选课的课程信息 核心: 1.实现网页登陆 2.爬取课程信息 一.网页信息登陆 from selenium imp ...
- Python爬取电影信息
利用火狐浏览器模拟登录爬取源码 ! 爬取电影天堂的影片 进行多页爬取 1.导入模块 from bs4 import BeautifulSoup import re import requests f ...
- 爬虫入门案例——爬取电影信息
综述:先介绍开发环境,在介绍从豆瓣电影上面爬取电影的电影名称,电影信息,电影剧照等信息,最终效果是以电影名称为文件夹名,文件夹包含一个txt文件和许多张剧照.如下图所示1是电影名,2是电影信息,3是各 ...
- 一个简单python爬虫的实现——爬取电影信息
最近在学习网络爬虫,完成了一个比较简单的python网络爬虫.首先为什么要用爬虫爬取信息呢,当然是因为要比人去收集更高效. 网络爬虫,可以理解为自动帮你在网络上收集数据的机器人. 网络爬虫简单可以大致 ...
- 小菜鸟的第一个爬虫:豆瓣爬取电影信息
爬取页面: [2016年国内公映电影排期] #!/usr/bin/env python # -*- coding=utf-8 -*-import urllib.request import re im ...
- iphone看python文件_Python实战 | 只需 ”三步“ 爬取二手iphone手机信息(转发送源码)...
原标题:Python实战 | 只需 "三步" 爬取二手iphone手机信息(转发送源码) 本次实战是爬取二手苹果手机的信息,共爬取了300部手机信息,效果如下: 开发环境 环境:M ...
- python自动爬取更新电影网站_python爬取电影网站信息
一.爬取前提 1)本地安装了mysql数据库 5.6版本 2)安装了Python 2.7 二.爬取内容 电影名称.电影简介.电影图片.电影下载链接 三.爬取逻辑 1)进入电影网列表页, 针对列表的ht ...
最新文章
- Android 使用ViewPager 做的半吊子的图片轮播
- SQL基础【十五、join、Inner join、Left join、Right join、Full join】
- 数据库原理学习笔记(一)关系完整性以及数据库完整性
- Spring--SPeL
- python中调用万年历_python 打印万年历
- python把数字逐一存入列表_python实现将range()函数生成的数字存储在一个列表中...
- Hadoop学习总结(2)——Hadoop入门详解
- easyui前端实现多选框_EasyUI实现下拉框多选功能
- mysql查询问题解答_mysql查询问题
- 吴恩达神经网络和深度学习-学习笔记-41-特征点检测
- 最新席瓦莱恩服务器人口比例,魔兽世界怀旧服:2021年3月最新人口比例数据
- 第二章:用Python对不同的商品销售数据进行预测分析
- R语言软件R Studio以及python下载函数包使用常见问题(持续更新中)
- kuangbin专题一——Fliptile
- 是的你没看错,HTTP3来了
- java谜题读书笔记_《java深度历险》读书笔记(一)
- nginx负载均衡 tomcat报异常: parseHost The host [*] is not valid
- 观察 | 经济学诺奖的启示:金融科技的核心任务是什么?
- 大数据----数据仓库设计基础(实列演示)
- chmod 命令详细用法