文章目录
1.抓包分析
网址:电影票房
1.1 网页分析
在爬取网页内容之前,第一件事就是分析它的网页数据的加载方式,再决定我请求服务器的方式。
我们点击第二页时发现网页的URL没有发生改变,可以初步判断它是ajax加载的数据,所以我们可以通过抓包的方式来获取内容。
1.2如何进行抓包
如何进行抓包在我的另一篇博客里面有说到:python爬取美团评论
选择了第1、2、3和最后一页的链接进行了比较,它们的参数有两处不同,但时间戳那里不是该链接的关键信息,并不能影响到链接,所以不用管它,仅需关注page=那里即刻,间隔为1。
2.电影信息爬取
这里爬取的是2020年的
2.1爬取第一页
2.1.1请求网页
返回200才是请求成功。
# 请求网页
import requests
ajax_url="http://movie.mtime.com/boxoffice/?year=2020&area=china&type=MovieRankingYear&category=all&page=0&display=list×tamp=1587194660511&version=07bb781100018dd58eafc3b35d42686804c6df8d&dataType=json"
#字典型,代理
headers={
"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.87 Safari/537.36"
}
response=requests.get(url=ajax_url,headers=headers)
print(response)
<Response [521]>
结果我们发现没有请求成功,该网页有反爬虫机制,因此要用到它的Cookie值。
重新请求网页:
Cookie值的查找:
# 请求网页
import requests
ajax_url="http://movie.mtime.com/boxoffice/?year=2020&area=china&type=MovieRankingYear&category=all&page=0&display=list×tamp=1587194660511&version=07bb781100018dd58eafc3b35d42686804c6df8d&dataType=json"
#字典型,代理
headers={
"Cookie": "_userCode_=202041883428296; _userIdentity_=202041883428359; userId=0; defaultCity=%25E5%25B9%25BF%25E4%25B8%259C%257C364; DefaultCity-CookieKey=364; DefaultDistrict-CookieKey=0; _tt_=B74386D6D79B43F16B312C45BE7A7DB0; __utma=221034756.1561762253.1587170071.1587170071.1587170071.1; __utmc=221034756; __utmz=221034756.1587170071.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); Hm_lvt_6dd1e3b818c756974fb222f0eae5512e=1587171337; Hm_lpvt_6dd1e3b818c756974fb222f0eae5512e=1587172633; _ydclearance=09eee44c9074eb37d3084533-c8e1-45e0-9eda-fcc89987393c-1587200396",
"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.87 Safari/537.36"
}
response=requests.get(url=ajax_url,headers=headers)
print(response)
<Response [200]>
返回200,请求网页成功。
2.1.2获取text内容:
print(response.text)
结果为:
我仅需要获取其中的一些信息,把所得结果复制到json解析去解析,我们只要html标签中的内容。
2.1.3获取json内容:
response.json()["html"]
结果:
2.1.4xpath提取内容
我们使用xpath时,也必须先对网页进行 lxml 库中的 etree解析 ,把它变为特有的树状形式,才能通过它进行节点定位。
#解析网页
from lxml import etree
html_etree=etree.HTML(response.json()["html"])
#看成一个筛子,树状
1.提取电影名称:
html_etree.xpath('/html/body/div[3]/div[2]/div[1]/div[2]/div/dd[1]/div/div[2]/h3/a/text()')
结果:
[]
然后我们发现没有提取到信息,所以直接法制其xpath 的方法不可取,因此我们需要自己构造它的xpath
重新构造的原因是如果从html开始定位会出现模糊定位,无法定位到我们想要的地方。
然后我们重新来提取信息:
html_etree.xpath('//div[@class="boxofficelist"]/div/dd[1]/div/div[2]/h3/a/text()')
['宠爱']
这里就提取成功了。
2.提取电影排名
同样的这里也需要构造它的xpath,与上面的构造方法一样,我们只要找到排名对应的标签即刻。
提取信息:
html_etree.xpath('//div[@class="boxofficelist"]/div/dd[1]/div/div[1]/i/text()')
结果:
['01']
同等方法获取其他单个电影信息。
3.获取本页所有电影名称,这里写一个for循环来实现
li=html_etree.xpath('//div[@class="boxofficelist"]/div/dd')
for item in li:
name=item.xpath('./div/div[2]/h3/a/text()')
print(name)
结果:
['宠爱']
['叶问4:完结篇']
['误杀']
['变身特工']
['我为你牺牲']
['美丽人生']
['天使陷落']
['紫罗兰永恒花园外传:永远与自动手记人偶']
['鲨海逃生']
['半个喜剧']
4.获取本页所有排名和电影名称
li=html_etree.xpath('//div[@class="boxofficelist"]/div/dd')
for item in li:
name=item.xpath('./div/div[2]/h3/a/text()')
rank=item.xpath('./div/div[1]/i/text()')
print(rank,name)
结果:
['01'] ['宠爱']
['02'] ['叶问4:完结篇']
['03'] ['误杀']
['04'] ['变身特工']
['05'