douban

import requests
from fake_useragent import UserAgent
import time
import csv
import json
import random
from argparse import ArgumentParser


PROXY_POOL = [
    'http://proxy1.example.com:8080',
    'http://proxy2.example.com:8080',
    
]

class DoubanMovieSpider:
    def __init__(self, use_proxy=False):
        self.ua = UserAgent()
        self.session = requests.Session()
        self.use_proxy = use_proxy
        self.headers = {
            'Host': 'movie.douban.com',
            'Referer': 'https://movie.douban.com/'
        }

    def get_random_header(self):
        return {
            'User-Agent': self.ua.random,
            **self.headers
        }

    def fetch_page(self, url, page):
        try:
            proxies = {'http': random.choice(PROXY_POOL)} if self.use_proxy else None
            response = self.session.get(
                url,
                headers=self.get_random_header(),
                params={'start': page * 20},
                proxies=proxies,
                timeout=10
            )
            response.raise_for_status()
            return response.json()
        except Exception as e:
            print(f'第{page}页抓取失败: {str(e)}')
            return None

    def parse_data(self, json_data):
        return [{
            'title': item['title'],
            'rating': item['rate'],
            'url': item['url'],
            'id': item['id']
        } for item in json_data.get('subjects', [])]

    def save_data(self, data, filename):
        
        with open(f'{filename}.csv', 'a', newline='', encoding='utf-8-sig') as f:
            writer = csv.DictWriter(f, fieldnames=['title', 'rating', 'url', 'id'])
            if f.tell() == 0:
                writer.writeheader()
            writer.writerows(data)
        
        
        with open(f'{filename}.json', 'a', encoding='utf-8') as f:
            for item in data:
                f.write(json.dumps(item, ensure_ascii=False) + '\n')

    def run(self, start_page=0, pages=5):
        base_url = 'https://movie.douban.com/j/search_subjects'
        for page in range(start_page, start_page + pages):
            data = self.fetch_page(base_url, page)
            if data:
                parsed_data = self.parse_data(data)
                self.save_data(parsed_data, 'douban_movies')
                print(f'成功保存第{page}页{len(parsed_data)}条数据')
            time.sleep(random.uniform(1.5, 3.5))

if __name__ == '__main__':
    parser = ArgumentParser()
    parser.add_argument('--start', type=int, default=0, help='起始页码')
    parser.add_argument('--pages', type=int, default=5, help='抓取页数')
    parser.add_argument('--proxy', action='store_true', help='启用代理')
    args = parser.parse_args()

    spider = DoubanMovieSpider(use_proxy=args.proxy)
    spider.run(start_page=args.start, pages=args.pages)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值