一起学爬虫(Python) — 16 梅开二度,猫眼票房!

一起学爬虫(Python) — 19 年轻人,进来学自动化

前言

咳咳,本来今天是没想更新的,因为我发现如果不更新涨粉速度比日更要快的多,是的你没听错,经过一天两天的咕咕咕,阅读量是蹭蹭蹭的上去了。

这到底是为什么呢???

让我想起一句话,有的人,死了比活着有用。

也许我放鸽子比日更有用叭。

在这里插入图片描述
快用你的点赞安慰一下受伤的小泽吧!!!

进入主题

既然我是不想更新的,那么我为什么要更新呢?

因为我不想,所以我想,懂的都懂。

好啦,其实是因为某位小粉丝在背地里对小泽做了这样的事…

在这里插入图片描述
那我能说不吗?

当然不可以啦!

所以!我们今天就来,爬 猫 眼 票 房 !

亵玩焉

俗话说得好,犹抱琵琶半遮面,只可远观而不可亵玩焉,今天我们就要玩一玩这个猫眼票房,看看他到底是男是女,是大是小,是深是浅,冲冲冲!

在这里插入图片描述
神奇的传送门

大家快进到我的洞里面鸭

可以看到,这位小粉丝想要的前100数据应该就是…

在这里插入图片描述
往下拉,拉到最下面:

在这里插入图片描述
发现有分页,一页是10部,一共是10页,那么一共是多少部电影呢?

10x10=100,没错,小伙伴们算对啦!一共是100部电影。

因为100部电影 = 前100部电影的数量,
所以我们找对了!

成功水了一波字数。

在这里插入图片描述
接下来就一一看看每一页的url有没有规律吧~

第一页:
在这里插入图片描述
第二页:
在这里插入图片描述
第三页:
在这里插入图片描述
第N页:
在这里插入图片描述

一共是十页,所以我们循环十次,分别请求每一页。

直接上代码!

# 导入模块和包
import requests
from lxml import etree

然后指定我们的url,因为这里的url的规律已经被我们找到啦,所以我们就用拼接的形式组成:

url_low = 'https://maoyan.com/board/4?offset='

因为这个url是不完整的,所以我们叫它lowのurl!

注意注意注意,这个url是不完整的!

接下来我们用循环拼接出10个完整的url:

for i in range(10):
    # 如果不懂i是什么可以先把i打印一下
    # print(i)
    url = url_low + str(i*10)
    print(url)

至于为什么要给i乘上10,不要忘了我们找到的规律鸭!(n-1)*10

但是在python中呢,往往是从0开始的,所以也就不用减1了。

至于str,是为了把int类型的整数转换成str类型的字符串,才能和很lowのurl进行拼接。

然后print一下每一个url,发现都没有毛病对吧:

在这里插入图片描述
如果有,那一定是你没有点赞。

在这里插入图片描述
既然拿到了所有的url,就让我们开始…

等等,不要忘了headers!

headers = {
        'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36'
}

接下来,开始我们的伟大计划吧!

乌拉!!!

for i in range(10):
    # 如果不懂i是什么可以先把i打印一下
    # print(i)
    url = url_low + str(i*10)
    # print(url)
    # 请求这次循环对应的页面
    res = requests.get(url=url,headers=headers).text
    # 树化这次循环对应的界面
    tree = etree.HTML(res)
    # 在这次循环对应的界面中找数据
    tree.xpath('')

可以看到,上面代码里的xpath里面我们还没有写东西,为什么呢?

一起去找呗~

在这里插入图片描述
可以看出来,每个页面里的10个电影里的数据都是存放在一个dl的列表里的,每一个都是弟弟。

那我们的xpath就可以先获取这个dl的列表,然后循环出这10个电影对吧,先获取列表嘛,不然你直接获取电影只能获取一个的。

# 翻译过来呢,就是html下面的body下面的第四个div
# 下面的div下面的div下面的第一个div下面的dl下面的所有dd
dd = tree.xpath('/html/body/div[4]/div/div/div[1]/dl/dd')

然后打印一下dd,看一下有数据没有哈。

在这里插入图片描述

可以看到是有的,而且每个页面里面都是有10个电影的,但是会有些空列表。

当然如果你再运行一遍可能就会发现全都是空列表了,这说明我们不能访问的太频繁!

那就设置一个休眠呗,每隔多少秒访问一次。

import time
time.sleep(0.5)

在这里插入图片描述
也就是这样子哦,别搞错了。

在这里插入图片描述
这下就没问题了。

那我们继续呗~

现在我们得到了每一个页面的dd列表,dd列表里有我们要的详细信息,那我们只要处理好一个循环里的dd列表,其他循环也就自己处理好了吧。

	# 循环遍历dl列表里的每一个dd
    for z in dd:
    	# 排名,爬取出来是个列表,所以用[0]
        top = z.xpath('./i/text()')[0]
        name = z.xpath('./a/@title')[0]
        print('排名:',top,'名字:',name)
    # 防止我们太快猫眼受不了
    time.sleep(0.5)

你以为到这里就结束了吗???

no no no no !

细!

跟大家说一下为什么top和name的xpath要那么写:

首先我们已经爬下来了整个dl列表对吧,然后我们又遍历这个列表,单独对每一个dd做处理,所以这个dd已经是树化了的对吧,因为他的父级就是树化的数据,就不用再去树化了,可以直接xpath了。

那么xpath里面的’./’,就是指的’/html/body/div[4]/div/div/div[1]/dl/dd/’

也就是说是在重写了一遍前面的,只不过用 ./ 给代替了,然后就在dd下面找呗:

在这里插入图片描述
可以看到dd下面的i标签里面就有我们要的排名吧,那就直接text(),获取这个标签下面所有的文本内容。

然后dd标签下面的a标签里有title吧,dd标签下面的div标签下面的div标签下面的div标签下面的第二个p标签里有主演吧,第三个p标签里有上映时间吧,懂了吧~

结束!

好的,本来想弄个进程池,让大家再熟悉一下怎么提高效率的,结果这个网站不能太快哈,那就可惜了。

大家早点睡,点个赞,长命百岁!

还有能找到女朋友!!!

在这里插入图片描述

  • 53
    点赞
  • 45
    收藏
    觉得还不错? 一键收藏
  • 26
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值