Hướng dẫn twitter api pagination python - twitter api phân trang python

I am using the full archive search of the Twitter API to extract data on past events. I have downloaded the code sample and modified it a bit to also save my data to a file on my local drive, and this is all working well. But I do not know how to implement pagination.

When working with

php vendor/bin/behat features/api.programmer.feature:96
2, there is a special
php vendor/bin/behat features/api.programmer.feature:96
3 function, but my current script uses
php vendor/bin/behat features/api.programmer.feature:96
4.

I tried adding a

php vendor/bin/behat features/api.programmer.feature:96
5 loop in my
php vendor/bin/behat features/api.programmer.feature:96
6 function using
php vendor/bin/behat features/api.programmer.feature:96
7, but I did not really understand the Twitter documentation and could not make it work.

Here is what I have got so far:

# Extended script for full archive search with Twitter academic API
# based on a sample provided by Twitter
# for documentation, see https://developer.twitter.com/en/products/twitter-api/academic-research

import requests
import os
import json

# STEP 1: add bearer token for your academic Twitter API dev account

bearer_token = "MYTOKEN"

# STEP 2: define which API endpoint to query: "all" or "recent"

search_url = "https://api.twitter.com/2/tweets/search/all"

# Optional params: 
# start_time,end_time,since_id,until_id,max_results,next_token,
# expansions,tweet.fields,media.fields,poll.fields,place.fields,user.fields

# STEP 3: define query parameters

query_params = {'query': '#WEURO2022',
                'tweet.fields': 'author_id,conversation_id,created_at',
                'expansions': 'geo.place_id',
                'place.fields': 'contained_within,country,country_code,full_name,geo,id,name,place_type',
                'user.fields': 'created_at,description,entities,id,location,name',
                'start_time': '2022-02-15T00:00:01.000Z',
                'end_time': '2022-09-16T23:59:59.000Z',
                'max_results':'500'}

def bearer_oauth(r):
    """
    Method required by bearer token authentication.
    """

    r.headers["Authorization"] = f"Bearer {bearer_token}"
    r.headers["User-Agent"] = "v2RecentSearchPython"
    return r

def connect_to_endpoint(url, params):
    response = requests.get(url, auth=bearer_oauth, params=params)
    if response.status_code == 200:
        print("Ready to go!")
    if response.status_code != 200:
        raise Exception(response.status_code, response.text)
    json_data=response.json()
    # return json_data
    
# write data to JSON file
    with open('C:\\Users\\####\\Downloads\\MyTweets.json', 'a') as json_f:
        json.dump(json_data, json_f)
        print("JSON data written to file!")
            
def main():  
    json_response = connect_to_endpoint(search_url, query_params)
    while json_response["meta"]["next_token"]:
        query_params["next_token"] = json_response["meta"]["next_token"]

if __name__ == "__main__":
    main()

Can you help me fix this, or point me to a tutorial for less experienced users?

Hướng dẫn này sử dụng thư viện PHP nào?

REST API đang phân trang là gì?Show

  • Thay vào đó, tôi sẽ dán một số logic thủ công và sử dụng
  • REST API đang phân trang là gì?
  • Làm thế nào tôi có thể phân trang trong PHP?
  • Làm thế nào phân trang được thực hiện trong API?
  • Phương pháp nào được coi là hiệu quả nhất cho việc phân trang trong API REST?

{
    "_links": {
        "self": {
            "href": "http://example.org/api/user?page=3"
        },
        "first": {
            "href": "http://example.org/api/user"
        },
        "prev": {
            "href": "http://example.org/api/user?page=2"
        },
        "next": {
            "href": "http://example.org/api/user?page=4"
        },
        "last": {
            "href": "http://example.org/api/user?page=133"
        }
    }
    "count": 3,
    "total": 498,
    "_embedded": {
        "users": [
            {
                "_links": {
                    "self": {
                        "href": "http://example.org/api/user/mwop"
                    }
                },
                "id": "mwop",
                "name": "Matthew Weier O'Phinney"
            },
            {
                "_links": {
                    "self": {
                        "href": "http://example.org/api/user/mac_nibblet"
                    }
                },
                "id": "mac_nibblet",
                "name": "Antoine Hedgecock"
            },
            {
                "_links": {
                    "self": {
                        "href": "http://example.org/api/user/spiffyjr"
                    }
                },
                "id": "spiffyjr",
                "name": "Kyle Spraggs"
            }
        ]
    }
}

Các chìa khóa ở đây - đầu tiên, trước, tiếp theo và cuối cùng - không tình cờ. Đây là những tiêu chuẩn toàn internet như bản thân. Vì vậy, nếu bạn sử dụng các tên này cho các liên kết của bạn, API của bạn sẽ phù hợp với rất nhiều API khác.

Điều quan trọng khác cần chú ý trong ví dụ này là phân trang được thực hiện với các tham số truy vấn. Về mặt kỹ thuật, có rất nhiều cách mà khách hàng có thể cho chúng tôi biết họ muốn trang nào cho một bộ sưu tập, như các tham số truy vấn hoặc tiêu đề yêu cầu. Nhưng thành thật mà nói, các tham số truy vấn là cách dễ nhất. Trong trường hợp của chúng tôi, chúng tôi sẽ làm theo chính xác những gì bạn thấy ở đây. Và với Thư viện Hateoas, điều này sẽ dễ dàng.

Đầu tiên, chúng ta hãy thiết lập một kịch bản để kiểm tra điều này trong

php vendor/bin/behat features/api.programmer.feature:96
8. Trong kịch bản này, chúng tôi sẽ làm một cái gì đó thực sự tuyệt vời: chúng tôi sẽ theo các liên kết để phân trang. Tôi muốn có thể truy cập tài nguyên thu thập của chúng tôi, lấy URL cho liên kết
php vendor/bin/behat features/api.programmer.feature:96
9 này và thực hiện yêu cầu thứ hai cho liên kết
php vendor/bin/behat features/api.programmer.feature:96
9 và thực sự xem những gì trên trang 2.

Đối với phân trang của chúng tôi, chúng tôi sẽ hiển thị 5 lập trình viên trên mỗi trang. Trong

php vendor/bin/behat features/api.programmer.feature:96
1, chúng ta cần thêm một loạt các lập trình viên để thử điều này - Tôi sẽ dán vào một số mã rất giàu trí tưởng tượng cung cấp cho chúng ta 12 lập trình viên trong cơ sở dữ liệu:

... dòng 1 - 93
Kịch bản: Phân thông qua bộ sưu tập các lập trình viên: Paginate through the collection of programmers: Paginate through the collection of programmers
Cho các lập trình viên sau đây tồn tại:the following programmers exist:the following programmers exist:
| Biệt danh | nickname | nickname |
| Lập trình viên1 | Programmer1 | Programmer1 |
| Lập trình viên2 | Programmer2 | Programmer2 |
| Lập trình viên3 | Programmer3 | Programmer3 |
| Lập trình viên4 | Programmer4 | Programmer4 |
| Lập trình viên5 | Programmer5 | Programmer5 |
| Lập trình viên6 | Programmer6 | Programmer6 |
| Lập trình viên7 | Programmer7 | Programmer7 |
| Lập trình viên8 | Programmer8 | Programmer8 |
| Lập trình viên9 | Programmer9 | Programmer9 |
| Lập trình20 | Programmer10 | Programmer10 |
| Lập trình viên11 | Programmer11 | Programmer11 |
| Lập trình viên12 | Programmer12 | Programmer12 |
... dòng 110 - 166

Mọi thứ sau đó sẽ rất giống với tài nguyên thu thập thông thường, vì vậy tôi sẽ lấy một nửa sau của kịch bản đó. Tôi sẽ xóa mã trạng thái 200, vì chúng tôi đã kiểm tra điều này ở trên. Sau khi tôi thực hiện yêu cầu nhận đầu tiên, chúng tôi sẽ phân tích cú pháp thông qua phản hồi, tìm liên kết

php vendor/bin/behat features/api.programmer.feature:96
9 và đưa ra yêu cầu nhận thứ hai. Tôi đã có một định nghĩa bước tích hợp để làm chính xác điều đó. Tôi sẽ chỉ nói: và tôi theo liên kết "tiếp theo":

... dòng 1 - 94
Kịch bản: Phân thông qua bộ sưu tập các lập trình viên: Paginate through the collection of programmers: Paginate through the collection of programmers
Cho các lập trình viên sau đây tồn tại:the following programmers exist:the following programmers exist:
| Biệt danh | nickname |
| Lập trình viên1 | Programmer1 |I request "GET /api/programmers"
| Lập trình viên2 | Programmer2 |I follow the "next" link
| Lập trình viên3 | Programmer3 |

| Lập trình viên4 | Programmer4 |

| Lập trình viên5 | Programmer5 |

... dòng 1 - 93
Kịch bản: Phân thông qua bộ sưu tập các lập trình viên: Paginate through the collection of programmers: Paginate through the collection of programmers
Cho các lập trình viên sau đây tồn tại:the following programmers exist:
| Biệt danh | nickname |the "_embedded.programmers" property should contain "Programmer7"
| Lập trình viên1 | Programmer1 |the "_embedded.programmers" property should not contain "Programmer2"
| Lập trình viên2 | Programmer2 |the "_embedded.programmers" property should not contain "Programmer11"
| Lập trình viên3 | Programmer3 |

| Lập trình viên4 | Programmer4 |

| Lập trình viên5 | Programmer5 |

php vendor/bin/behat features/api.programmer.feature:96

| Lập trình viên6 | Programmer6 |

| Lập trình viên7 | Programmer7 |

| Lập trình viên8 | Programmer8 |
publicfunctionlistAction()functionlistAction() function listAction()
| Lập trình viên9 | Programmer9 |
| Lập trình20 | Programmer10 |$this->getProgrammerRepository()->findAll();
| Lập trình viên11 | Programmer11 |new CollectionRepresentation(
| Lập trình viên12 | Programmer12 |
'programmers',,,
'programmers'
... dòng 110 - 166
Mọi thứ sau đó sẽ rất giống với tài nguyên thu thập thông thường, vì vậy tôi sẽ lấy một nửa sau của kịch bản đó. Tôi sẽ xóa mã trạng thái 200, vì chúng tôi đã kiểm tra điều này ở trên. Sau khi tôi thực hiện yêu cầu nhận đầu tiên, chúng tôi sẽ phân tích cú pháp thông qua phản hồi, tìm liên kết
php vendor/bin/behat features/api.programmer.feature:96
9 và đưa ra yêu cầu nhận thứ hai. Tôi đã có một định nghĩa bước tích hợp để làm chính xác điều đó. Tôi sẽ chỉ nói: và tôi theo liên kết "tiếp theo":
... dòng 1 - 94
| Biệt danh |

| Lập trình viên1 |I request "GET /api/programmers"

| Lập trình viên2 |I follow the "next" link
| Lập trình viên3 | Hateoas\Representation\PaginatedRepresentation;
| Lập trình viên4 |
publicfunctionlistAction()functionlistAction() function listAction()
| Lập trình viên9 |
| Lập trình20 |
| Lập trình viên11 |new CollectionRepresentation(new CollectionRepresentation(
| Lập trình viên12 |
'programmers',,,
'programmers'
);
$ pagined = new PaginedRepresentation (new PaginatedRepresentation(new PaginatedRepresentation(
... dòng 104 - 109
);
$ pagined = new PaginedRepresentation (new PaginatedRepresentation(
... dòng 104 - 109
... dòng 111 - 114

}

... dòng 116 - 205
Điều này cần một số đối số khác nhau. Đầu tiên là
publicfunctionlistAction()functionlistAction() function listAction()
php vendor/bin/behat features/api.programmer.feature:96
0 thực tế. Thứ hai là tên tuyến đường đến điểm cuối danh sách, đối với chúng tôi là
php vendor/bin/behat features/api.programmer.feature:96
1. Và nó sẽ sử dụng điều này để tạo các liên kết như tiếp theo, đầu tiên và cuối cùng. Đối số thứ ba là bất kỳ mảng tham số nào cần được chuyển đến tuyến đường. Vì vậy, nếu tuyến đường có biệt danh hoặc ký tự đại diện ID, bạn sẽ vượt qua điều đó ở đây. Nhưng không có bất kỳ ký tự đại diện nào trong tuyến đường này, vì vậy chúng tôi sẽ vượt qua một mảng trống. Ba đối số tiếp theo là trang chúng tôi đang truy cập, số lượng hồ sơ chúng tôi hiển thị trên mỗi trang và tổng số trang. Tôi sẽ phát minh ra một vài biến và đặt chúng ở trên trong một khoảnh khắc:
... dòng 1 - 89
$ pagined = new PaginedRepresentation (new PaginatedRepresentation(new PaginatedRepresentation(
... dòng 104 - 109
'api_programmers_list',,,
array(),(),(),
... dòng 111 - 114
... dòng 104 - 109
... dòng 111 - 114
);
$ pagined = new PaginedRepresentation (new PaginatedRepresentation(
... dòng 104 - 109
... dòng 111 - 114

}

... dòng 116 - 205
Điều này cần một số đối số khác nhau. Đầu tiên là
publicfunctionlistAction()functionlistAction() function listAction()
php vendor/bin/behat features/api.programmer.feature:96
0 thực tế. Thứ hai là tên tuyến đường đến điểm cuối danh sách, đối với chúng tôi là
php vendor/bin/behat features/api.programmer.feature:96
1. Và nó sẽ sử dụng điều này để tạo các liên kết như tiếp theo, đầu tiên và cuối cùng. Đối số thứ ba là bất kỳ mảng tham số nào cần được chuyển đến tuyến đường. Vì vậy, nếu tuyến đường có biệt danh hoặc ký tự đại diện ID, bạn sẽ vượt qua điều đó ở đây. Nhưng không có bất kỳ ký tự đại diện nào trong tuyến đường này, vì vậy chúng tôi sẽ vượt qua một mảng trống. Ba đối số tiếp theo là trang chúng tôi đang truy cập, số lượng hồ sơ chúng tôi hiển thị trên mỗi trang và tổng số trang. Tôi sẽ phát minh ra một vài biến và đặt chúng ở trên trong một khoảnh khắc:
... dòng 1 - 89
{5;
... dòng 92 - 102 1;
... dòng 104 - 109
... dòng 111 - 114
$ pagined = new PaginedRepresentation (new PaginatedRepresentation(new PaginatedRepresentation(
... dòng 104 - 109
'api_programmers_list',,,
array(),(),(),
... dòng 111 - 114
... dòng 104 - 109
... dòng 111 - 114
);
$ pagined = new PaginedRepresentation (new PaginatedRepresentation(
... dòng 104 - 109 $response;
... dòng 111 - 114

}

... dòng 116 - 205

Điều này cần một số đối số khác nhau. Đầu tiên là
publicfunctionlistAction()functionlistAction() function listAction()
php vendor/bin/behat features/api.programmer.feature:96
0 thực tế. Thứ hai là tên tuyến đường đến điểm cuối danh sách, đối với chúng tôi là
php vendor/bin/behat features/api.programmer.feature:96
1. Và nó sẽ sử dụng điều này để tạo các liên kết như tiếp theo, đầu tiên và cuối cùng. Đối số thứ ba là bất kỳ mảng tham số nào cần được chuyển đến tuyến đường. Vì vậy, nếu tuyến đường có biệt danh hoặc ký tự đại diện ID, bạn sẽ vượt qua điều đó ở đây. Nhưng không có bất kỳ ký tự đại diện nào trong tuyến đường này, vì vậy chúng tôi sẽ vượt qua một mảng trống. Ba đối số tiếp theo là trang chúng tôi đang truy cập, số lượng hồ sơ chúng tôi hiển thị trên mỗi trang và tổng số trang. Tôi sẽ phát minh ra một vài biến và đặt chúng ở trên trong một khoảnh khắc:
... dòng 1 - 89
$ pagined = new PaginedRepresentation (new PaginatedRepresentation(new PaginatedRepresentation(
... dòng 104 - 109
'api_programmers_list',,,
array(),(),(),
... dòng 111 - 114
... dòng 104 - 109
... dòng 111 - 114
);
}$this->createApiResponse($paginated, 200, 'json');
... dòng 104 - 109 $response;
... dòng 104 - 109
... dòng 111 - 114

}

... dòng 116 - 205

... dòng 1 - 89

{

... dòng 92 - 102

... dòng 1 - 89
{functionlistAction(Request $request) function listAction(Request $request)
{
... dòng 92 - 102
... dòng 1 - 89
{functionlistAction(Request $request)

... dòng 92 - 102

}
... dòng 1 - 89
{functionlistAction(Request $request) function listAction(Request $request)
{
... dòng 92 - 102
... dòng 1 - 89 'limit', 5);
{functionlistAction(Request $request)'page', 1);
... dòng 92 - 102
... dòng 1 - 89
{functionlistAction(Request $request)

... dòng 92 - 102

}

... dòng 1 - 89

... dòng 116 - 205

Điều này cần một số đối số khác nhau. Đầu tiên là
... dòng 1 - 89
{functionlistAction(Request $request) function listAction(Request $request)
{
... dòng 92 - 102
}'limit', 5);
... dòng 116 - 205 'page', 1);
Điều này cần một số đối số khác nhau. Đầu tiên là 1) * $limit;
php vendor/bin/behat features/api.programmer.feature:96
0 thực tế. Thứ hai là tên tuyến đường đến điểm cuối danh sách, đối với chúng tôi là
php vendor/bin/behat features/api.programmer.feature:96
1. Và nó sẽ sử dụng điều này để tạo các liên kết như tiếp theo, đầu tiên và cuối cùng. Đối số thứ ba là bất kỳ mảng tham số nào cần được chuyển đến tuyến đường. Vì vậy, nếu tuyến đường có biệt danh hoặc ký tự đại diện ID, bạn sẽ vượt qua điều đó ở đây. Nhưng không có bất kỳ ký tự đại diện nào trong tuyến đường này, vì vậy chúng tôi sẽ vượt qua một mảng trống. Ba đối số tiếp theo là trang chúng tôi đang truy cập, số lượng hồ sơ chúng tôi hiển thị trên mỗi trang và tổng số trang. Tôi sẽ phát minh ra một vài biến và đặt chúng ở trên trong một khoảnh khắc:
$ thu thập,'limit', 5);new CollectionRepresentation(
$ trang,'page', 1);
$ giới hạn,
php vendor/bin/behat features/api.programmer.feature:96
0 thực tế. Thứ hai là tên tuyến đường đến điểm cuối danh sách, đối với chúng tôi là
php vendor/bin/behat features/api.programmer.feature:96
1. Và nó sẽ sử dụng điều này để tạo các liên kết như tiếp theo, đầu tiên và cuối cùng. Đối số thứ ba là bất kỳ mảng tham số nào cần được chuyển đến tuyến đường. Vì vậy, nếu tuyến đường có biệt danh hoặc ký tự đại diện ID, bạn sẽ vượt qua điều đó ở đây. Nhưng không có bất kỳ ký tự đại diện nào trong tuyến đường này, vì vậy chúng tôi sẽ vượt qua một mảng trống. Ba đối số tiếp theo là trang chúng tôi đang truy cập, số lượng hồ sơ chúng tôi hiển thị trên mỗi trang và tổng số trang. Tôi sẽ phát minh ra một vài biến và đặt chúng ở trên trong một khoảnh khắc:
Thay vào đó, tôi sẽ dán một số logic thủ công và sử dụng
... dòng 1 - 89
{functionlistAction(Request $request)

... dòng 92 - 102

php vendor/bin/behat features/api.programmer.feature:96

Yes!

}

... dòng 116 - 205

Điều này cần một số đối số khác nhau. Đầu tiên là

php vendor/bin/behat features/api.programmer.feature:96
1

php vendor/bin/behat features/api.programmer.feature:960 thực tế. Thứ hai là tên tuyến đường đến điểm cuối danh sách, đối với chúng tôi là php vendor/bin/behat features/api.programmer.feature:961. Và nó sẽ sử dụng điều này để tạo các liên kết như tiếp theo, đầu tiên và cuối cùng. Đối số thứ ba là bất kỳ mảng tham số nào cần được chuyển đến tuyến đường. Vì vậy, nếu tuyến đường có biệt danh hoặc ký tự đại diện ID, bạn sẽ vượt qua điều đó ở đây. Nhưng không có bất kỳ ký tự đại diện nào trong tuyến đường này, vì vậy chúng tôi sẽ vượt qua một mảng trống. Ba đối số tiếp theo là trang chúng tôi đang truy cập, số lượng hồ sơ chúng tôi hiển thị trên mỗi trang và tổng số trang. Tôi sẽ phát minh ra một vài biến và đặt chúng ở trên trong một khoảnh khắc:

$ thu thập,'limit', 5);paginate the JSON response that is called from the REST API. The order of the data is retained from page to page. Given the ability to paginate, you can quickly populate tables and make new REST calls every time you go to the next page of the data on the table.

$ trang,'page', 1);

$ giới hạn, .

php vendor/bin/behat features/api.programmer.feature:96
0 thực tế. Thứ hai là tên tuyến đường đến điểm cuối danh sách, đối với chúng tôi là
php vendor/bin/behat features/api.programmer.feature:96
1. Và nó sẽ sử dụng điều này để tạo các liên kết như tiếp theo, đầu tiên và cuối cùng. Đối số thứ ba là bất kỳ mảng tham số nào cần được chuyển đến tuyến đường. Vì vậy, nếu tuyến đường có biệt danh hoặc ký tự đại diện ID, bạn sẽ vượt qua điều đó ở đây. Nhưng không có bất kỳ ký tự đại diện nào trong tuyến đường này, vì vậy chúng tôi sẽ vượt qua một mảng trống. Ba đối số tiếp theo là trang chúng tôi đang truy cập, số lượng hồ sơ chúng tôi hiển thị trên mỗi trang và tổng số trang. Tôi sẽ phát minh ra một vài biến và đặt chúng ở trên trong một khoảnh khắc:

Thay vào đó, tôi sẽ dán một số logic thủ công và sử dụng

php vendor/bin/behat features/api.programmer.feature:96
5:

PublicFunctionListAction (Yêu cầu $ Yêu cầu)functionlistAction(Request $request)

... dòng 92 - 93

$ giới hạn = $ request-> truy vấn-> get ('giới hạn', 5);'limit', 5);

$ page = $ request-> truy vấn-> get ('trang', 1);'page', 1);.

$ offset = ($ page - 1) * $ giới hạn;1) * $limit;

$ numberOfPages = (int) cle (đếm ($ lập trình viên) / $ giới hạn);

Tìm kiếm phân trang ..

Phương pháp nào được coi là hiệu quả nhất cho việc phân trang trong API REST?

Phương pháp bù là cách phổ biến nhất để phân trang tài nguyên (với phần bù trên truy vấn), nhưng nó kém hiệu quả hơn phương thức tìm kiếm.Offset method is the most common way to paginate resources (with an offset on query), but it's less efficient than the Search-after method.Offset method is the most common way to paginate resources (with an offset on query), but it's less efficient than the Search-after method.