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

2021-09-02 11:34:43 浏览数 (1)

大家好!我是啃书君

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

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

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

爬取分析

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

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

打开开发者工具,我们发现每一个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本)

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

0 人点赞