爬取豆瓣电视剧数据

在网页上找到手机版返回的数据

  1. 豆瓣手机版电视网址
  2. 找到返回数据的文件
    爬取豆瓣电视剧数据_第1张图片
  3. 找到返回数据的网址
    爬取豆瓣电视剧数据_第2张图片
  4. 在每页返回数据的网址中找到网址的的规律
    爬取豆瓣电视剧数据_第3张图片

爬取豆瓣电视剧数据_第4张图片
爬取豆瓣电视剧数据_第5张图片
在这里找出规律,起始的start为0然后每页和每页间隔18,在下面的中发现数据total应该代表的数据的条数
爬取豆瓣电视剧数据_第6张图片

编写爬虫代码

  1. 在编写前查看url得知是否可以优化

    https://m.douban.com/rexxar/api/v2/subject_collection/tv_american/items?os=ios&for_mobile=1&callback=jsonp1&start=0&count=18&loc_id=108288&_=0
    

    最后优化成:start位置的值预留出来可以使用.format来进行匹配

    https://m.douban.com/rexxar/api/v2/subject_collection/tv_american/items?start={}&count=18
    
  2. 在直接用浏览器打开的网址的时候出现只有这写数据:

    {"msg": "invalid_request_1284", "code": 1287, "request": "GET \/rexxar\/v2\/subject_collection\/tv_american\/items", "localized_message": ""}
    

    爬取豆瓣电视剧数据_第7张图片
    原因是:因为豆瓣使用的反爬虫的原因,防止别人抓取数据,解决方法是

    • 要在headers中加上Referer: https://m.douban.com/tv/american这个内容,只有user-agent是不行的,就会爬取不到数据
      爬取豆瓣电视剧数据_第8张图片
  3. 代码如下:

    # coding=utf-8
    import requests
    import json
    
    
    class DoubanSpider():
        """豆瓣爬虫"""
    
        def __init__(self):
            self.url_temp_list = [
                {
                    "url_temp": "https://m.douban.com/rexxar/api/v2/subject_collection/tv_american/items?start={}&count=18",
                    "country": "UK"
                },
                {
                    "url_temp": "https://m.douban.com/rexxar/api/v2/subject_collection/tv_domestic/items?start={}&count=18",
                    "country": "CN"
                }
            ]
            self.headers = {"Referer": "https://m.douban.com/tv/american",
                            "User-Agent": "Mozilla/5.0 (iPhone; CPU iPhone OS 13_2_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0.3 Mobile/15E148 Safari/604.1"}
    
        def parse_url(self, url):
            # 获取数据
            print(url)
            response = requests.get(url, headers=self.headers)
            return response.content.decode()
    
        def get_content_list(self, json_str):
            # 提取数据
            dict_ret = json.loads(json_str)
            content_list = dict_ret["subject_collection_items"]
            total = dict_ret["total"]
            return content_list, total
    
        def save_content_list(self, count_list,country):
            # 储存数据
            with open("file/douban_tv.txt", "a", encoding='utf-8') as f:
                for count in count_list:
                    count["country"]=country
                    f.write(json.dumps(count, ensure_ascii=False))
                    f.write("\n")
            print("数据保存成功")
    
        def run(self):
            """主要逻辑的实现"""
            for url_temp in self.url_temp_list:
                num = 0
                total = 100
                while num < total + 18:
                    # 1. start_url
                    url = url_temp["url_temp"].format(num)
                    # 2. 获取数据
                    json_str = self.parse_url(url)
                    # 3. 提取数据
                    content_list, total = self.get_content_list(json_str)
                    # 4. 保存数据
                    self.save_content_list(content_list,url_temp["country"])
                    # if len(count_list)<18:
                    #     break
                    # 5. 创建下一个url
                    num += 18
    
    
    if __name__ == '__main__':
        douban = DoubanSpider()
        douban.run()
    
    
  4. 爬取数据的结果:
    爬取豆瓣电视剧数据_第9张图片

你可能感兴趣的:(python,#,爬虫,python,url,爬虫)