爬取电影信息

之前爬取过基于html跳转的豆瓣TOP250网页,还有基于ajax跳转的美团评论网页,这次将介绍如何爬取基于html和ajax两种跳转方式且含有反爬虫程序和异常值的电影信息网页

电影信息网页链接:
http://movie.mtime.com/boxoffice/#CN/2019

1.分析网页
(1)爬取目标

在这里插入图片描述

(2)分析2018年的电影信息

可以看出网页左边,电影年度可以分为2018,2019,2020年三个部分,我们先针对2018年时的网页进行分析并爬取

  • 分析点击2018年时,第一页的网页链接:
    在这里插入图片描述切换到2018年时第二页的网页为:
    在这里插入图片描述分析结果:
    据以上结果可看出,当点击选择到2018年的电影信息,并进行切换时,链接都为
    http://movie.mtime.com/boxoffice/#CN/2018
    切换网页时链接没有发生改变,说明在2018年的电影信息这个部分,网页是基于ajax跳转的,可利用抓包技术对网页进行爬取
(3)分析点击2018年时10个页面的json文件
  • 寻找json文件方法:
    在这里插入图片描述
  • 找到页面json文件后复制链接的方法:
    在这里插入图片描述

2018年时第一个页面的json文件链接为:

http://movie.mtime.com/boxoffice/?year=2018&area=china&type=MovieRankingYear&category=all&page=0&display=list&timestamp=1586871242566&version=07bb781100018dd58eafc3b35d42686804c6df8d&dataType=json

2018年时第二个页面的json文件链接为:

http://movie.mtime.com/boxoffice/?year=2018&area=china&type=MovieRankingYear&category=all&page=1&display=list&timestamp=1586871698868&version=07bb781100018dd58eafc3b35d42686804c6df8d&dataType=json

2018年时第十个页面的json文件链接为:

http://movie.mtime.com/boxoffice/?year=2018&area=china&type=MovieRankingYear&category=all&page=9&display=list&timestamp=1586871775520&version=07bb781100018dd58eafc3b35d42686804c6df8d&dataType=json
  • 对以上三个链接进行分析可得出,有以下两个个地方不一样:
    第一个不同的地方:
    在这里插入图片描述
    因为我们找的是第一页,第二页和第十页的链接,所以此处的0,1,9表示的是第一页,第二页和第十页

    第二个不同的地方:
    在这里插入图片描述
    此处的timestamp时间戳

(4)请求并筛取信息
  • 导入接下来要用的库
# 导入需要的库
import csv,requests,time
from lxml import etree
  • 设置浏览器代理,构造字典,向服务器请求json文件
# 导入需要的库
import csv,requests,time
from lxml import etree
# 设置浏览器代理,构造字典
headers={
   
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.92 Safari/537.36'
    
}
#此处的url暂时放入的是page=0时,2018年的电影信息第一页
url="http://movie.mtime.com/boxoffice/?year=2018&area=china&type=MovieRankingYear&category=all&page=0&display=list&timestamp=1587124108705&version=07bb781100018dd58eafc3b35d42686804c6df8d&dataType=json"
requests.get(url=url,headers=headers).text

因为遇到了反爬虫程序,所以请求的json文件内容为乱码,运行结果为:
在这里插入图片描述.text去掉,再次运行:

# 导入需要的库
import csv,requests,time
from lxml import etree
# 设置浏览器代理,构造字典
#同时构造多个字典时,字典之间要用逗号隔开(不是在最后一个字典结尾加)
headers={
   
   "Cookie":"userId=0; defaultCity=%25E5%258C%2597%25E4%25BA%25AC%257C290; _tt_=D9331474480AD125C85AB3E287E95970; __utmz=221034756.1586868641.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); _userCode_=20204162141329; _userIdentity_=20204162141328735; _movies_=240425; _ydclearance=04675d66f1c55a48a22c96aa-331d-4098-8bbe-985e4209326e-1587128407; Hm_lvt_6dd1e3b818c756974fb222f0eae5512e=1586868641,1586911472,1587042989,1587121484; __utmc=221034756; __utma=221034756.607018261.1586868641.1587121484.1587123654.6; __utmt=1; __utmt_~1=1; Hm_lpvt_6dd1e3b818c756974fb222f0eae5512e=1587123708; __utmb=221034756.4.10.1587123654",
    'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.92 Safari/537.36'
    
}
#此处的url暂时放入的是page=0时,2018年的电影信息第一页
url="http://movie.mtime.com/boxoffice/?year=2018&area=china&type=MovieRankingYear&category=all&page=0&display=list&timestamp=1587124108705&version=07bb781100018dd58eafc3b35d42686804c6df8d&dataType=json"
response=requests.get(url=url,headers=headers)  #向服务器请求内容,返回200代表成功不加.text时
  #给返回的json文件内容赋值
response

运行结果为:
在这里插入图片描述

  • 利用cookie解决请求json源代码时返回乱码的问题
    什么是cookie
    相当于一个能够成功访问网页内容的钥匙,有了这个钥匙,在面对反爬虫程序时,我们就能成功破解反爬虫程序,使得请求源代码时成功返回内容,而不再返回乱码
    怎么找cookie值?
    在这里插入图片描述cookie值构造为字典:
# 导入需要的库
import csv,requests,time
from lxml import etree
# 设置浏览器代理,构造字典
#同时构造多个字典时,字典之间要用逗号隔开(不是在最后一个字典结尾加)
headers={
   
    "Cookie":"userId=0; defaultCity=%25E5%258C%2597%25E4%25BA%25AC%257C290; _tt_=D9331474480AD125C85AB3E287E95970; __utmz=221034756.1586868641.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); _userCode_=20204162141329; _userIdentity_=20204162141328735; _movies_=240425; _ydclearance=04675d66f1c55a48a22c96aa-331d-4098-8bbe-985e4209326e-1587128407; Hm_lvt_6dd1e3b818c756974fb222f0eae5512e=1586868641,1586911472,1587042989,1587121484; __utmc=221034756; __utma=221034756.607018261.1586868641.1587121484.1587123654.6; __utmt=1; __utmt_~1=1; Hm_lpvt_6dd1e3b818c756974fb222f0eae5512e=1587123708; __utmb=221034756.4.10.1587123654",
    'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.92 Safari/537.36'
    
}
#此处的url暂时放入的是page=0时,2018年的电影信息第一页
url="http://movie.mtime.com/boxoffice/?year=2018&area=china&type=MovieRankingYear&category=all&page=0&display=list&timestamp=1586871775520&version=07bb781100018dd58eafc3b35d42686804c6df8d&dataType=json"

requests.get(url=url,headers=headers).text   #向服务器请求内容,返回200代表成功 

运行结果为:
在这里插入图片描述
从结果可以看出,使用了cookie以后,向网页请求源代码时,成功返回了内容,不再是乱码

在要返回值的后面加.text可以直接看到返回的内容,若不加,就会返回下面的结果,返回200表示请求成功,加或者不加.text都可以,可根据自己的需求来定
在这里插入图片描述

  • 另外还要注意一点,cookie值会根据时间变化,如头一天运行代码时所用的cookie值第二天来再次运行就会出现网页返回json文件内容仍然是乱码的情况,此时重新复制网页上的cookie值即可
    前后间隔一天的两个cookie值对比后发现,很多地方都发生了变化,说明cookie值这把钥匙具有时效性

  • 从成功返回的json文件源代码中提取html文件
    将成功返回的json文件源代码放到json在线解析中进行解析:
    解析出的结果和在jupyter上成功返回的内容一样,如下:
    在这里插入图片描述
    可以看到其中有我们需要的html的内容,将它从json文件中提取出来:
    提取语句为:response.json()["html"]
    提取后运行结果为:
    在这里插入图片描述
    与上一张运行结果相比,这张的运行结果缩小到了html中的内容,即从返回的json文件源代码中成功提取html文件

  • 对从返回的json文件源代码中成功提取html文件网页信息进行解析,筛取

from lxml import etree
html_etree=etree.HTML(response.json()["html"])

运行后无结果,也无错误,说明筛取信息成功

2.提取信息
(1)提取电影名及电影排名

提取信息关键语句:
html_etree.xpath('')括号内为自己根据网页中要提取的内容的html语句而构造的查找提取信息的路径

  • 怎么构造上述语句中的路径?(以提取2018年度第一页上的第一个电影“红海行动”为例)
    在这里插入图片描述按上述操作复制得到的xpath链接为:
    /html/body/div[3]/div[2]/div[1]/div[2]/div/dd[1]/div/div[2]/h3/a
    这个链接是我们要提取的"红海行动"在整个html中的定位,而我们可以用另一种基于html标签的定位方式,来查找到这个信息的所在位置并提取,但这种基于html标签的定位方式需要我们自己根据网页中的html标签来构造路径
    例如在爬取另外一个网页时,我们曾用过这样一个语句:
    在这里插入图片描述其中,//*表示在所有内容中查找,[@id="content"]表示在所有内容中要查找的目标信息,后缀的一系列链接为当时爬取网页的所有链接的共同部分
    基于以上例子,我们构造出提取"红海行动"时的路径为:
//div[@class="boxofficelist"]/div/dd[1]/div/div[2]/h3/a
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值