Проблема с механизмом сканирования в Twitter Python Crawler - PullRequest
0 голосов
/ 05 августа 2011

Ниже приведен небольшой фрагмент кода, который у меня есть для моего механизма сканирования на твиттере:

from BeautifulSoup import BeautifulSoup
import re
import urllib2

url = 'http://mobile.twitter.com/NYTimesKrugman'

def gettweets(soup):
    tags = soup.findAll('div', {'class' : "list-tweet"})#to obtain tweet of a follower
    for tag in tags: 
        print tag.renderContents()
        print ('\n\n')

def are_more_tweets(soup):#to check whether there is more than one page on mobile   twitter 
    links = soup.findAll('a', {'href': True}, {id: 'more_link'})
    for link in links:
        b = link.renderContents()
        test_b = str(b)
        if test_b.find('more'):
            return True
        else:
            return False

def getnewlink(soup): #to get the link to go to the next page of tweets on twitter 
    links = soup.findAll('a', {'href': True}, {id : 'more_link'})
    for link in links:
        b = link.renderContents()
        if str(b) == 'more':
            c = link['href']
            d = 'http://mobile.twitter.com' +c
            return d

def checkforstamp(soup): # the parser scans a webpage to check if any of the tweets are older than 3 months
    times = soup.findAll('a', {'href': True}, {'class': 'status_link'})
    for time in times:
        stamp = time.renderContents()
        test_stamp = str(stamp)
        if test_stamp == '3 months ago':  
            print test_stamp
            return True
        else:
            return False


response = urllib2.urlopen(url)
html = response.read()
soup = BeautifulSoup(html)
gettweets(soup)
stamp = checkforstamp(soup)
tweets = are_more_tweets(soup)
print 'stamp' + str(stamp)
print 'tweets' +str (tweets)
while (stamp is False) and (tweets is True): 
    b = getnewlink(soup)
    print b
    red = urllib2.urlopen(b)
    html = red.read()
    soup = BeautifulSoup(html)
    gettweets(soup)
    stamp = checkforstamp(soup)
    tweets = are_more_tweets(soup)
print 'done' 

Проблема в том, что после того, как мой сканер на Твиттере отправил около 3 месяцев твитов, я бы хотел, чтобы он пересталследующая страница пользователя.Однако, похоже, он этого не делает.Кажется, постоянно идет поиск следующей страницы твитов.Я полагаю, что это связано с тем, что checkstamp продолжает оцениваться как False.Есть ли у кого-нибудь какие-либо предложения относительно того, как я могу изменить код, чтобы сканер продолжал искать следующую страницу твитов, если есть еще твиты (проверенные механизмом are_more_tweets), и он еще не достиг 3-х месяцев твитов???Спасибо!

РЕДАКТИРОВАТЬ - см. Ниже:

from BeautifulSoup import BeautifulSoup
import re
import urllib

url = 'http://mobile.twitter.com/cleversallie'
output = open(r'C:\Python28\testrecursion.txt', 'a') 

def gettweets(soup):
    tags = soup.findAll('div', {'class' : "list-tweet"})#to obtain tweet of a follower
    for tag in tags: 
        a = tag.renderContents()
        b = str (a)
        print(b)
        print('\n\n')

def are_more_tweets(soup):#to check whether there is more than one page on mobile twitter 
    links = soup.findAll('a', {'href': True}, {id: 'more_link'})
    for link in links:
        b = link.renderContents()
        test_b = str(b)
        if test_b.find('more'):
            return True
        else:
            return False

def getnewlink(soup): #to get the link to go to the next page of tweets on twitter 
    links = soup.findAll('a', {'href': True}, {id : 'more_link'})
    for link in links:
        b = link.renderContents()
        if str(b) == 'more':
            c = link['href']
            d = 'http://mobile.twitter.com' +c
            return d

 def checkforstamp(soup): # the parser scans a webpage to check if any of the tweets are older than 3 months
    times = soup.findAll('a', {'href': True}, {'class': 'status_link'})
    for time in times:
        stamp = time.renderContents()
        test_stamp = str(stamp)
        if not (test_stamp[0]) in '0123456789':
            continue
        if test_stamp == '3 months ago':
            print test_stamp
            return True
        else:
            return False


response = urllib.urlopen(url)
html = response.read()
soup = BeautifulSoup(html)
gettweets(soup)
stamp = checkforstamp(soup)
tweets = are_more_tweets(soup)
while (not stamp) and (tweets): 
    b = getnewlink(soup)
    print b
    red = urllib.urlopen(b)
    html = red.read()
    soup = BeautifulSoup(html)
    gettweets(soup)
    stamp = checkforstamp(soup)
    tweets = are_more_tweets(soup)
 print 'done' 

1 Ответ

1 голос
/ 05 августа 2011

Ваш soup.findall() выбирает тег изображения в ссылке, соответствующей вашему шаблону (имеет атрибут href и class status-link).

Вместо того, чтобы всегда return включатьсамая первая ссылка, попробуйте:

for time in times:
    stamp = time.renderContents()
    test_stamp = str(stamp)
    print test_stamp
    if not test_stamp[0] in '0123456789':
        continue
    if test_stamp == '3 months ago':  
        return True
    else:
        return False

, которая пропустит ссылку, если она не начинается с цифры, так что вы действительно можете перейти по правильной ссылке.Сохраните это утверждение print, чтобы вы могли видеть, нажимаете ли вы какую-либо другую ссылку, начинающуюся с номера, который вам также необходимо отфильтровать.

Редактировать: вы всегда выполняли возвращая на самом первом элементе в times.Я изменил его так, чтобы он игнорировал любые ссылки , которые не начинались с цифры.

Однако это привело бы к возвращению None, если он не нашел каких-либо ссылки с номером.Это будет работать нормально, за исключением того, что вы изменили while not stamp and tweets на while stamp is False and tweets is True.Измените его обратно на while not stamp and tweets, и он будет правильно обрабатывать None и False как одинаковые, и он должен работать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...