《爬取电影信息》

  • 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&timestamp=1587174581492&version=07bb781100018dd58eafc3b35d42686804c6df8d&dataType=json
第二页:http://movie.mtime.com/boxoffice/?year=2019&area=china&type=MovieRankingYear&category=all&page=1&display=list&timestamp=1587174599209&version=07bb781100018dd58eafc3b35d42686804c6df8d&dataType=json

最后一页:http://movie.mtime.com/boxoffice/?year=2019&area=china&type=MovieRankingYear&category=all&page=9&display=list&timestamp=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&timestamp=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&timestamp=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&timestamp=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&timestamp=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&timestamp=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

至此爬取成功。

第三课、《爬取电影信息》相关推荐

  1. python爬取电影信息并插入至MySQL数据库

    在上篇博文中,博主使用python爬取了豆瓣电影的影片信息,接下来,博主考虑到在之前做的JavaWeb电影院项目中需要向数据库中一个个的插入影片数据,十分的繁琐,那么在使用了python爬虫后,这个操 ...

  2. Node.js 爬虫爬取电影信息

    Node.js 爬虫爬取电影信息 本文地址:https://blog.csdn.net/weixin_45580251/article/details/107669713 爬取的是1905电影网的信息 ...

  3. 爬虫项目三:爬取选课信息

    爬虫项目三:爬取whut-jwc选课信息 项目实现:主要获得通识选修.个性选课.英语体育选课的课程信息 核心: 1.实现网页登陆 2.爬取课程信息 一.网页信息登陆 from selenium imp ...

  4. Python爬取电影信息

    利用火狐浏览器模拟登录爬取源码  ! 爬取电影天堂的影片 进行多页爬取 1.导入模块 from bs4 import BeautifulSoup import re import requests f ...

  5. 爬虫入门案例——爬取电影信息

    综述:先介绍开发环境,在介绍从豆瓣电影上面爬取电影的电影名称,电影信息,电影剧照等信息,最终效果是以电影名称为文件夹名,文件夹包含一个txt文件和许多张剧照.如下图所示1是电影名,2是电影信息,3是各 ...

  6. 一个简单python爬虫的实现——爬取电影信息

    最近在学习网络爬虫,完成了一个比较简单的python网络爬虫.首先为什么要用爬虫爬取信息呢,当然是因为要比人去收集更高效. 网络爬虫,可以理解为自动帮你在网络上收集数据的机器人. 网络爬虫简单可以大致 ...

  7. 小菜鸟的第一个爬虫:豆瓣爬取电影信息

    爬取页面: [2016年国内公映电影排期] #!/usr/bin/env python # -*- coding=utf-8 -*-import urllib.request import re im ...

  8. iphone看python文件_Python实战 | 只需 ”三步“ 爬取二手iphone手机信息(转发送源码)...

    原标题:Python实战 | 只需 "三步" 爬取二手iphone手机信息(转发送源码) 本次实战是爬取二手苹果手机的信息,共爬取了300部手机信息,效果如下: 开发环境 环境:M ...

  9. python自动爬取更新电影网站_python爬取电影网站信息

    一.爬取前提 1)本地安装了mysql数据库 5.6版本 2)安装了Python 2.7 二.爬取内容 电影名称.电影简介.电影图片.电影下载链接 三.爬取逻辑 1)进入电影网列表页, 针对列表的ht ...

最新文章

  1. Android 使用ViewPager 做的半吊子的图片轮播
  2. SQL基础【十五、join、Inner join、Left join、Right join、Full join】
  3. 数据库原理学习笔记(一)关系完整性以及数据库完整性
  4. Spring--SPeL
  5. python中调用万年历_python 打印万年历
  6. python把数字逐一存入列表_python实现将range()函数生成的数字存储在一个列表中...
  7. Hadoop学习总结(2)——Hadoop入门详解
  8. easyui前端实现多选框_EasyUI实现下拉框多选功能
  9. mysql查询问题解答_mysql查询问题
  10. 吴恩达神经网络和深度学习-学习笔记-41-特征点检测
  11. 最新席瓦莱恩服务器人口比例,魔兽世界怀旧服:2021年3月最新人口比例数据
  12. 第二章:用Python对不同的商品销售数据进行预测分析
  13. R语言软件R Studio以及python下载函数包使用常见问题(持续更新中)
  14. kuangbin专题一——Fliptile
  15. 是的你没看错,HTTP3来了
  16. java谜题读书笔记_《java深度历险》读书笔记(一)
  17. nginx负载均衡 tomcat报异常: parseHost The host [*] is not valid
  18. 观察 | 经济学诺奖的启示:金融科技的核心任务是什么?
  19. 大数据----数据仓库设计基础(实列演示)
  20. chmod 命令详细用法

热门文章

  1. 5年经验之谈:月薪3000到30000,测试工程师的变“行”记
  2. Java生成文件hash值
  3. 一个基于SpringBoot开发的RBAC系统,非常适合新手入门JavaWeb代码审计实战的系统,长文警告,要好好学习。
  4. 洛古P2392-kkksc03考前临时抱佛脚
  5. WSF操作系统抽象层学习笔记(三)---消息列队
  6. 前端实习周记1---环境配置、静态页面、作品呈现页
  7. 东西方文化心理结构的比较:两极与中间
  8. 银行贷款等额本息,等额本金计算
  9. ps新建、打开和保存图像文件
  10. 遍历JSON文件提取想要的内容