分享爬取豆瓣评论(多页)的思路和代码

个人思路:

先定义我的headers

= {'User-Agent':'Mozilla/5.0 (Window--------------'}(不展示全部了)

进入爬取页面后往最底下滚动发现这是一个需要翻页的评论数据,由于我选择的电影是《奥本海默》,热度比较高并且评论数较多:

通过点击第一第二页面发现界面的url

从https://movie.douban.com/subject/35593344/reviews?start=0变为

奥本海默的影评 (4659)

所以情况就变得十分简单了,我们先设置好一个分页器:

page_indexs = range(0,4000,20)

这样做的目的是爬取前200页的网页评论,接下来定义函数使用format将url分别打印出来即可

def download_all_htmls():

    htmls=[]

    for dex in page_indexs:

        url = 'https://movie.douban.com/subject/35593344/reviews?start={}'.format(dex)

        response = requests.get(url,headers=headers)

        if response.status_code == 200:

            htmls.append(url)

return htmls

此处为了避免某一个网页爬取失败所以我设置了当状态码为200正常的界面才进入htmls,最后打印发现每一个网页都是正常的

在主函数行htmls = download_all_htmls()

这样htmls列表里就有所有待爬取的url

现在我们可以先针对第一页进行需要爬取的内容的索引编辑,这样封装成函数之后再对每一个url循环以后extend到一个空列表即可

此时我们进入第一页评论网站:

我们需要定位到的评论在:div标签且class为short-content里面

我们需要定位的星级和用户名在:span标签且class标签里面,30表示三颗星,a标签里面class为name我们可以直接get_text(),星级需要进行特殊处理

下面是我进行实验的步骤,先将第一页通过requests提取text

然后使用BeautifulSoup模块提取,打印出soup的结构

我发现:

需要定位的每一条评论的内容都在div标签且class为main review-item中,那我们直接使用findall()得到返回列表值comments,再设置循环,让每一个comment来find一次上述定位位置就可以:

comments = soup.find_all('div',class_='main review-item')

for comment in comments:

    user_name = comment.find('a', class_='name').get_text()

    star = comment.find('span', class_=lambda value: value and 'allstar' in value)

    if star is not None:

        star = int(star.get('class')[0].split('r')[1])/10

    else:

        star = None

    content = comment.find('div',class_='short-content').get_text()

    datas.append({

        "星级":star,

        "用户名":user_name,

        "内容":content

    })

datas

此处user_name = comment.find('a', class_='name').get_text()是简单的提取文本,content同理,就是星级需要处理,

star = comment.find('span', class_=lambda value: value and 'allstar' in value)

我们在span标签查找有allstar字符串的内容,同时我们发现有很多用户可能没有评分,所以我们只处理有评分的,由于豆瓣网显示0-5星,但是数值为0-50,所以我们先将数字从字符串提取出来,然后除以10就得到了结果,然后我们使用定义的列表存储上述三个值,这样每一页的数据就爬取好了

然后我们将上述操作封装为一个函数

def process_one_html(html):

    datas = []

    r = requests.get(html,headers=headers)

    text=r.text

    soup = BeautifulSoup(text,'html.parser')

    comments = soup.find_all('div',class_='main review-item')

    for comment in comments:

        user_name = comment.find('a', class_='name').get_text()

        star = comment.find('span', class_=lambda value: value and 'allstar' in value)

        if star is not None:

            star = int(star.get('class')[0].split('r')[1])/10

        else:

            star = None

        content = comment.find('div',class_='short-content').get_text()

        datas.append({

            "star":star,

            "user_name":user_name,

            "content":content})

return datas

然后在主函数我们定义一个空列表后直接写一个循环:

all_datas = []

for html in htmls:

all_datas.extend(process_one_html(html))

   然后使用pandas模块进行excel存储即可:

df = pd.DataFrame(all_datas)

df.to_excel(r"C:\Users\Administrator\Desktop\python\douban.xlsx")

得到结果

### Python 爬虫 豆瓣 电影 评论 代码 示例 为了实现从豆瓣网站抓取电影评论的功能,可以利用 `requests` `BeautifulSoup` 库解析网页并提取所需数据。需要注意的是,在编写爬虫程序时应当遵循目标网站的服务条款以及robots协议。 下面是具体的Python代码示例: ```python import requests from bs4 import BeautifulSoup import csv def get_movie_reviews(movie_id, page_limit=10): base_url = f"https://movie.douban.com/subject/{movie_id}/reviews" headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36' } with open('douban_movie_reviews.csv', mode='w', newline='', encoding='utf-8') as file: writer = csv.writer(file) writer.writerow(['用户名', '评分', '有用数', '无用数', '发布时间', '评论内容']) for i in range(page_limit): url = f"{base_url}?start={i * 20}" response = requests.get(url, headers=headers) soup = BeautifulSoup(response.text, "html.parser") reviews = soup.find_all("div", class_="review-item") if not reviews: break for review in reviews: user_name = review.select_one(".name").get_text(strip=True) rating_tag = review.select_one('.main-title-rating') score = rating_tag['class'][0][-2:] if rating_tag else None useful_count = review.select_one(".useful-count").get_text(strip=True).replace('人', '') useless_count = review.select_one(".useless-count").get_text(strip=True).replace('人', '') publish_time = review.select_one(".main-meta").get_text(strip=True) content = review.select_one(".short-content").get_text(strip=True).split('显示全部')[0] writer.writerow([user_name, score, useful_count, useless_count, publish_time, content]) get_movie_reviews(26752098) # 替换为实际存在的电影ID ``` 此段脚本会创建一个新的CSV文档并将指定数量页面内的每条评论的信息写入其中[^1]。请注意修改 `movie_id` 参数为你想要抓取评论的具体影片编号,并调整 `page_limit` 来控制要抓取多少页的数据。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值