import requests
from bs4 import BeautifulSoup
import pandas as pd
(该段为导入包)
page_indexs = range(0, 250, 25)
(构造分页数字列表,爬取的网页共有10页,每页的差别是25,所以生成10个从0开始,间隔25的数,以方便后面引用)
def download_all_htmls():
"""
下载所有列表页面的HTML,用于后续的分析
"""
htmls = []
for idx in page_indexs:
url = f"https://movie.douban.com/top250?start={idx}&filter="
print("craw html:", url)
r = requests.get(url,
headers={"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko)"})
if r.status_code != 200:
raise Exception("error")
htmls.append(r.text)
return htmls
(爬取函数)
htmls = download_all_htmls()
(执行爬取)
htmls[0]
(查看结果)
def parse_single_html(html):
( """
解析单个HTML,得到数据
@return list({"link", "title", [label]})
""")
soup = BeautifulSoup(html, 'html.parser')
article_items = (
soup.find("div", class_="article")
.find("ol", class_="grid_view")
.find_all("div", class_="item")
)
datas = []
for article_item in article_items:
rank = article_item.find("div", class_="pic").find("em").get_text()
info = article_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]
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",""),
"rating_num":rating_num,
"comments":comments.replace("人评价", "")
})
return datas
import pprint
pprint.pprint(parse_single_html(htmls[0]))
(引用包)
all_datas = []
for html in htmls:
all_datas.extend(parse_single_html(html))
(执行所有的HTML页面的解析)
all_datas
(爬取十个页面的数据)
df = pd.DataFrame(all_datas)
(将数据存在DataFrame中)
df.to_excel("豆瓣电影TOP250.xlsx")
(输出在Excel中)