二、代码
#使用requests爬取网页
#使用bs4实现数据解析
#借助pandas将数据导入到excel
import requests
from lxml import etree
from bs4 import BeautifulSoup
import pprint
import json
#构造分页数字列表
page_indexs=range(0,250,25)
#下载所有页面的html,用于后续数据处理
def download_all_htmls():
htmls=[]
for index in range(0,10):
url='https://movie.douban.com/top250?start='+str(index*25)
heads={'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36 Edg/115.0.1901.203'}
print('craw html:',url)
r=requests.get(url,headers=heads)
if r.status_code!=200:
raise Exception('error')
htmls=etree.HTML(r.text) #r.text就是html的数据
lis=htmls.xpath('//*[@id="content"]/div/div[1]/ol/li')
for li in lis:
title=li.xpath('./div/div[2]/div[1]/a/span[1]/text()')
htmls.append(r.text)
return htmls
htmls=download_all_htmls()
#解析html得到数据
def parse_single_html(html):
'''解析单个html得到数据'''
soup=BeautifulSoup(html,'html.parser')
article_items=(
soup.find('div',class_='article')
.find('ol',class_='grid_view').find('li')
)
datas=[]
for article_item in article_items:
rank=soup.find('div',class_='article').find('ol',class_='grid_view').find('li').find('div', class_='item').find('div',class_='pic').find('em').get_text() #排名
info=soup.find('div',class_='article').find('ol',class_='grid_view').find('li').find('div', class_='item').find('div',class_='info')
title=info.find('div',class_='hd').find('span',class_='title').get_text()
stars=(
info.find('div',class_='bd')
.find('div',class_='star')
.find_all('span')
)
rating_star=stars[0]['class'][0] #class属性有多个 取第0个
rating_num=stars[1].get_text()
comments=stars[3].get_text()
datas.append({
'rank':rank,
'title':title,
'rating_star':rating_star.replace('rating','').replace('-t',''), #把评分的前缀和后缀去掉
'comments':comments.replace('人评价','')
})
return datas
all_datas=[]
for i in htmls:
all_datas.extend(parse_single_html(i))
movie=pd.DataFrame(all_datas)
movie.to_excel(r'D:\movie.xlsx')