首先明确我们所需要的爬虫的对象
豆瓣电影 Top 250
由于豆瓣TOP250页面的分页方式是每页25所以我们需要爬取10个页面的数据。
然后右键打开检查:
我们所需要的数据全部在 ol class中。
import requests
from bs4 import BeautifulSoup
import pprint
import json
import pandas as pd
首先导入以下四个库
page_indexs =range(0,250,25)
#运用range方法构造下载十个页面的HTML所需列表
def download_all_htmls():
htmls =[]
for idx in page_indexs:
ur1=f"https://movie.douban.com/top250?start={idx}&filter="
print("craw html:", ur1)
r=requests.get(ur1,headers={'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) ''AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36'
})
htmls.append(r.text)
return htmls
爬取10个页面的HTML其中用idx来表示start里面的数字,
htmls = download_all_htmls()
执行爬取
htmls[0]
返回所得到的HTML
def parse_single_html(html):
soup = BeautifulSoup(html,'html.parser')
article_items = soup.find("ol",class_="grid_view").find_all("div",class_="item")
datas =[]
#存储到data之中
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"))
#由于stars有多个所以采用find_all
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
parse_single_html(htmls[0])
#将所爬取的内容打印出来
此所代表的第一页的内容
all_datas = []
for html in htmls:
all_datas.extend(parse_single_html(html))
将所有页面内容全部呈现
df=pd.DataFrame(all_datas)
df.to_excel("豆瓣电影top250.xlsx")
最后将所爬取的数据导入到Excel文件中