初学者搜寻项目:如何将Twitter ID转换为用户名?

时间:2019-02-21 17:21:18

标签: python selenium twitter beautifulsoup

由于@BittoBennichan,我已经能够build抓取这个小python东西了,它可以抓取在Twitter上发布的媒体中标记的用户ID:

from bs4 import BeautifulSoup
from selenium import webdriver
import time

# Create a new instance of the Firefox driver
driver = webdriver.Firefox()

# go to page
driver.get("http://twitter.com/XXXXXX/media")

#You can adjust it but this works fine
SCROLL_PAUSE_TIME = 2

# Get scroll height
last_height = driver.execute_script("return document.body.scrollHeight")

while True:
    # Scroll down to bottom
    driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")

    # Wait to load page
    time.sleep(SCROLL_PAUSE_TIME)

    # Calculate new scroll height and compare with last scroll height
    new_height = driver.execute_script("return document.body.scrollHeight")
    if new_height == last_height:
        break
    last_height = new_height


# Now that the page is fully scrolled, grab the source code.
src = driver.page_source

#Past it into BS
soup = BeautifulSoup(src, 'html.parser')
divs = soup.find_all('div',class_='account')

#PRINT RESULT
#print('printing results')
#for div in divs:
#    print(div['data-user-id'])


#SAVE IN FILE
print('Saving results')    
with open('file.txt','w') as f:
   for div in divs:
        f.write(div['data-user-id']+'\n')   

因此程序运行正常。它检索id并将其打印或将其写入txt文件。现在,我可以将此ID列表粘贴到Calc中,并添加数据透视表以查看每个单个ID被标记了多少次。 但!我仍然有一些问题:

-我仅获得ID,而不获得用户名。现在更简单了:在收集ID的同时收集用户名并将它们放到文件中吗?还是将ids文件转换为用户名文件?最后的解决方案怎么可能?

-我无法无限向下滚动。我回到了2018年9月,仅此而已。它只是说“回到顶部”。现在,是因为我没有登录Twitter还是由于某些内置限制?

如果您有任何意见,想法等,任何帮助将不胜感激。 谢谢!

EDIT1: 我从here找到了这个(Tweepy)解决方案:

def get_usernames(ids):
    """ can only do lookup in steps of 100;
        so 'ids' should be a list of 100 ids
    """
    user_objs = api.lookup_users(user_ids=ids)
    for user in user_objs:
        print(user.screen_name)

因此,由于我的列表超过100个,因此我应该这样做:

  

对于更大的一组ID,您可以将其放在for循环中并调用   遵守twitter API限制。

1 个答案:

答案 0 :(得分:0)

您的代码没有为我生成ID,因此最初无法测试这些解决方案。由于我没有调查问题,因此不确定是什么问题,但似乎我的源html没有任何class='account'。因此,我在代码中将其更改为仅说:“查找所有具有属性“ data-user-id”的div标签:

 divs = soup.find_all('div', {"data-user-id" : re.compile(r".*")})

1)要拥有一个csv,您只需编写并另存为csv,而不是txt。另一个选择是使用ID创建一个数据框,然后使用pandas通过df.to_csv('path/to/file.csv')

写入csv

2)将其放入列表也是一件很容易的事情。

创建ID列表-for循环

#TO PUT INTO LIST (FOR LOOP)
id_list = []
for div in divs:
    id_list.append(div['data-user-id'])

print (id_list)

创建ID列表-列表理解

#TO PUT INTO LIST (LIST COMPREHENSION)
id_list = [ div['data-user-id'] for div in divs ]

写入CSV

#SAVE IN FILE
import csv
print('Saving results')    
with open('file.csv','w', newline='') as f:
    writer = csv.writer(f)
    for div in divs:
        writer.writerow([div['data-user-id']])