豆瓣热门电视剧爬取(电影类似)

一、url地址

利用chrome打开豆瓣,电视剧下刷新,打开开发者模式的nettwork,可以看到如下图,本页所有的数据都在这个请求响应下,,打开response,看到它的url地址是
https://movie.douban.com/j/search_subjects?type=tv&tag=%E7%83%AD%E9%97%A8&sort=recommend&page_limit=20&page_start=0
经过翻页看到每一页20条数据,下一页的地址和上一页url地址最后一位数字不同,因此规律就找到了。在这里插入图片描述

二、代码

import requests
from headers import agent
import json
from lxml import etree,html
import re


class DouBan:
    def __init__(self):
        self.url="https://movie.douban.com/j/search_subjects?type=tv&tag=%E7%83%AD%E9%97%A8&sort=recommend&page_limit=20&page_start="


    def  get_Json(self,url):#发送请求,这里的headers是我自己封装的的随机的headers,需要你自己更换
        
        return(requests.get(url,headers=agent()).content.decode())
    
    def dealUrl(self,html):
        data=json.loads(html)
        for i in  data.values():
            url=[ j.pop("url")   for j  in i]
        return url
        

    def get_Movie_Data(self,movie_url):
        return(requests.get(movie_url,headers=agent()).content.decode())


    def moviedata_draw(self,movie_data,movie_url):
        data={}
        content=etree.HTML(movie_data)
        title=content.xpath("//body//h1//span[1]/text()")
        score=content.xpath("//strong[@class='ll rating_num']/text()")
        director=content.xpath("//body/div[@id='wrapper']/div[@id='content']/div/div/div/div/div/div[@id='info']/span[2]/span[2]/a/text()")
        actions=content.xpath('//span[@class="actor"]//a/text()')
        Movie_type=content.xpath("//body/div[@id='wrapper']/div[@id='content']/div/div/div/div/div/div[@id='info']/span[@property='v:genre']/text()")[0]
        #country=content.xpath("//span[contains(text(),'2020-05-04(')]/text()")[0]
        data=data={"电影名":title,
                "评分":score,
                "地址":movie_url,
                "导演":director,
                "演员":actions,
                "电影类型":Movie_type
                }
        with open ("豆瓣电影.txt","a+",encoding="utf-8")  as f:
            f.write(str(data)+"\n")
    def next_pageurl(self):#这里我们先预设有两千条数据
        return [self.url+str(i*20) for  i  in range(100)]
        

    def run(self):
        url_list=self.next_pageurl()
        for url in url_list:
            print(url)
            #1、发送请求获取JSON页面信息
            html=self.get_Json(url)
            print(html)
            #2、每一页的页面url提取
            movie_url=self.dealUrl(html)
            print(movie_url)
            for url in movie_url:
                movie_data=self.get_Movie_Data(url)
                self.moviedata_draw(movie_data,url)
        
if __name__=="__main__":
    douban=DouBan()
    douban.run()

三、结果

数据比较多,因此中途终止了程序的执行。
在这里插入图片描述

在这里插入图片描述

四、不足

问题:结束判断没有添加
解决:如果我们提取的页面数据,url列表长度小于20,就说明达到了最后一页。因此可以添加一个if判断语句。

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐