2012-09-06 38 views
5

Tôi đã cố gắng tiêu thụ API phát trực tuyến Twitter bằng cách sử dụng các yêu cầu Python.Ví dụ về yêu cầu truyền trực tuyến không hoạt động trong môi trường của tôi

Có một simple example trong tài liệu:

import requests 
import json 

r = requests.post('https://stream.twitter.com/1/statuses/filter.json', 
    data={'track': 'requests'}, auth=('username', 'password')) 

for line in r.iter_lines(): 
    if line: # filter out keep-alive new lines 
     print json.loads(line) 

Khi tôi thực hiện điều này, các cuộc gọi đến requests.post() không bao giờ trở lại. Tôi đã thử nghiệm và chứng minh rằng nó chắc chắn đang kết nối với Twitter và nhận dữ liệu từ API. Tuy nhiên, thay vì trả về một đối tượng phản hồi, nó chỉ ngồi ở đó tiêu tốn càng nhiều dữ liệu như Twitter gửi đi. Đánh giá theo đoạn mã trên, tôi mong đợi requests.post() trả về một đối tượng phản hồi với một kết nối mở tới Twitter mà tôi có thể tiếp tục nhận được kết quả thời gian thực.

(Để chứng minh nó đang nhận dữ liệu, tôi kết nối với Twitter bằng cách sử dụng thông tin đăng nhập tương tự trong trình bao khác, khi Twitter đóng kết nối đầu tiên và cuộc gọi trả về đối tượng phản hồi. Thuộc tính r.content chứa tất cả dữ liệu được sao lưu kết nối đã được mở.)

Tài liệu không đề cập đến bất kỳ bước nào khác cần thiết để gây ra requests.post để trở về trước khi tiêu thụ tất cả dữ liệu được cung cấp. Những người khác dường như đang sử dụng mã tương tự mà không gặp sự cố này, ví dụ: here.

Tôi đang sử dụng:

  • Python 2.7
  • Ubuntu 11.04
  • Các yêu cầu 0.14.0

Trả lời

10

Bạn cần phải tắt tìm nạp trước, mà tôi nghĩ là một tham số làm thay đổi giá trị mặc định:

r = requests.post('https://stream.twitter.com/1/statuses/filter.json', 
    data={'track': 'requests'}, auth=('username', 'password'), 
    prefetch=False) 

for line in r.iter_lines(): 
    if line: # filter out keep-alive new lines 
     print json.loads(line) 

CẬP NHẬT: Trong khuôn khổ mới nhất requests, sử dụng stream thay vì prefetch:

r = requests.post('https://stream.twitter.com/1/statuses/filter.json', 
    data={'track': 'requests'}, auth=('username', 'password'), 
    stream=True) 

for line in r.iter_lines(): 
    if line: # filter out keep-alive new lines 
     print json.loads(line) 
+1

Cảm ơn! Tôi vừa gửi yêu cầu kéo để cập nhật tài liệu. – Gareth

5

Ah, tôi thấy câu trả lời bằng cách đọc mã. Tại một số điểm, một tham số prefetch đã được thêm vào phương thức post (và các phương thức khác, tôi giả sử).

Tôi chỉ cần thêm prefetch=False kwarg vào requests.post().

+0

Đọc thêm cho thấy prefetch đã là một tham số trong một thời gian, nhưng giá trị mặc định của nó đã được thay đổi thành True trong phiên bản 0.13.6. – Gareth

+1

:-) Cũng giống như tôi đang gõ câu trả lời cho bạn. :-P –

Các vấn đề liên quan