大家好!我是啃书君
我和朋友说:俗话说,闲来没事干,不如斗地主,哎,我们不斗地主,就是玩~。那不斗地主,我们干点啥好捏~,不如看电影?!
朋友说:那些新上映的好看的电影、电视剧和动漫,绝大部分都要钱,你这个糟老头子坏得很,又想骗我充会员,借会员给你!!!
我说:哎呀,被你发现了,没事,那我们去电影天堂爬电影数据,到时候想看哪部就下载下来,慢慢看!
在爬取之前,分析爬取的逻辑和理清思路。
我们要爬取的数据是电影天堂首页里面的全部电影信息,例如电影海报、电影名、上映时间、产地、字幕、片长、简介、电影下载链接等电影信息。首先我们打开电影天堂,如下图所示:
打开开发者工具,我们发现每一个div class="co_content222"存放一个首页的模块,这个div class="co_content222"与之对应的模块是2021必看热片,我们打开其中的一个div,如下图所示:
我们发现,里面有很多个li,每个li存放着电影名和电影页面链接,我们点击其中一个a链接并跳转到该电影页面,里面有我们需要的数据信息,例如:电影海报、电影名、上映时间、产地、字幕、片长、简介,电影下载链接等,如下图所示:
我们继续打开开发者工具,经过简单的查找,发现电影信息都存放在div id="Zoom"里面,如下图所示:
好了,我们已经知道每个电影页面链接和电影数据信息存放的位置了,接下来正式开始爬取。
首先我们定义了get_index()方法来获取电影天堂首页源代码,具体代码如下所示:
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链接,具体代码如下图所示:
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链接来获取电影信息,具体代码如下:
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本)
点击下方回复:送书 即可!