2014-10-29 67 views
6

Trong khi chạy chương trình này để lấy dữ liệu Twitter sử dụng Python 2.7.8:"IncompleteRead" Lỗi khi lấy Twitter dữ liệu sử dụng Python

#imports 
from tweepy import Stream 
from tweepy import OAuthHandler 
from tweepy.streaming import StreamListener 

#setting up the keys 
consumer_key = '…………...' 
consumer_secret = '………...' 
access_token = '…………...' 
access_secret = '……………..' 

class TweetListener(StreamListener): 
# A listener handles tweets are the received from the stream. 
#This is a basic listener that just prints received tweets to standard output 

def on_data(self, data): 
    print (data) 
    return True 

def on_error(self, status): 
    print (status) 

#printing all the tweets to the standard output 
auth = OAuthHandler(consumer_key, consumer_secret) 
auth.set_access_token(access_token, access_secret) 



stream = Stream(auth, TweetListener()) 

t = u"سوريا" 
stream.filter(track=[t]) 

sau khi chạy chương trình này trong vòng 5 giờ tôi đã nhận này Thông báo lỗi:

Traceback (most recent call last): 
    File "/Users/Mona/Desktop/twitter.py", line 32, in <module> 
    stream.filter(track=[t]) 
    File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/tweepy/streaming.py", line 316, in filter 
    self._start(async) 
    File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/tweepy/streaming.py", line 237, in _start 
    self._run() 
    File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/tweepy/streaming.py", line 173, in _run 
    self._read_loop(resp) 
    File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/tweepy/streaming.py", line 225, in _read_loop 
    next_status_obj = resp.read(int(delimited_string)) 
    File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/httplib.py", line 543, in read 
    return self._read_chunked(amt) 
    File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/httplib.py", line 612, in _read_chunked 
    value.append(self._safe_read(chunk_left)) 
    File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/httplib.py", line 660, in _safe_read 
    raise IncompleteRead(''.join(s), amt) 
IncompleteRead: IncompleteRead(0 bytes read, 976 more expected) 
>>> 

Thực ra tôi không biết phải làm gì với vấn đề này !!!

+1

https://github.com/tweepy/tweepy/pull/498 Điều này đã được khắc phục gần đây. Hãy chắc chắn rằng bạn đang sử dụng Tweepy – Luigi

+0

mới nhất Cảm ơn bạn, tôi sẽ thử nó và tôi sẽ cập nhật trạng thái – Hana

+0

thực sự khi tôi cài đặt "pip install tweepy" phiên bản mới của tweepy trong MAC OSX Terminal, tôi nhận thông báo này "Yêu cầu đã được đáp ứng (sử dụng --upgrade để nâng cấp): tweepy trong /Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages Dọn dẹp ...", làm ơn làm thế nào tôi có thể ghi đè lên phiên bản trước? – Hana

Trả lời

1

Bạn nên kiểm tra xem liệu bạn có đang không xử lý các tweet một cách nhanh chóng đủ bằng thông số stall_warnings hay không.

stream.filter(track=[t], stall_warnings=True) 

Các thư này được xử lý bởi Tweepy (kiểm tra triển khai here) và sẽ thông báo cho bạn nếu bạn bị tụt hậu. Rơi phía sau có nghĩa là bạn không thể xử lý tweet nhanh như Twitter API đang gửi chúng cho bạn. Từ tài liệu Twitter:

Đặt tham số này thành chuỗi đúng sẽ gây ra thông báo định kỳ nếu khách hàng có nguy cơ bị ngắt kết nối. Các tin nhắn này chỉ được gửi khi khách hàng đang tụt lại phía sau và sẽ xuất hiện ở tốc độ tối đa khoảng 5 phút một lần.

Về lý thuyết, bạn sẽ nhận được disconnect message từ API trong tình huống này. Tuy nhiên, không phải lúc nào cũng như vậy:

API truyền trực tuyến sẽ cố gắng gửi thông báo cho biết tại sao luồng lại bị đóng. Lưu ý rằng nếu ngắt kết nối do sự cố mạng hoặc khách hàng đọc quá chậm, có thể thông báo này sẽ không được nhận.

IncompleteRead cũng có thể do sự cố mạng tạm thời và có thể không bao giờ xảy ra nữa. Nếu nó xảy ra lặp lại sau khoảng 5 giờ, rơi xuống phía sau là một cược khá tốt.

2

Tôi vừa gặp sự cố này. Câu trả lời khác là đúng với thực tế, ở chỗ nó là gần như chắc chắn:

  • chương trình của bạn không được bắt kịp với dòng
  • bạn nhận được một cảnh báo gian hàng nếu đó là trường hợp.

Trong trường hợp của tôi, tôi đã đọc tweets thành postgres để phân tích sau, trên một khu vực địa lý khá dày đặc, cũng như từ khóa (London, trên thực tế và khoảng 100 từ khóa). Rất có thể, mặc dù bạn chỉ in nó, máy cục bộ của bạn đang thực hiện một loạt các thứ khác, và các quy trình hệ thống được ưu tiên, vì vậy các tweet sẽ sao lưu cho đến khi Twitter ngắt kết nối bạn. (Điều này thường biểu hiện như một rò rỉ bộ nhớ rõ ràng - chương trình tăng kích thước cho đến khi nó bị giết, hoặc ngắt kết nối twitter - tùy theo điều kiện nào trước.)

Điều có ý nghĩa ở đây là đẩy chế biến ra hàng đợi. Vì vậy, tôi đã sử dụng một giải pháp redis và django-rq - mất khoảng 3 giờ để triển khai trên dev và sau đó là máy chủ sản xuất của tôi, bao gồm nghiên cứu, cài đặt, sửa đổi mã hiện có, ngu ngốc về cài đặt, kiểm tra và lỗi chính tả của tôi .

Bây giờ, trong thư mục django của bạn (nếu phù hợp - YMMV cho các ứng dụng python thẳng) chạy: python manage.py rqworker &

Bạn hiện có hàng đợi! Bạn có thể thêm công ăn việc làm mà như bằng cách thay đổi xử lý của bạn như thế này: (Ở phía trên của tập tin)

import django_rq 

Sau đó, trong phần xử lý của bạn:

def on_data(self, data): 
    django_rq.enqueue(print, data) 
    return True 

Là một sang một bên - nếu bạn quan tâm trong những thứ phát ra từ Syria, thay vì chỉ nhắc Syria, sau đó bạn có thể thêm vào các bộ lọc như thế này:

stream.filter(track=[t], locations=[35.6626, 32.7930, 42.4302, 37.2182]

Đó là một hộp địa lý rất thô tập trung vào Syria, nhưng sẽ nhận bit của Iraq/Thổ Nhĩ Kỳ xung quanh các cạnh. Vì đây là phần bổ sung tùy chọn, nên đáng chú ý việc này:

Hộp giới hạn không hoạt động như bộ lọc cho các thông số bộ lọc khác. Đối với ví dụ track = twitter & vị trí = -122,75,36,8, -121,75,37,8 sẽ khớp với bất kỳ tweet nào chứa cụm từ Twitter (thậm chí là các tweet không thuộc địa lý) HOẶC đến từ khu vực San Francisco.

From this answer, đã giúp tôi, and the twitter docs.

Chỉnh sửa: Tôi thấy từ các bài đăng tiếp theo của bạn rằng bạn vẫn đang đi trên con đường sử dụng API Twitter, vì vậy hy vọng bạn đã sắp xếp xong, nhưng hy vọng điều này sẽ hữu ích cho người khác! :)

+0

Vì tôi đã có một điều tuyệt vời cho điều này đã mang lại cho tôi, nó thực sự tuyệt vời nếu bạn có thể chọn một trong các câu trả lời nếu họ giải quyết (ed) vấn đề của bạn @hana - hoặc là của tôi hoặc luigi. :) – Withnail

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