爬虫:豆瓣热门所有电视剧爬取

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

一、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判断语句。

  • 5
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值