本文主要抓取豆瓣电影top250榜单里面的电影数据,提取的数据包括电影名称、电影的链接、电影的星级、电影引言、电影的评论 人数等。
通过浏览器右键点击检查,选择netword和里面XHR刷新来看,我们要提取的数据并不是异步加载的,也不是通过其他加密方式加载的,可以直接把网页的源码爬取下来,在进行解析就可以。
https://movie.douban.com/top250?start=0&filter=,里面的参数start就是对应着哪一页,相当于偏移量,且每次在原来的基础上加25,每次修改start的值就可以获取下一页的信息。
每一部电影的信息都在一个class属性为item的div盒子里面,通过BeautifulSoup的find_all('div',{'class':'item'})来找到该页所有相关的盒子,class属性为hd的div盒子,包含电影链接、电影名称,class属性为start的div盒子,包含星级和评论人数,引言在 class属性为quote的p标签里面。
# 获取一页数据
def get_one_page(offset):
# 设置请求头
headers={
'Referer':'https://movie.douban.com/top250?start=0&filter=',
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36'
}
url='https://movie.douban.com/top250?start='+str(offset)+'&filter='
try:
time.sleep(1)
response=requests.get(url,headers=headers)
# 判断相应状态,200表示请求成功
if response.status_code == 200:
return response.content
except Exception as e:
print('出错!')
return None
def parse_page(offset):
response=get_one_page(offset)
if response:
# print(response.decode('utf-8'))
html=bs(response.decode('utf-8'),'lxml')
items=html.find_all('div',{'class':'item'})
if items:
for item in items:
a=item.find('div',{'class':'hd'}).a
s=item.find('div',{'class':'star'})
bd=item.find('div',{'class':'bd'})
# 链接
href=a.attrs['href']
# 名称
title=a.span.get_text()
# 引言
quote=bd.find('p',{'class':'quote'}).span.get_text()
# 星级
star=s.find('span',{'class':'rating_num'}).get_text()
# 评价人数
conment_people=re.search(r'[0-9].*[^人评价]',str(s.contents[len(s.contents)-2])).group()
yield{
'title':title,
'href':href,
'star':star,
'quote':quote,
'number':conment_people
}
else:
print('没有找到该节点')
参数i的作用判断是否为第一次写进文件,作为标记,避免后面的多次写进的时候会出现多行的名称 链接 星级 引言 评论人数,去遍历生成器的数据,并把每部电影的信息存储到一个csvList列表里面去,再把该列表添加到datalist列表中去,每一个csvfile列表的数据就是csv文件里面的一行数据,最后再把datalist作为参数,传进writerows()方面。
# 保存数据到csv文件里面
def save_csv_files(contents,i):
"""
newline='':去除换行,
encoding='utf-8':指明编码格式,防止中文乱码
"""
with open('douban_top250.csv','a',encoding='utf-8',newline='')as f:
# 将python中的字典转换为json格式,并对输出中文指定ensure_ascii=False
csvFile=csv.writer(f)
if i ==0:
csvFile.writerow(['名称','链接','星级','引言','评论人数'])
datalist=[]
for data in contents:
csvList=[]
csvList.append(data['title'])
csvList.append(data['href'])
csvList.append(data['star'])
csvList.append(data['quote'])
csvList.append(data['number'])
datalist.append(csvList)
csvFile.writerows(datalist)
链接:https://pan.baidu.com/s/1LxSH2J7HA163mZNrhiWGRQ 密码:kzo1