前言
咳咳,本来今天是没想更新的,因为我发现如果不更新涨粉速度比日更要快的多,是的你没听错,经过一天两天的咕咕咕,阅读量是蹭蹭蹭的上去了。
这到底是为什么呢???
让我想起一句话,有的人,死了比活着有用。
也许我放鸽子比日更有用叭。
快用你的点赞安慰一下受伤的小泽吧!!!
进入主题
既然我是不想更新的,那么我为什么要更新呢?
因为我不想,所以我想,懂的都懂。
好啦,其实是因为某位小粉丝在背地里对小泽做了这样的事…
那我能说不吗?
当然不可以啦!
所以!我们今天就来,爬 猫 眼 票 房 !
亵玩焉
俗话说得好,犹抱琵琶半遮面,只可远观而不可亵玩焉,今天我们就要玩一玩这个猫眼票房,看看他到底是男是女,是大是小,是深是浅,冲冲冲!
大家快进到我的洞里面鸭
可以看到,这位小粉丝想要的前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标签里有上映时间吧,懂了吧~
结束!
好的,本来想弄个进程池,让大家再熟悉一下怎么提高效率的,结果这个网站不能太快哈,那就可惜了。
大家早点睡,点个赞,长命百岁!
还有能找到女朋友!!!