Python---爬虫学习1

2024-01-09 15:29:09
import requests
import time
from bs4 import BeautifulSoup
import pandas as pd


def get_film(link, headers):
    # 定义一个get_film的函数,接受两个参数:link和headers。link是电影信息的URL,headers是一个字典,包含了发送HTTP请求时需要使用的HTTP头信息
    res = requests.get(link, headers=headers)
    # 使用requests.get()方法发送一个GET请求到给定的链接,并传入之前定义的headers参数。请求的结果被存储在变量res中。
    soup = BeautifulSoup(res.text, 'html.parser')

    # 使用BeautifulSoup库来解析从上一步获取的HTML内容。它把HTML内容(存储在res.text中)作为第一个参数,并指定使用'html.parser'作为解析器。
    # 解析后的HTML页面被存储在变量soup中。
    movies = []
    # 初始化一个空列表,用于存储从HTML页面中提取的电影信息。
    items = soup.select('div.item')
    for item in items:
        # 这一行开始一个循环,遍历在步骤5中找到的所有元素。
        movie_info = {}
        # 在循环内部,创建一个空字典,用于存储当前电影的信息。
        title_element = item.find('span', class_='title')
        if title_element:
            full_title = title_element.get_text(strip=True)
            titles = full_title.split('/')
            movie_info['Chinese_name'] = titles[0].strip()
            if len(titles) > 1:
                # 检查列表的长度是否大于1,即是否存在多个名称。
                movie_info['Foreign_name'] = titles[1].strip()
            else:
                movie_info['Foreign_name'] = ''
        else:
            movie_info['Chinese_name'] = ''
            movie_info['Foreign_name'] = ''


        img_tag = item.find('img')
        movie_info['Image_link'] = requests.compat.urljoin(link, img_tag['src']) if img_tag else ""
        # 从当前item元素中提取图片的链接,并将其存储在字典movie_info的键“Image_link”下

        rating_num = item.find('span', class_='rating_num').get_text(strip=True) if item.find('span',
                                                                                              class_='rating_num') else ""
        # 从HTML页面中的特定元素中提取电影的评分数字。如果该元素中没有评分数字,则返回空字符串。
        movie_info['Rating'] = rating_num

        reviews_count = item.find('div', class_='star').find_all('span')[-1]
        movie_info['Reviews'] = reviews_count.get_text(strip=True).replace('人评价', '') if reviews_count else ""
        # 从HTML页面中的特定元素中提取电影的评论数量。如果该元素中没有评论数量,则返回空字符串。

        summary = item.find('p').get_text(strip=True) if item.find('p') else ""
        movie_info['Summary'] = summary
        # 从HTML页面中的特定元素中提取电影的摘要,并将摘要存储在字典中。如果该元素中没有摘要,则对应的值将为空字符串。
        movies.append(movie_info)

    return movies


def save_movies_to_excel(movies, path='test01.xlsx'):
    df = pd.DataFrame(movies)
    df.to_excel(path, index=False)
    # 将一个给定的数据结构(可能是电影信息的列表或字典)转换为pandas DataFrame,并将其保存到一个Excel文件中。


headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) '
                  'Chrome/96.0.4664.45 Safari/537.36 '
}
all_movies = []
# 配置了一个HTTP请求头(模仿了一个特定的浏览器),并创建了一个空的列表
base_url = 'https://movie.douban.com/top250?start={}&filter='
links = [base_url.format(i * 25) for i in range(10)]
# links列表中每个元素都是一个字符串,表示一个完整的url

for link in links:
    all_movies.extend(get_film(link, headers))
    time.sleep(1)
# 从links列表中的每个URL获取电影数据,并将这些数据添加到all_movies列表中。在每次循环迭代之间,程序会暂停1秒以避免发送过于频繁的请求。
save_movies_to_excel(all_movies)

文章来源:https://blog.csdn.net/m0_75089299/article/details/135480847
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。