前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >送书 | 教你爬取电影天堂数据

送书 | 教你爬取电影天堂数据

作者头像
我被狗咬了
发布2021-09-02 11:34:43
1.3K0
发布2021-09-02 11:34:43
举报
文章被收录于专栏:Python乱炖

大家好!我是啃书君

我和朋友说:俗话说,闲来没事干,不如斗地主,哎,我们不斗地主,就是玩~。那不斗地主,我们干点啥好捏~,不如看电影?!

朋友说:那些新上映的好看的电影、电视剧和动漫,绝大部分都要钱,你这个糟老头子坏得很,又想骗我充会员,借会员给你!!!

我说:哎呀,被你发现了,没事,那我们去电影天堂爬电影数据,到时候想看哪部就下载下来,慢慢看!

爬取分析

在爬取之前,分析爬取的逻辑和理清思路。

我们要爬取的数据是电影天堂首页里面的全部电影信息,例如电影海报、电影名、上映时间、产地、字幕、片长、简介、电影下载链接等电影信息。首先我们打开电影天堂,如下图所示:

打开开发者工具,我们发现每一个div class="co_content222"存放一个首页的模块,这个div class="co_content222"与之对应的模块是2021必看热片,我们打开其中的一个div,如下图所示:

我们发现,里面有很多个li,每个li存放着电影名和电影页面链接,我们点击其中一个a链接并跳转到该电影页面,里面有我们需要的数据信息,例如:电影海报、电影名、上映时间、产地、字幕、片长、简介,电影下载链接等,如下图所示:

我们继续打开开发者工具,经过简单的查找,发现电影信息都存放在div id="Zoom"里面,如下图所示:

好了,我们已经知道每个电影页面链接和电影数据信息存放的位置了,接下来正式开始爬取。

实战演练

电影天堂源代码获取

首先我们定义了get_index()方法来获取电影天堂首页源代码,具体代码如下所示:

代码语言:javascript
复制
def get_index():
    response = requests.get('https://www.dy2018.com/?jdfwkey=ycdpz3')
    response.encoding = 'gb2312'
    html = response.text
    get_link(html)

这个电影天堂这个网站比较特别,不要加请求头也可以正常获取数据。

这里要注意的是:

电影天堂网页的源代码的head部分的编码为:gb2312,所以我们利用requests库来改变输出结果的编码。

获取页面源代码后,我们将源代码传递到get_link()方法中。

电影URL链接获取

在上一步中,我们已经获取到了页面源代码,接下来我们要获取每个电影的URL链接,具体代码如下图所示:

代码语言:javascript
复制
pattern1 = re.compile('2021必看热片.*?<ul>(.*?)</ul>', re.S)
ul = re.findall(pattern1, html)
for i in ul:
    li = i.strip()
    pattern2 = re.compile("<li>.*?'(.*?)'.*?</li>")
    a = re.findall(pattern2, li)
    links = ['https://www.dy2018.com/' + ii for ii in a]
    for link in links:
        get_data(link)

首先我们为了按照首页的每个模块来获取电影链接,所以我们创建了一个名为pattern1的正则表达式对象。因为整个页面源代码中,模块名只出现了一次,例如2021必看热片、迅雷电影资源等,所以我们可以通过这个来准确地获取每个模块的ul数据。由于获取到的数据有换行符,所以我们需要使用strip()方法来清除开头或是结尾的换行符。

接下来我们创建了一个名为pattern2的正则表达式对象来获取a链接里面的href,通过使用列表推导式,我们将每个电影的URL链接存放在列表中,然后将每个列表的元素传递到get_data()方法中。

电影信息的获取

接下来,我们要利用我们已经获取到的电影URL链接来获取电影信息,具体代码如下:

代码语言:javascript
复制
response = requests.get(link)
response.encoding = 'gb2312'
dats = response.text
html = parsel.Selector(dats)
pattern = re.compile(r'<!--Content Start-->.*?src="(.*?)".*?◎译  名 (.*?)<br />.*?◎产  地 (.*?)<br />◎类  别 (.*?)<br />.*?◎字  幕 (.*?)<br />◎上映日期 (.*?)<br />.*?◎片  长 (.*?)<br />.*?◎简  介<br />  (.*?)<', re.S)
ul = re.findall(pattern, dats)
for l in ul:
 down_list = html.xpath('//div[@id="downlist"]/table/tbody/tr/td//text()').extract()
    content = {
     'img': l[0],
        'name': l[1],
        'place': l[2],
        'type': l[3],
        'font': l[4],
        'data': l[5],
        'time': l[6],
        'text': re.sub('&\w+;', '', l[7]).replace('<br />', '').strip(),
        'download': down_list,
        }
        for i in content.values():
            print(i)
if __name__ == '__main__':
    get_index()

由于div id='Zoom'中的电影数据信息中,电影图片等数据只有一个,而电影下载链接可能有多个,例如电视剧的下载链接就有多个,我们如果只用一个正则表达式对象来获取电视剧数据信息的话,只能获取到一个下载链接,所以我们首先通过正则表达式来获取电影图片、电影名、产地、类型、字幕、上映时间、片长和简介,接着使用xpath来获取电视剧的下载链接。

获取完数据信息后,所有的数据放在字典中,并循环打印出来,运行结果如下:

由于本人觉得这种打印出来的数据算是比较好看了,所以没做进一步的数据保存,大家可以根据需要自行将这些数据存储到其他地方。

送书

又到了每周三的送书时刻,今天给大家带来的是《Python网络爬虫框架Scrapy从入门到精通》,本书从python主流框架scrapy的简介及网络爬虫知识讲起,逐步深入到scrapy进阶实战。本书从实战出发,根据不同需求,有针对性地讲解了静态网页、动态网页、app应用是如何爬取所需数据,以及scrapy是如何部署分布式爬取,还介绍了用scrapy+pandas是如何行数据分析及数据展示,让读者不但可以系统地学scrapy编程的相关知识,而且还能对scrapy应用开发有更为深入的理解。本书分为12章,涵盖的主要内容有scrapy框架简介;scrapy网络爬虫知识介绍;scrapy开发环境的搭建;scrapy架构及编程;scrapy阶;实战项目:scrapy静态网页的爬取;实战项目:scrapy动态网页的爬取;实战项目:scrapy爬取app应用数据;scrapy的分布式部署与爬取;分布式的实战项目;用selenium框架测试;用scrapy+pandas行数据分析。本书内容通俗易懂,实例典型,实用性强,特别适合学python主流框架scrapy的入门读者和阶读者阅读,也适合数据分析与挖掘技术的初学者阅读,还适合相关培训机构的师生阅读。

公众号回复:送书 ,参与抽奖(共5本)

点击下方回复:送书 即可!

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-08-18,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Python乱炖 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 爬取分析
  • 实战演练
    • 电影天堂源代码获取
      • 电影URL链接获取
        • 电影信息的获取
        • 送书
        相关产品与服务
        云开发 CLI 工具
        云开发 CLI 工具(Cloudbase CLI Devtools,CCLID)是云开发官方指定的 CLI 工具,可以帮助开发者快速构建 Serverless 应用。CLI 工具提供能力包括文件储存的管理、云函数的部署、模板项目的创建、HTTP Service、静态网站托管等,您可以专注于编码,无需在平台中切换各类配置。
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档