Ошибка «Объект без типа не может быть повторен» при добавлении данных JSON в списки

#python #json #web-scraping

Вопрос:

Я пытаюсь создать данные отзывов клиентов на веб-сайте от Shopee с помощью вызовов URL-адресов JSON. Однако я столкнулся с ошибкой — объект «Нетип» не может быть повторен при попытке добавить полученные данные JSON в списки. Я просмотрел связанные с этим вопросы здесь, но не смог найти решения.

Ниже приведены мои коды для получения данных отзывов клиентов:

 import re
import json
import requests
import pandas as pd


def get_ratings(shop_id, item_id):
    ratings_url = "https://shopee.sg/api/v2/item/get_ratings?filter=0amp;flag=1amp;itemid={item_id}amp;limit=20amp;offset={offset}amp;shopid={shop_id}amp;type=0"

    offset = 0
    d = {"product_id": [], "username": [], "rating": [], "comment": []}
    while True:
        data = requests.get(
            ratings_url.format(shop_id=shop_id, item_id=item_id, offset=offset)
        ).json()

        # uncomment this to print all data:
        print(json.dumps(data, indent=4))

        i = 1
        for i, rating in enumerate(data["data"]["ratings"], 1):
            d["product_id"].append(rating["itemid"])
            d["username"].append(rating["author_username"])
            d["rating"].append(rating["rating_star"])
            d["comment"].append(rating["comment"])

        if i % 20:
            break

        offset  = 20

    return d


keyword_search = "Fishball"

headers = {
    "User-Agent": "Chrome",
    "Referer": "{}search?keyword={}".format(Shopee_url, keyword_search),
}

url = "https://shopee.sg/api/v2/search_items/?by=relevancyamp;keyword={}amp;limit=100amp;newest=0amp;order=descamp;page_type=search".format(
    keyword_search
)
# can change "relevancy" to "latest": to sort by latest products instead

# Shopee API request
r = requests.get(url, headers=headers).json()

# For Products: Create lists to hold the items
p_product_id = []
p_product_name = []
p_product_price = []
p_product_soldquantity = []
p_product_rating = []

# For Reviews: Create lists to hold the items
r_product_id = []
r_customer_username = []
r_customer_rating = []
r_customer_review = []

# Populate "Products" lists
for item in r["items"]:
    p_product_id.append(item["itemid"])
    p_product_name.append(item["name"])
    p_product_price.append(item["price_min"])
    p_product_soldquantity.append(item["historical_sold"])
    p_product_rating.append(item["item_rating"]["rating_star"])

    
for item in r["items"]:

    review_item = get_ratings(item["shopid"], item["itemid"])
    r_product_id = r_product_id   review_item["product_id"]
    r_customer_username = r_customer_username   review_item["username"]
    r_customer_rating = r_customer_rating   review_item["rating"]
    r_customer_review = r_customer_review   review_item["comment"]
 

Вот фрагмент ошибки:

введите описание изображения здесь

Я должен просмотреть данные дампа JSON, чтобы выяснить источник ошибки. Такие как:

  • Проверка, являются ли значения любого из ключей(идентификатор элемента, имя автора, рейтинг, звезда, комментарий) равными нулю/Нет или»», вызывают ошибку «Нетип». Однако это не вызывает никаких ошибок и успешно добавляется в списки, как я и хотел.
  • Проверка, не отсутствует ли какой-либо из ключей, вызывает ошибку «Нетип». Однако это просто приведет к другой ошибке, в которой будет указано, что конкретный ключ не объявлен.

Отредактировано для @flakes: Ниже приведен образец дампа JSON. Однако фактические данные дампа намного больше. Таким образом, ошибка может отсутствовать в этом примере кода:

 {
    "data": {
        "ratings": [],
        "item_rating_summary": {
            "rating_total": 0,
            "rating_count": [
                0,
                0,
                0,
                0,
                0
            ],
            "rcount_with_context": 0,
            "rcount_with_image": 0,
            "rcount_with_media": 0,
            "rcount_local_review": 0,
            "rcount_repeat_purchase": 0
        },
        "is_sip_item": false,
        "rcmd_algo": "ABTEST:2.a.312@AD12"
    },
    "error": 0,
    "error_msg": null
}
{
    "data": {
        "ratings": [
            {
                "orderid": 49169039164703,
                "itemid": 6342546681,
                "cmtid": 2760023244,
                "ctime": 1596074706,
                "rating": 1,
                "userid": 269495210,
                "shopid": 233683003,
                "comment": "Some items didnu2019t received, and ask for refund on Shopee system, and Shopee ask for return all the items to Shopee(excuse me! Fresh items wow).....This make me crazy. Finally, seller have solved this problem and I got the refund already. Seller also reply slowly. Iu2019m so disappointed with Shopee ",
                "rating_star": 4,
                "status": 1,
                "mtime": 1596074706,
                "editable": 0,
                "opt": 2,
                "filter": 7,
                "mentioned": [],
                "is_hidden": false,
                "author_username": "kgamdr9qx6",
                "author_portrait": "",
                "author_shopid": 269491453,
                "anonymous": false,
                "images": [
                    "a19dfc8f10afe789b586ed934f902adc"
                ],
                "videos": [
                    {
                        "id": "sg_132892ff-a252-4505-ad1b-94ecf8cf4693_000046",
                        "cover": "https://play-ws.vod.shopee.com/c4/98934353/10321063012/YzQsMTI0LTE2NzMyLDE0MTAwODg1NTg2NzI0NDU0NDAsMw.jpg",
                        "url": "https://play-ws.vod.shopee.com/c4/98934353/10321063012/YzQsMTI0LTE2NzMyLDE0MTAwODkwMTc0Nzg5NzEzOTIsMw.mp4",
                        "duration": 7106,
                        "upload_time": null
                    }
                ],
                "product_items": [
                    {
                        "itemid": 6342546681,
                        "shopid": 233683003,
                        "name": "BoBo Cooked Fishball 500g",
                        "image": "55156d13a9cda32c12d9a170196b219a",
                        "is_snapshot": 1,
                        "snapshotid": 1957356912,
                        "modelid": 40318347777,
                        "model_name": ""
                    }
                ],
                "delete_reason": null,
                "delete_operator": null,
                "ItemRatingReply": null,
                "tags": null,
                "editable_date": null,
                "show_reply": null,
                "like_count": null,
                "liked": null,
                "sync_to_social": false,
                "detailed_rating": null,
                "exclude_scoring_due_low_logistic": false,
                "loyalty_info": null,
                "template_tags": [],
                "has_template_tag": false,
                "sync_to_social_toggle": null,
                "sip_info": {
                    "is_oversea": false,
                    "origin_region": "sg"
                },
                "is_repeated_purchase": false
            },
            {
                "orderid": 76164426633592,
                "itemid": 6342546681,
                "cmtid": 4977003708,
                "ctime": 1622799587,
                "rating": 1,
                "userid": 193560584,
                "shopid": 233683003,
                "comment": "",
                "rating_star": 5,
                "status": 1,
                "mtime": 1622799587,
                "editable": 0,
                "opt": 2,
                "filter": 0,
                "mentioned": [],
                "is_hidden": false,
                "author_username": "fynahros",
                "author_portrait": "",
                "author_shopid": 193557725,
                "anonymous": false,
                "images": null,
                "videos": [],
                "product_items": [
                    {
                        "itemid": 6342546681,
                        "shopid": 233683003,
                        "name": "BoBo Cooked Fishball 500g",
                        "image": "11e161f9dbea1be563bff914beedfed8",
                        "is_snapshot": 1,
                        "snapshotid": 2373175027,
                        "modelid": 40318347777,
                        "model_name": ""
                    }
                ],
                "delete_reason": null,
                "delete_operator": null,
                "ItemRatingReply": null,
                "tags": null,
                "editable_date": null,
                "show_reply": null,
                "like_count": null,
                "liked": null,
                "sync_to_social": false,
                "detailed_rating": null,
                "exclude_scoring_due_low_logistic": false,
                "loyalty_info": null,
                "template_tags": [],
                "has_template_tag": false,
                "sync_to_social_toggle": null,
                "sip_info": {
                    "is_oversea": false,
                    "origin_region": "sg"
                },
                "is_repeated_purchase": false
            },
            {
                "orderid": 50027730227101,
                "itemid": 6342546681,
                "cmtid": 2779109484,
                "ctime": 1596443125,
                "rating": 1,
                "userid": 67658682,
                "shopid": 233683003,
                "comment": "",
                "rating_star": 5,
                "status": 1,
                "mtime": 1596443125,
                "editable": 0,
                "opt": 2,
                "filter": 0,
                "mentioned": [],
                "is_hidden": false,
                "author_username": "lynn1967",
                "author_portrait": "",
                "author_shopid": 67657225,
                "anonymous": false,
                "images": null,
                "videos": [],
                "product_items": [
                    {
                        "itemid": 6342546681,
                        "shopid": 233683003,
                        "name": "BoBo Cooked Fishball 500g",
                        "image": "55156d13a9cda32c12d9a170196b219a",
                        "is_snapshot": 1,
                        "snapshotid": 1957356912,
                        "modelid": 40318347777,
                        "model_name": ""
                    }
                ],
                "delete_reason": null,
                "delete_operator": null,
                "ItemRatingReply": null,
                "tags": null,
                "editable_date": null,
                "show_reply": null,
                "like_count": null,
                "liked": null,
                "sync_to_social": false,
                "detailed_rating": null,
                "exclude_scoring_due_low_logistic": false,
                "loyalty_info": null,
                "template_tags": [],
                "has_template_tag": false,
                "sync_to_social_toggle": null,
                "sip_info": {
                    "is_oversea": false,
                    "origin_region": "sg"
                },
                "is_repeated_purchase": false
            }
        ],
        "item_rating_summary": {
            "rating_total": 17,
            "rating_count": [
                0,
                0,
                0,
                1,
                16
            ],
            "rcount_with_context": 11,
            "rcount_with_image": 11,
            "rcount_with_media": 11,
            "rcount_local_review": 0,
            "rcount_repeat_purchase": 0
        },
        "is_sip_item": false,
        "rcmd_algo": "ABTEST:2.a.312@AD12"
    },
    "error": 0,
    "error_msg": null
}
     
 

Отредактировано для @tdelaney: Я обнаружил, что ключ «рейтинг» в последнем словаре имеет значение «null» :

 {
    "data": {
        "ratings": null,
        "item_rating_summary": {
            "rating_total": 0,
            "rating_count": [
                0,
                0,
                0,
                0,
                0
            ],
            "rcount_with_context": 0,
            "rcount_with_image": 0,
            "rcount_with_media": 0,
            "rcount_local_review": 0,
            "rcount_repeat_purchase": 0
        },
        "is_sip_item": false,
        "rcmd_algo": "ABTEST:2.a.312@AD12"
    },
    "error": 0,
    "error_msg": null
}
 

Комментарии:

1. Ошибка означает , что data['data']['ratings'] это None не список.

2. «Я хотел вставить образец дампа JSON, но не смог, так как разумный образец все равно будет слишком длинным, чтобы вставить его сюда». Вы всегда можете удалить части json, чтобы показать нам общую структуру. Без этого невозможно будет точно диагностировать проблему.

3. Сразу бросается в глаза то, что после получения нет теста на ошибки. Проверьте код состояния. Как раз перед тем for , print(type(data)); print(type(data["data"])); print(type(data["data"]["ratings"])) . Посмотрите, что такое нетип и что вызывает ошибку.

4. Вы можете открыть json в текстовом редакторе и выполнить поиск null .

5. Не могли бы вы предоставить один действительный URI (включая item_id offset и shop_id ), чтобы можно было увидеть возвращенный json?