python实现豆瓣网Json数据爬取

相信大家一上手,就是对豆瓣的各种爬,但json数据是个例外,求职网也都是json数据,可爬

爬取这个页面的内容,按年份爬取

选电影 (douban.com)

这里演示的是爬取https://m.douban.com/rexxar/api/v2/movie/recommend/filter_tags?selected_categories=%7B%7D

直接点进去,相信大家看到的是这样

而不是这种

二手瓜子网的json数据

这里大家区别以下

1.爬虫的万能第一步:请求头

class Spider:
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36 Edg/119.0.0.0',
        'Referer': 'https://movie.douban.com/explore'
    }

2.请求json数据,遍历年份

遍历年份,进行定位,按年份执行detail_parse函数爬取每个电影链接的内容,save_csv函数保存至文件

    def index(self):
        url = 'https://m.douban.com/rexxar/api/v2/movie/recommend/filter_tags?selected_categories=%7B%7D'
        html = requests.get(url=url, headers=self.headers).json()
        tags = html.get('tags')[0].get('tags')
        for tags in tags[2:]:
            movie_id = 0
            all_data = []
            for i in range(5):
                parse_url = f'https://m.douban.com/rexxar/api/v2/movie/recommend?refresh=0&start={i * 20}&count=20&selected_categories=%7B%7D&uncollect=false&tags={tags}'
                tags_html = requests.get(url=parse_url, headers=self.headers).json()
                for i in tags_html['items']:
                    movie_id += 1
                    uri = i['uri'].split('douban.com/')[-1]
                    detail_url = 'https://www.douban.com/doubanapp/dispatch?uri=' + uri
                    self.detail_parse(detail_url, all_data, movie_id)
                    self.save_csv(tags, all_data)

3.detail_pare函数实现每个电影的内容爬取

拿到每个电影的网址请求,转beautifulsoup对象,获取内容后顺便使用fill_full函数pipei函数对数据进行清理

    def detail_parse(self, detail_url, all_data, movie_id):
        self.random_sleep()
        html = requests.get(url=detail_url, headers=self.headers).content
        html = BeautifulSoup(html, 'lxml')
        movies_name = html.select_one('#content > h1 > span:nth-child(1)').text

        region_language = html.select_one('#info').get_text()
        region_language = region_language.split('\n')

        director, editor, actor, movie_type, region, language, on_time, duration = self.pipei(region_language[1:])
        year = on_time.split('-')[0]
        score = html.select_one('#interest_sectl > div.rating_wrap.clearbox > div.rating_self.clearfix > strong').text
        # 空值处理
        element = html.select_one(
            '#interest_sectl > div.rating_wrap.clearbox > div.rating_self.clearfix > div > div.rating_sum > a > span')
        comments = element.text if element is not None else ''

        five_star, four_star, three_star, two_star, one_star = self.fill_null(
            html.select('#interest_sectl > div.rating_wrap.clearbox > div.ratings-on-weight > div'))

        all_data.append(
            [movie_id, movies_name, year, director, editor, actor, movie_type, region, language, on_time, duration,
             score, comments, five_star, four_star, three_star, two_star, one_star])
        return all_data

 4.空值处理 

通过爬取的数据观察,每个电影都有一到五星的评分,有的会有缺失,经过空值处理

    def fill_null(self, isNull):
        col = []
        try:
            for i in range(5):
                element = isNull[i].select_one('div > span.rating_per')
                col.append(element.text if element is not None else '')
            return col
        except:
            return ['', '', '', '', '']

5.取出所需要字段

    def pipei(self, columns):
        temp_col, info = ['导演', '编剧', '主演', '类型', '制片国家/地区', '语言', '上映日期', '片长'], []
        temp = dict(zip([i.split(':')[0].replace(' ', '') for i in columns],
                        [i.split(':')[-1].replace(' ', '') for i in columns]))
        for col in temp_col:
            info.append(temp.get(col, ""))
        return info

6.保存至csv文件

    def save_csv(self, tags, all_data):
        with open(f'./FilmCrawl/{tags}.csv', 'w', newline='', encoding='utf-8') as fp:
            csv_write = csv.writer(fp)
            csv_write.writerow(
                ['movie_id', 'movies_name', 'year', 'director', 'editor', 'actor', 'movie_type', 'region', 'language',
                 'on_time', 'duration', 'score', 'comments', 'five_star', 'four_star', 'three_star', 'two_star',
                 'one_star'])
            for row in all_data:
                csv_write.writerow(row)

7.随机休眠

每次请求随机休眠,防止被认定人机

    def random_sleep(self):
        sleep_time = random.uniform(1, 5)
        time.sleep(sleep_time)

8.调用整个函数

if __name__ == '__main__':
    if not os.path.exists('./FilmCrawl'):
        os.mkdir('./FilmCrawl')
    spider = Spider()
    spider.index()

  • 14
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
好的,这是一个比较常见的爬虫任务,我可以提供一些思路和代码示例。 首先,我们需要找到豆瓣图书评论的数据来源。通过分析豆瓣图书页面的源代码,可以发现每本图书的评论都是通过 AJAX 请求获取的,请求的 URL 格式为: ``` https://book.douban.com/subject/{book_id}/comments/hot?p={page_num} ``` 其中,`{book_id}` 是豆瓣图书的 ID,`{page_num}` 是评论的页数。每页显示 20 条评论。 接下来,我们可以使用 Python 的 requests 库发送 HTTP 请求,获取评论数据。具体代码如下: ```python import requests import json # 豆瓣图书 ID book_id = '1084336' # 评论页数 page_num = 1 # 构造请求 URL url = f'https://book.douban.com/subject/{book_id}/comments/hot?p={page_num}' # 发送请求,获取响应内容 response = requests.get(url) content = response.content.decode('utf-8') # 解析 JSON 数据 data = json.loads(content) # 打印评论内容 for comment in data['comments']: print(comment['content']) ``` 上面的代码中,我们先构造了请求 URL,然后使用 requests 库发送 GET 请求,并将响应内容解析为 JSON 格式。最后,我们可以打印每条评论的内容。 需要注意的是,豆瓣网站有反爬虫机制,如果请求过于频繁,可能会被封 IP。因此,在实际爬取时需要加入一些延时和随机性,以避免被封。另外,豆瓣的评论数据也可能存在版权和隐私等问题,需要谨慎使用。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

邶风学爬虫

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

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

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

打赏作者

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

抵扣说明:

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

余额充值