专栏首页公众号:googpy爬取TOP100的电影

爬取TOP100的电影

阅读文本大概需要 5 分钟。

最近在学习requests库和正则表达式,今天就利用这两个知识点来抓取猫眼电影TOP100的相关内容。

1.确定爬取目标

提取出猫眼电影TOP100的电影名称、时间、评分、图片等信息,提取的URL为:http://maoyan.com/board/4,提取的结果以文件形式保存下来。

2.前期准备

本项目需要用到requests库,请确保已经正确安装好了requests库,如果没有安装,可以用pip指令进行安装,非常简单,这里就不再详细叙述了。

打开URL后,可以看到排名第一的是「霸王别姬」,可以看到页面显示的有效信息有电影名字、主演、上映时间、上映地区、评分、图片等信息。

3.“种子”的分析,生成爬虫入口

现在需要确定正则表达式,在谷歌浏览器,打开开发者选项(F12),查看其中的一个条目的源代码,如图所示。

首先,我们先提取它的排名信息,它的排名信息是class为board-index的i节点内,这里利用非贪婪匹配来提取i节点内的信息,正则表达式如下:

<dd>.*?board-index.*?>(\d+)</i>.*?

然后,提取它的图片信息,正则表达式改写为:

<dd>.*?board-index.*?>(\d+)</i>.*?data-src="(.*?)"

再提取电影名字,它在p节点内,class为name。所以,用name做一个标志位,然后进一步提取其内a节点的正文内容,此时表达式变为:

<dd>.*?board-index.*?>(\d+)</i>.*?data-src="(.*?)".*?name"><a'

最后,用同样的原理,提取主演、发布时间、评分等内容,此时,正则表达式为:

<dd>.*?board-index.*?>(\d+)</i>.*?data-src="(.*?)".*?name"><a'
                         + '.*?>(.*?)</a>.*?star">(.*?)</p>.*?releasetime">(.*?)</p>'
                         + '.*?integer">(.*?)</i>.*?fraction">(.*?)</i>.*?</dd>', re.S)

4.写入文件

我们最后需要将提取的结果写入文件,这里直接写入到一个文本文件中。通过JSON库的dumps()方法实行字典的序列化,并指定ensure_ascii参数为False,这样可以保证输出结果是中文形式而不是Unicode编码。代码如下:

def write_to_file(content):
    with open('result.txt','a',encoding='utf-8') as f:
        f.write(json.dumps(content,ensure_ascii=False)+'\n')

5.需要注意

adb 命令还是比较方便的,我们可以直接用 adb 命令中的截图方法,格式如下。

如果,我们按上面的思路,只能提取到首页的信息。我们将网页滚动到最下方,可以发现有分页列表,点击第2页,可以发现此时页面的URL变成了http://maoyan.com/board/4?offest=10,比之前的URL多了一个参数,那就是offest=10,而目前显示的结果是排行11~20名的电影,初步推断这是一个偏移量参数。

当我们点击第3页时,参数offest=20。所以,如果要想提取TOP100电影,只需要分开请求10次,而10次的offest参数分别设置为0、10、20…90即可。

所以,当我们提取目标时,还需要遍历,给这个链接传入offest参数,实现其他90部电影的爬取,此时添加如下调用即可:

def main(offset):
    url = 'http://maoyan.com/board/4?offset=' + str(offset)
    html = get_one_page(url)
    for item in parse_one_page(html):
        print(item)
        write_to_file(item)

6.整合代码

最后,运行代码,可以看到,电影信息也已经全部保存到了文本文件中了。

感兴趣的小伙伴,后台回复「电影」获取项目源码,可以学习一下。通过这个简单的爬虫实例,可以帮助我们更好的理解requests库和正则表达式。

本文分享自微信公众号 - googpy(googpy),作者:叫我小包总

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-06-10

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Python基本数据类型

    好长时间没有更文了,最近一直在查漏补缺Python的基础知识,下面把最近看学习视频中觉得比较重要的基础知识分享给大家。万丈高楼平地起,希望每一位初学Python...

    stormwen
  • 带你认识Python的列表推导式

    今天给大家分享几个Python里面的骚操作,大家会更加感受到Python编码的强大。

    stormwen
  • 又是一年毕业季,从此你不再是少年

    昨天知乎邀请我回答这样一个问题:你有什么想对2019届毕业生说的话?在步入社会前,有哪些毕业生必须明白的道理?

    stormwen
  • 计算机网络笔记 —— 物理层 2

    让多个用户共享同一根信道,复用技术是干线上的技术,主要问题在于干线起点如何共用,干线终点如何分离的。

    YingJoy_
  • 转载-来料不良的分析方向

    8、采购方认可工程师从10个样品中挑出1个合格品,为了封样而封样,供应商不具量产性。

    用户5495712
  • python:前端(HTML)+后端(D

     3、创建一个Django项目,并将刚才的两个html文件放入template模板文件夹中

    用户2398817
  • 08-元组基础

    凯茜的老爸
  • 重温Delphi之:面向对象

    任何一门语言,只要具备了"封装,继承,多态"这三项基本能力,不管其实现方式是直接或曲折、复杂或简洁,就可以称之为“面向对象”的语言。 Delphi当年的迅速走红...

    菩提树下的杨过
  • 部署nginx_lua_waf记录

    通过部署nginx_lua_waf,具有使用简单、高性能、轻量级的优势,能够有效的防范sql注入、文件包含、XSS、fuzzing等web攻击,屏蔽异常的网络请...

    信安之路
  • 使用Numpy将数据集中的data和target同时shuffle

    因为通常我们需要将数据打散,这样的好处是可以让模型训练更具鲁棒性,那么如何同时打散data和target,而且还需要保持对应顺序不变呢?方法如下

    marsggbo

扫码关注云+社区

领取腾讯云代金券