当前位置:   article > 正文

爬取豆瓣电视信息

爬取豆瓣电视信息

开始系统学习爬虫,试着写写爬虫的流程

爬取的是手机版的豆瓣的电视剧信息

链接:https://m.douban.com/tv/american

取到相关参数

要取到返回的 json 数据,我们需要先找到对应的 url 地址

在这里插入图片描述

经过分析发现信息由这条连接发起的请求

# 具体 url
https://m.douban.com/rexxar/api/v2/subject_collection/filter_tv_american_hot/items?os=android&for_mobile=1&callback=jsonp2&start=0&count=18&loc_id=108288&_=0

# 测试去掉无用的参数,得到 url
https://m.douban.com/rexxar/api/v2/subject_collection/filter_tv_american_hot/items?start=0&count=18&loc_id=108288
  • 1
  • 2
  • 3
  • 4
  • 5

在这里插入图片描述

在这里插入图片描述

将 Referer 和 User-Agent 复制出来,保存到 headers 中

Referer:告诉服务器当前请求是从哪个链接请求过来的

User-Agent:作用是伪装成浏览器

在这里插入图片描述

取到下一页的链接

发现页面时动态加载,为了方便取到所有的页数链接,可以根据链接中的关键字进行搜索,来进行链接过滤

并且发现每次请求的链接只有 start 参数的数值不一样,从 0 开始,每次加 18,应该是每页显示的数量,找到总数量就可以取到总页数来进行 url 拼接

在这里插入图片描述

发现总数量 total 就在返回的数据中

在这里插入图片描述


编写代码

代码编写分为两个步骤:

第一步:先发送一次请求,取到总数量,

第二步:通过总数量取出有多少页,并拼接出一个 url 列表,遍历得到每个 url ,发送请求,取到数据,并保存

在 run 方法中只写流程,将具体实现分割成一个个的函数

在这里插入图片描述

第一次请求

创建一个类,在初始化方法中存入 url 和 headers

class Douban:
    def __init__(self):
        self.url_temp = "https://m.douban.com/rexxar/api/v2/subject_collection/filter_tv_american_hot/items?start={}&count=18&loc_id=108288"

        self.headers = {
            "Referer": "https://m.douban.com/tv/american",
            "User-Agent": "Mozilla/5.0 (Linux; Android 5.0; SM-G900P Build/LRX21T) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3608.4 Mobile Safari/537.36"
        }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

发送请求,GET 请求 返回响应回来的 json 字符串

def parse_get_url(self, url):
    resp = requests.get(url=url, headers=self.headers)
    return resp.content.decode()
  • 1
  • 2
  • 3

取到总页数 将上一步取到的 json 字符串使用 json.loads() 方法转换成 python 数据类型

def get_total(self, json_str):
    ret_dict = json.loads(json_str)
    return ret_dict['total']
  • 1
  • 2
  • 3

保存总页数,保存第一页的数据

保存到文件的时候先转换成 python 数据类型,使用 json.dumps() 将数据存成 json 数据

json.dumps() 的两个参数:

ensure_ascii=False: 实现让中文写入的时候保持为中文

indent=2: 实现换行和空格

def get_data(self, json_str):
    ret = json.loads(json_str)
    return ret

def save_douban_data(self, ret, count):
    print("正在保存第 {} 页".format(count))
    with open('doubantv/tv_{}.txt'.format(count), 'w', encoding='utf-8') as f:
        f.write(json.dumps(ret, ensure_ascii=False, indent=2))
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

请求其他数据

根据 total 求出页数,拼接 url

def get_url(self, total):
    # 总页数
    total_page = total // 18 if total % 18 == 0 else total // 18 + 1
    url_list = [self.url_temp.format(i * 18) for i in range(1, total_page)]
    return url_list
  • 1
  • 2
  • 3
  • 4
  • 5

遍历 url_list ,取到每个 url,调用前面的方法发起请求并保存数据

# 取出每个 url
for url in url_list:
    # 获取每个响应数据
    json_str = self.parse_get_url(url)
    # 获取详情数据
    ret = self.get_data(json_str)
    # 保存数据
    self.save_douban_data(ret, url_list.index(url) + 1)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

数据爬取完毕,保存的比较粗糙,整体进行保存,没有进行过滤

完整代码已上传 GitHub

豆瓣电视数据爬虫

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家小花儿/article/detail/686977
推荐阅读
相关标签
  

闽ICP备14008679号