Python-twitter-v2

Quy trình từng bước từ thiết lập, truy cập điểm cuối đến lưu các tweet được thu thập ở định dạng CSV

Ảnh của NASA trên Bapt

Mục lục

  1. Giới thiệu
  2. Điều kiện tiên quyết để bắt đầu
  3. Mã thông báo mang
  4. Tạo tiêu đề
  5. Tạo URL
  6. Kết nối với Điểm cuối
  7. Để tất cả chúng cùng nhau
  8. Lưu kết quả vào CSV
  9. Lặp qua các yêu cầu
1. Giới thiệu

Vào cuối năm 2020, Twitter đã giới thiệu API Twitter mới được xây dựng từ đầu. Twitter API v2 đi kèm với nhiều tính năng và dữ liệu hơn mà bạn có thể lấy và phân tích, các điểm cuối mới và rất nhiều chức năng

Với việc giới thiệu API mới đó, Twitter cũng giới thiệu một sản phẩm miễn phí mạnh mẽ mới dành cho giới học thuật. Theo dõi sản phẩm Nghiên cứu học thuật

Bản nhạc cấp quyền truy cập miễn phí vào tìm kiếm lưu trữ đầy đủ và các điểm cuối v2 khác, với giới hạn âm lượng là 10.000.000 tweet mỗi tháng. Nếu bạn muốn biết mình có đủ điều kiện tham gia đường đua hay không, hãy kiểm tra liên kết này

Gần đây tôi đã làm việc trong một dự án nghiên cứu phân tích dữ liệu tại Đại học Carnegie Mellon bằng cách sử dụng các khả năng mà bản nhạc này mang lại và sức mạnh mà nó mang lại cho bạn với tư cách là một nhà nghiên cứu thật đáng kinh ngạc

Tuy nhiên, vì phiên bản 2 của API còn khá mới nên sẽ có ít tài nguyên hơn nếu bạn gặp sự cố trong quá trình thu thập dữ liệu cho nghiên cứu của mình

Vì vậy, trong bài viết này, tôi sẽ thực hiện quy trình từng bước từ thiết lập, truy cập điểm cuối, đến lưu các tweet được thu thập ở định dạng CSV để sử dụng cho phân tích trong tương lai

Bài viết này sẽ sử dụng một điểm cuối chỉ khả dụng cho kênh Nghiên cứu học thuật (Điểm cuối Tìm kiếm trong kho lưu trữ đầy đủ), nhưng hầu hết mọi thứ trong hướng dẫn này đều có thể được áp dụng cho bất kỳ điểm cuối nào khác khả dụng cho tất cả các tài khoản nhà phát triển

Nếu bạn không có quyền truy cập vào điểm cuối Tìm kiếm toàn kho lưu trữ, bạn vẫn có thể làm theo hướng dẫn này bằng cách sử dụng điểm cuối Tìm kiếm gần đây

Bạn nên sử dụng sổ ghi chép Jupyter khi theo dõi bài viết này, vì vậy mọi đoạn mã có thể được chạy trong một ô riêng biệt

2. Điều kiện tiên quyết để bắt đầu

Đầu tiên, chúng tôi sẽ nhập một số thư viện cần thiết cho hướng dẫn này

Để có thể gửi yêu cầu đầu tiên của bạn tới API Twitter, bạn cần có tài khoản nhà phát triển. Nếu bạn chưa có, bạn có thể đăng ký tại đây. (Đừng lo, nó miễn phí và bạn chỉ cần cung cấp một số thông tin về nghiên cứu mà bạn dự định theo đuổi)

Có một tài khoản nhà phát triển đã được phê duyệt?

Tất cả những gì bạn cần làm là tạo một dự án và kết nối Ứng dụng thông qua cổng thông tin dành cho nhà phát triển và chúng tôi đã sẵn sàng

  1. Chuyển đến trang tổng quan cổng thông tin dành cho nhà phát triển
  2. Đăng nhập bằng tài khoản nhà phát triển của bạn
  3. Tạo một dự án mới, đặt tên cho dự án, trường hợp sử dụng dựa trên mục tiêu bạn muốn đạt được và mô tả

Ảnh chụp màn hình trang Dự án mới

4. Giả sử đây là lần đầu tiên của bạn, hãy chọn 'tạo Ứng dụng mới thay thế' và đặt tên cho Ứng dụng của bạn để tạo Ứng dụng mới

Chọn tên cho ứng dụng của bạn

Nếu mọi thứ thành công, bạn sẽ có thể thấy trang này chứa các khóa và mã thông báo của bạn, chúng tôi sẽ sử dụng một trong những trang này để truy cập API

Hình ảnh cũng được lấy từ hướng dẫn từng bước này do nhóm Twitter Dev tạo ra

3. Mã thông báo mang

Nếu bạn đã đến bước này, XIN CHÚC MỪNG. Bạn đủ điều kiện để gửi yêu cầu đầu tiên của mình từ API. ))

Đầu tiên, chúng ta sẽ tạo một hàm auth() sẽ có “Mã thông báo mang” từ ứng dụng mà chúng ta vừa tạo

Vì Bearer Token này là thông tin nhạy cảm, bạn không nên chia sẻ nó với bất kỳ ai. Nếu bạn đang làm việc với một nhóm, bạn không muốn bất kỳ ai có quyền truy cập vào nhóm đó

Vì vậy, chúng tôi sẽ lưu mã thông báo trong một “biến môi trường”

Có nhiều cách để làm điều này, bạn có thể kiểm tra hai tùy chọn này

Biến môi trường. env với Python
Sử dụng các biến môi trường trong Python

Trong bài viết này, những gì chúng tôi sẽ làm là chúng tôi sẽ chỉ chạy dòng này trong mã của mình để đặt biến “TOKEN”

os.environ['TOKEN'] = ''

Just replace the with your bearer token from Twitter and after you run the function, delete the two lines. If you get any errors from this approach, try any of the links listed above.

Bây giờ, chúng ta sẽ tạo hàm auth() để lấy mã thông báo từ môi trường

4. Tạo tiêu đề

Tiếp theo, chúng tôi sẽ xác định một chức năng sẽ lấy mã thông báo mang của chúng tôi, chuyển nó để ủy quyền và trả lại các tiêu đề mà chúng tôi sẽ sử dụng để truy cập API

5. Tạo URL

Bây giờ chúng tôi có thể truy cập API, chúng tôi sẽ tạo yêu cầu cho điểm cuối mà chúng tôi sẽ sử dụng và các tham số chúng tôi muốn chuyển

Hàm được xác định ở trên chứa hai phần

A. search_url

Đó là liên kết của điểm cuối mà chúng tôi muốn truy cập

API của Twitter có rất nhiều điểm cuối khác nhau, đây là danh sách các điểm cuối hiện có tại thời điểm viết bài này với quyền truy cập sớm

Một số điểm cuối truy cập sớm tồn tại tại thời điểm viết bài viết này

Bạn cũng có thể tìm thấy danh sách đầy đủ và thông tin thêm về từng điểm cuối trong liên kết này

Đối với bài viết này, vì nó được nhắm mục tiêu tới các Nhà nghiên cứu học thuật, những người có thể đang cố gắng hưởng lợi từ sản phẩm mới của Twitter, nên chúng tôi sẽ sử dụng điểm cuối tìm kiếm lưu trữ đầy đủ

B. query_params

Các tham số mà điểm cuối cung cấp và chúng tôi có thể sử dụng để tùy chỉnh yêu cầu mà chúng tôi muốn gửi

Mỗi điểm cuối có các tham số khác nhau mà chúng ta có thể chuyển cho nó và tất nhiên, Twitter có tham chiếu API cho từng điểm trong tài liệu của mình

Ví dụ: đối với điểm cuối tìm kiếm lưu trữ đầy đủ mà chúng tôi đang sử dụng cho bài viết này, bạn có thể tìm thấy danh sách các tham số truy vấn tại đây trong trang Tham chiếu API của nó trong phần "Tham số truy vấn"

Ảnh chụp màn hình mẫu tham số truy vấn từ tài liệu API điểm cuối lưu trữ đầy đủ

Chúng ta có thể phân tách các tham số truy vấn ở trên trong hàm mà chúng ta đã viết thành ba phần

Phân tích đơn giản cho các tham số từ điểm cuối này

1. 4 thông số đầu tiên là những thông số chúng tôi đang kiểm soát

'query':        keyword,
'start_time': start_date,
'end_time': end_date,
'max_results': max_results,

2. 4 tham số tiếp theo về cơ bản là chúng tôi hướng dẫn điểm cuối trả về thêm thông tin tùy chọn mà nó sẽ không trả về theo mặc định

'expansions':   'author_id,in_reply_to_user_id,geo.place_id',
'tweet.fields': 'id,text,author_id,in_reply_to_user_id,geo,conversation_id,created_at,lang,public_metrics,referenced_tweets,reply_settings,source',
'user.fields': 'id,name,username,created_at,description,public_metrics,verified',
'place.fields': 'full_name,id,country,country_code,geo,name,place_type',

3. Cuối cùng, tham số ‘next_token’ được sử dụng để nhận ‘trang’ kết quả tiếp theo. Giá trị được sử dụng trong tham số được lấy trực tiếp từ phản hồi do API cung cấp nếu có nhiều kết quả hơn giới hạn cho mỗi yêu cầu, chúng ta sẽ nói nhiều hơn về vấn đề này khi tiếp tục trong bài viết này

'next_token': {}

Bây giờ chúng ta đã biết chức năng của hàm create_url, một số lưu ý quan trọng

  • Điểm cuối bắt buộc

Trong trường hợp điểm cuối tìm kiếm toàn kho lưu trữ, tham số *query* là tham số duy nhất **bắt buộc** để thực hiện yêu cầu. Luôn đảm bảo xem tài liệu về điểm cuối bạn đang sử dụng để xác nhận thông số nào PHẢI tồn tại để bạn không gặp phải sự cố

  • Tham số truy vấn

Tham số truy vấn là nơi bạn đặt (các) từ khóa mà bạn muốn tìm kiếm

Các truy vấn có thể đơn giản như tìm kiếm các tweet có chứa từ “xbox” hoặc phức tạp như “(xbox Europe) OR (xbox usa)” sẽ trả về các tweet có chứa các từ xbox AND Europe hoặc xbox AND usa

Ngoài ra, *truy vấn* có thể được tùy chỉnh bằng cách sử dụng *toán tử tìm kiếm*. Có rất nhiều tùy chọn giúp bạn thu hẹp kết quả tìm kiếm của mình. Chúng tôi hy vọng sẽ thảo luận sâu hơn về toán tử trong một bài viết khác. Hiện tại, bạn có thể tìm thấy danh sách đầy đủ các toán tử để xây dựng truy vấn tại đây

Ví dụ về truy vấn đơn giản với toán tử. “xbox lang. vi”

  • Dấu thời gian

Định dạng end_time và start_time mà Twitter sử dụng cho dấu thời gian là

YYYY-MM-DDTHH. mm. ssZ (ISO 8601/RFC 3339)

Vì vậy, hãy đảm bảo chuyển đổi ngày bạn muốn sang định dạng này. Nếu bạn không chắc chắn về cách thực hiện, thì đây là một công cụ chuyển đổi dấu thời gian tuyệt vời chắc chắn sẽ hữu ích

  • khối lượng kết quả

Số lượng kết quả tìm kiếm được trả về bởi một yêu cầu hiện bị giới hạn trong khoảng từ 10 đến 500 kết quả

Bây giờ bạn có thể hỏi, làm thế nào tôi có thể nhận được hơn 500 kết quả sau đó?

Đáp án đơn giản. Nếu có nhiều kết quả hơn cho truy vấn của bạn, Twitter sẽ trả về một next_token duy nhất mà bạn có thể sử dụng trong yêu cầu tiếp theo của mình và nó sẽ cung cấp cho bạn kết quả mới

Nếu bạn muốn truy xuất tất cả các tweet tồn tại cho truy vấn của mình, bạn chỉ cần tiếp tục gửi yêu cầu bằng cách sử dụng *next_token* mới mà bạn nhận được mỗi lần, cho đến khi không tồn tại next_token, báo hiệu rằng bạn đã truy xuất tất cả các tweet

Hy vọng, bạn không cảm thấy quá bối rối. Nhưng đừng lo, khi chúng ta chạy hết các hàm vừa tạo sẽ rõ

6. Kết nối với Điểm cuối

Bây giờ chúng tôi có URL, tiêu đề và tham số mà chúng tôi muốn, chúng tôi sẽ tạo một chức năng sẽ kết hợp tất cả những thứ này lại với nhau và kết nối với điểm cuối

Hàm bên dưới sẽ gửi yêu cầu “GET” và nếu mọi thứ đều đúng (mã phản hồi 200), nó sẽ trả về phản hồi ở định dạng “JSON”

Ghi chú. next_token được đặt thành “None” theo mặc định vì chúng tôi chỉ quan tâm đến nó nếu nó tồn tại

7. Để tất cả chúng cùng nhau

Bây giờ chúng ta đã có tất cả các chức năng cần thiết, hãy thử kết hợp tất cả chúng lại với nhau để tạo yêu cầu đầu tiên

Trong ô tiếp theo, chúng tôi sẽ thiết lập đầu vào của chúng tôi

  • bearer_token và tiêu đề từ API
  • Chúng tôi sẽ tìm các tweet bằng tiếng Anh có chứa từ “xbox”
  • Chúng tôi sẽ tìm kiếm các tweet từ ngày 1 đến ngày 31 tháng 3 năm 2021
  • Chúng tôi chỉ muốn trả lại tối đa 15 tweet

Bây giờ chúng ta sẽ tạo URL và nhận phản hồi từ API

Phản hồi được trả về từ API Twitter được trả về ở định dạng Ký hiệu đối tượng JavaScript “JSON”.
Để có thể xử lý và chia nhỏ phản hồi mà chúng tôi nhận được, chúng tôi sẽ mã hóa và giải mã tồn tại cho python mà chúng tôi đã nhập trước đó. Bạn có thể tham khảo thêm thông tin về thư viện tại đây.

Nếu phản hồi được trả về từ mã bên dưới là 200 thì yêu cầu đã thành công

url = create_url(keyword, start_time,end_time, max_results)json_response = connect_to_endpoint(url[0], headers, url[1])

Cho phép in phản hồi ở định dạng có thể đọc được bằng các hàm thư viện JSON này

print(json.dumps(json_response, indent=4, sort_keys=True))

Bây giờ, hãy chia nhỏ phản hồi JSON được trả về, về cơ bản, phản hồi được đọc dưới dạng từ điển Python và các khóa chứa dữ liệu hoặc chứa nhiều từ điển hơn. Hai phím trên cùng là

A. Dữ liệu

Một danh sách các từ điển, mỗi từ điển đại diện cho dữ liệu cho một tweet. Ví dụ về cách truy xuất thời gian từ tweet đầu tiên được tạo

json_response['data'][0]['created_at']

B. meta

Một từ điển các thuộc tính về yêu cầu chúng tôi đã gửi, chúng tôi thường chỉ quan tâm đến hai khóa trong từ điển này, next_token và result_count

Giải thích cho dữ liệu trong hai khóa

Để lấy next_token chẳng hạn, bạn có thể viết

json_response['meta']['result_count']

Bây giờ, chúng tôi có hai tùy chọn để lưu kết quả tùy thuộc vào cách chúng tôi muốn xử lý dữ liệu, chúng tôi có thể lưu kết quả ở cùng định dạng JSON mà chúng tôi nhận được hoặc ở định dạng CSV.
Để lưu kết quả dưới dạng JSON, chúng ta có thể dễ dàng thực hiện bằng hai dòng mã này.

________số 8

8. Lưu kết quả vào CSV

Bạn có thể tự hỏi, tại sao chúng tôi muốn lưu kết quả ở định dạng CSV?

Bây giờ, để lưu kết quả ở định dạng bảng cho CSV, có hai cách tiếp cận, cách tiếp cận đơn giản và cách tiếp cận tùy chỉnh hơn

Chà… Nếu có một cách tiếp cận đơn giản thông qua thư viện Python, tại sao chúng ta cần cách tiếp cận tùy chỉnh?

câu trả lời cho điều đó là. Chức năng tùy chỉnh sẽ giúp chúng tôi chia nhỏ và hợp lý hóa các từ điển nhúng trong một số kết quả trả về thành các cột riêng biệt, giúp công việc phân tích của chúng tôi dễ dàng hơn

Ví dụ: khóa số liệu công khai

"public_metrics": {
"like_count": 0,
"quote_count": 0,
"reply_count": 0,
"retweet_count": 0
},

Khóa trả về một từ điển khác, cách tiếp cận đơn giản sẽ lưu từ điển này dưới một cột CSV, trong khi theo cách tiếp cận tùy chỉnh, chúng tôi có thể chia từng từ thành một cột khác trước khi lưu dữ liệu vào CSV

A. cách tiếp cận đơn giản

Đối với phương pháp này, chúng tôi sẽ sử dụng gói Pandas

'query':        keyword,
'start_time': start_date,
'end_time': end_date,
'max_results': max_results,
0

Điều này dựa trên nội dung từ bài đăng trên blog này từ nhóm Nhà phát triển Twitter về chủ đề này, mà tôi đã thử và nó hoạt động rất tốt với các truy vấn đơn giản

B. Cách tiếp cận tùy chỉnh

Trước tiên, chúng tôi sẽ tạo một tệp CSV với các tiêu đề cột mong muốn, chúng tôi sẽ thực hiện việc này một cách riêng biệt với chức năng thực tế của mình để sau này nó không ảnh hưởng đến việc lặp lại các yêu cầu

Sau đó, chúng tôi sẽ tạo chức năng append_to_csv, chúng tôi sẽ nhập phản hồi và tên tệp mong muốn vào, đồng thời chức năng này sẽ nối tất cả dữ liệu chúng tôi đã thu thập vào tệp CSV

Bây giờ nếu chúng ta chạy hàm append_to_csv() trong lần gọi cuối cùng, chúng ta sẽ có một tệp chứa 15 tweet (hoặc ít hơn tùy thuộc vào truy vấn của bạn)

'query':        keyword,
'start_time': start_date,
'end_time': end_date,
'max_results': max_results,
1

9. Lặp qua các yêu cầu

Làm tốt lắm. Chúng tôi đã gửi yêu cầu đầu tiên của mình và lưu phản hồi đầu tiên từ yêu cầu đó

Bây giờ, nếu chúng ta muốn lưu nhiều câu trả lời hơn thì sao? . Để làm được điều đó, chúng tôi sẽ sử dụng các vòng lặp và các biến next_token mà chúng tôi nhận được từ Twitter

Hãy suy nghĩ về trường hợp này

Chúng tôi muốn thu thập các tweet có chứa từ “COVID-19” vào năm 2020 để phân tích cảm xúc của mọi người khi tweet về virus. Có thể có hàng triệu tweet tồn tại và chúng tôi có giới hạn chỉ thu thập 10 triệu tweet mỗi tháng

Nếu chúng tôi chỉ gửi yêu cầu thu thập các tweet trong khoảng thời gian từ ngày 1 tháng 1 năm 2020 đến ngày 31 tháng 12 năm 2020, chúng tôi sẽ đạt giới hạn rất nhanh mà không có sự phân phối tốt trong cả 12 tháng

Vì vậy, những gì chúng tôi có thể làm là, chúng tôi có thể đặt giới hạn cho các tweet mà chúng tôi muốn thu thập mỗi tháng, để nếu chúng tôi đạt đến giới hạn cụ thể sau một tháng, chúng tôi sẽ chuyển sang giới hạn tiếp theo

Đoạn mã dưới đây là một ví dụ sẽ thực hiện chính xác điều đó. Khối mã bên dưới bao gồm hai vòng lặp

  1. Vòng lặp For diễn ra trong nhiều tháng/tuần/ngày mà chúng tôi muốn bao gồm (Tùy thuộc vào cách nó được đặt)
  2. Vòng lặp While kiểm soát số lượng tweet tối đa mà chúng tôi muốn thu thập trong mỗi khoảng thời gian

Chú ý rằng một thời gian. sleep() được thêm vào giữa các cuộc gọi để đảm bảo bạn không chỉ spam API bằng các yêu cầu

Bản tóm tắt

Trong bài viết này, chúng tôi đã trải qua quy trình từng bước mở rộng để thu thập các Tweet từ Twitter API v2 cho Nghiên cứu học thuật bằng Python

Chúng tôi đã đề cập đến các điều kiện tiên quyết bắt buộc, xác thực, tạo yêu cầu và gửi yêu cầu đến điểm cuối tìm kiếm/tất cả và cuối cùng là lưu phản hồi ở các định dạng khác nhau