爬取豆瓣电影数据

爬取豆瓣电影数据

注意:运行代码,可能会被IP封禁。
通过百度AI(文心一言)询问的豆瓣封禁IP规则是:
白天不能超过40
晚上不能超过60
在这里插入图片描述

遵守法律,不要影响网站正常运行!!!

简介

本人刚开始接触爬虫,写的第一个程序,代码不是很完善,可能有点臃肿。可以拷贝下来自行修改。

  1. 分析结构和请求
    昨晚在尝试解析https://movie.douban.com页面信息的时候看了一下请求。发现有一个请求返回的结果就是电影的基本信息。
    在这里插入图片描述
  2. 解析内容
    通过获取下来的json格式的内容,拿到了电影名、电影简介地址、电影图片地址信息。

代码

运行前需要检查是否安装了requestsparsel

import requests
from parsel import Selector
import json


# 请求的电影信息
base_url = 'https://movie.douban.com/j/search_subjects?type=movie&tag=%E7%83%AD%E9%97%A8&page_limit=50&page_start=0'
headers = {
    'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) '
                  'Chrome/122.0.0.0 Safari/537.36'
}

保存信息

def save_img(filename, movie_img):
    """
    保存电影图片信息
    :param filename: 文件名
    :param movie_img: 图片路径
    :return: None
    """
    # 请求出图片用content的获取二进制
    content_bytes = requests.get(movie_img).content
    with open(filename, 'wb') as file:
        # 通过二进制保存
        file.write(content_bytes)

调整参数

更换URL中的tagpage_limit信息可以调整获取的内容
在这里插入图片描述

完整代码

import requests
from parsel import Selector
import json


# 请求的电影信息
base_url = 'https://movie.douban.com/j/search_subjects?type=movie&tag=%E7%83%AD%E9%97%A8&page_limit=50&page_start=0'
headers = {
    'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) '
                  'Chrome/122.0.0.0 Safari/537.36'
}


def return_content(url):
    """
    此函数可能多余了!!
    :param url: 请求的地址
    :return:
    """
    response = requests.get(url, headers=headers)
    return response.text


def inner_link(text):
    movies = json.loads(text)['subjects']
    for movie in movies:
        title = movie['title']  # 获取标题
        movie_url = movie['url']  # 获取电影链接
        movie_img = movie['cover']  # 获取电影图片
        # movie_rate = movie['rate']  # 获取电影评分
        print(f'获取电影《{title}》...')
        print(f'电影简介地址: {movie_url}')
        current_text = return_content(movie_url)
        get_movie_info(current_text)
        print(f'开始保存《{title}》图片...')
        save_img(title + '.jpg', movie_img)
        print(f'保存成功!!《{title}》')
        print('=' * 150)


def save_img(filename, movie_img):
    """
    保存电影图片信息
    :param filename: 文件名
    :param movie_img: 图片路径
    :return: None
    """
    # 请求出图片用content的获取二进制
    content_bytes = requests.get(movie_img).content
    with open(filename, 'wb') as file:
        # 通过二进制保存
        file.write(content_bytes)


def get_movie_info(text):
    """
    抓取信息
    :param text: 获取当前URL的文本内容
    :return:
    """
    selector = Selector(text=text)
    item = selector.css('#info')
    with open('movies.txt', 'a') as file:
        file.write('\n')

        direct = item.css('span:nth-child(1)').xpath('//span[contains(@class,"attrs")]//text()').get()  # 导演
        file.write('导演: ' + direct)
        file.write('\n')

        writer = item.css('span:nth-child(2) > a::text').get()  # 编剧
        file.write('编剧: ' + writer)
        file.write('\n')

        actors = item.css('span.actor a::text').getall()[:5]  # 主演
        file.write('主演: ')
        for actor in actors:
            file.write(actor + ' / ')
        file.write('\n')

        types = item.xpath('//span[contains(@property, "v:genre")]/text()').getall()
        file.write('类型:')
        for _ in types:
            file.write(_ + ' / ')
        file.write('\n')

        infos = selector.xpath('//div[contains(@class, "indent") and contains(@id, "link-report-intra")]/span/text()').getall()
        file.write('简介:\n')
        for info in infos:
            file.write(info.strip() + '\n')
        file.write('\n' + ('=' * 50))


if __name__ == '__main__':
    content = return_content(base_url)
    inner_link(content)

  • 14
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

爬虫探索者

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值