这里所用到的知识点有request库和xpath用法,同时也需要一点点的python基础,如果有没有学的小伙伴建议学完后再来跟着欧来一起实战项目哦!
1 数据的选择
这里我们打开豆瓣网页,进入豆瓣top250电影评分页面,接下来我们对数据的操作都是在这个页面上进行的。
2 数据的爬取
右击页面,单击检查,对页面进行抓包,获取所需要的url和UA。
同时我们对不同页面的链接分析,我们发现"https://movie.douban.com/top250?start={}&filter="中不同页面的链接,也就是将start=后面的数值依次往后推25,我们想要获取所有电影的数据,也就是说对start=的值进行修改,一共10个url,用代码表示,如下所示。
for k in range(0, 250, 25):
url = 'https://movie.douban.com/top250?start={}&filter='.format(k)
headers = {
'User-Agent': '......'
}
re = requests.get(url, headers=headers).text
对肖申克的救赎进行抓包,我们发现网页将电影的信息全部放在li下面。
我们复制xpath地址,将ol下面的所有的li获取到list_li列表里面。
re = requests.get(url, headers=headers).text
tree = etree.HTML(re)
list_li = tree.xpath('//*[@id="content"]/div/div[1]/ol/li')
我们先定位我们所需要的数据。
通过获取xpath地址,我们先获取电影名称,并存放在s列表中。
for i in list_li:
s = []
Movie_Name = str(i.xpath('./div/div[1]/a/img/@alt'))[2:-2]
在获取导演和演员信息时,我们将空格删除,同时以\xa0切割成列表,再获取数据,代码如下。
x = str(i.xpath('./div/div[2]/div[2]/p[1]/text()[1]')).replace(' ', '')[4:-2]
t = [part.strip() for part in x.split('\\xa0')]
Director = t[0][3:]
Actor = t[-1][3:]
获取年份、国家和电影类别时同上操作,代码如下。
x1 = str(i.xpath('./div/div[2]/div[2]/p[1]/text()[2]')).replace(' ', '')[4:-4]
t = [part.strip() for part in x1.split('\\xa0')]
Year = t[0]
s.append(Year)
Country = t[2]
s.append(Country)
Categories = t[-1]
s.append(Categories)
最后获取评分,代码如下。
Scoring = str(i.xpath('./div/div[2]/div[2]/div/span[2]/text()'))[2:-2]
s.append(Scoring)
输出处理好的数据。
3 数据的保存
创建豆瓣top250评分数据.csv文件,通过csv库对其进行写操作,我们先将标签输入进去。
f = open('豆瓣top250评分数据.csv', 'a+', encoding='utf-8', newline='')
csv_writer = csv.writer(f)
csv_writer.writerow(['Movie_Name', 'Director', 'Actor', 'Year', 'Country', 'Categories', 'Scoring'])
然后对每一个电影的数据s列表进行写操作。
csv_writer.writerow(s)
最后关闭f。
f.close()
最后运行代码,打开csv文件。
到这里,我们本次实战就全部结束了,希望对大家有所帮助。
4 完整代码
import csv
import requests
from lxml import etree
if __name__ == '__main__':
f = open('豆瓣top250评分数据.csv', 'a+', encoding='utf-8', newline='')
csv_writer = csv.writer(f)
csv_writer.writerow(['Movie_Name', 'Director', 'Actor', 'Year', 'Country', 'Categories', 'Scoring'])
for k in range(0, 250, 25):
url = 'https://movie.douban.com/top250?start={}&filter='.format(k)
headers = {
'User-Agent': '......'
}
re = requests.get(url, headers=headers).text
tree = etree.HTML(re)
list_li = tree.xpath('//*[@id="content"]/div/div[1]/ol/li')
for i in list_li:
s = []
Movie_Name = str(i.xpath('./div/div[1]/a/img/@alt'))[2:-2]
x = str(i.xpath('./div/div[2]/div[2]/p[1]/text()[1]')).replace(' ', '')[4:-2]
t = [part.strip() for part in x.split('\\xa0')]
Director = t[0][3:]
Actor = t[-1][3:]
s.append(Movie_Name)
s.append(Director)
s.append(Actor)
x1 = str(i.xpath('./div/div[2]/div[2]/p[1]/text()[2]')).replace(' ', '')[4:-4]
t = [part.strip() for part in x1.split('\\xa0')]
Year = t[0]
s.append(Year)
Country = t[2]
s.append(Country)
Categories = t[-1]
s.append(Categories)
Scoring = str(i.xpath('./div/div[2]/div[2]/div/span[2]/text()'))[2:-2]
s.append(Scoring)
csv_writer.writerow(s)
f.close()