Saat ini saya mencoba menggunakan API dan header situs web alih-alih membuat scraper web. Saya telah mencoba memeriksa situs web dengan menggunakan Chrome Dev Tools dan menangkap informasi di bawah tab network ketika permintaan POST telah dibuat.

Sejauh ini saya tidak beruntung dan hanya mendapatkan <Response [200]> dari titik akhir tetapi tidak ada data yang dikembalikan.

Tolong beri tahu apa yang saya lakukan salah.

Di bawah ini adalah kode Python saya:

    import requests

    def get_data_from_api():
    search_keyword = 'money'
    api_endpoint = 'https://45bwzj1sgc-dsn.algolia.net/1/indexes/*/queries?x-algolia-agent=Algolia%20for%20JavaScript%20(4.2.0)%3B%20Browser'
    payload = {
        'x-xxxx-application-id': '45BWZJ1SGC', 
        'x-xxx-api-key': 'MTRkMGNlOGFhMWQ4YThmZDA0YmViNGY2M2ViYzBlMGMwNTBmMjllNjJmMDA4YmY1YzY3YzI2NzRmMzlhYThkM3RhZ0ZpbHRlcnM9JTVCJTVCJTIyc3VzX3B1YmxpYyUyMiUyQyUyMnN1c19jaGFubmVsX2FsbCUyMiUyQyUyMnN1c19jaGFubmVsX2ZlYXR1cmVkJTIyJTJDJTIyc3VzX2NoYW5uZWxfd2Vla2x5LW5ld3NsZXR0ZXIlMjIlMkMlMjJzdXNfY2hhbm5lbF9hbWElMjIlMkMlMjJzdXNfY2hhbm5lbF9saXZlc3RyZWFtJTIyJTJDJTIyc3VzX2NoYW5uZWxfc2hvdy1zdXMlMjIlMkMlMjJzdXNfY2hhbm5lbF9lbmdpbmVlcmluZyUyMiU1RCU1RCZhbmFseXRpY3NUYWdzPSU1QiUyMnN1cyUyMiU1RA=='
        }

    r = requests.post(api_endpoint, headers= payload, data=str(''' {"requests":[{"indexName":"OmniSearch_sus_production","query":"'''+search_keyword+'''","params":"attributesToSnippet=%5B%22body%3A80%22%2C%22searchable_comments%3A30%22%5D&page=0&hitsPerPage=10&filters=&facetFilters=%5B%5B%5D%5D&facets=%5B%22channel%22%5D&sortFacetValuesBy=count&clickAnalytics=true"}]} ''')) 

    print(r)

if __name__ == "__main__":
    get_data_from_api()
0
ApplePie 5 Januari 2021, 05:25

3 jawaban

Jawaban Terbaik

Untuk menindaklanjuti komentar saya, ada beberapa tempat di mana Anda dapat membiarkan Python melakukan kerja keras untuk Anda. Pertimbangkan alternatif ini yang menggunakan urllib.parse.urlencode untuk membuat nilai params, lalu biarkan Permintaan membuat serial struktur data Anda:

from urllib.parse import urlencode

import requests


def get_data_from_api():
    search_keyword = "money"
    api_endpoint = "..."
    headers = {
        "x-xxxx-application-id": "...",
        "x-xxx-api-key": "...",
    }

    params = {
        "attributesToSnippet": '["body:80","searchable_comments:30"]',
        "page": "0",
        "hitsPerPage": "10",
        "facetFilters": "[[]]",
        "filters": "",
        "facets": '["channel"]',
        "sortFacetValuesBy": "count",
        "clickAnalytics": "true",
    }

    r = requests.post(
        api_endpoint,
        headers=headers,
        data={
            "requests": [
                {
                    "indexName": "OmniSearch_sus_production",
                    "query": search_keyword,
                    "params": urlencode(params),
                }
            ]
        },
    )

    return r.json()

Cepat, ApplePie! Ini jam 2 pagi dan ada sesuatu yang pecah dan semua orang panik! Versi kode mana (yang secara fungsional identik) yang ingin Anda pecahkan masalahnya?

Saya tahu ini tidak secara langsung menjawab pertanyaan Anda, tetapi ambil ini dalam semangat "sementara kita membahas masalah ini ...".

1
Kirk Strauser 5 Januari 2021, 21:33

Anda bisa mencoba:

print(r.json())
2
keria 5 Januari 2021, 02:42

r adalah objek respons. Kamu bisa memakai

  • r.content dapatkan tubuh biner.
  • r.text dapatkan badan string
  • r.json() atau orjson.loads(r.content) dapatkan json body

Lihat detail selengkapnya dengan di sini

2
DustyPosa 5 Januari 2021, 02:47