【发布时间】:2019-02-22 18:20:34
【问题描述】:
我有这段代码可以从 twitter 上的媒体中抓取标记的用户 ID:
from bs4 import BeautifulSoup
from selenium import webdriver
import time
import csv
import re
# Create a new instance of the Firefox driver
driver = webdriver.Firefox()
# go to page
driver.get("http://twitter.com/RussiaUN/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')
divs = soup.find_all('div', {"data-user-id" : re.compile(r".*")})
#PRINT RESULT
#print('printing results')
#for div in divs:
# print(div['data-user-id'])
#SAVE IN FILE
print('Saving results')
#with open('file2.csv','w') as f:
# for div in divs:
# f.write(div['data-user-id']+'\n')
with open('file.csv','w', newline='') as f:
writer = csv.writer(f)
for div in divs:
writer.writerow([div['data-user-id']])
-但我也想抓取用户名,然后将所有这些数据组织在一个带有 IDS 列和 USERNAMES 列的 csv 中。
所以我的猜测是我得先修改这段代码:
divs = soup.find_all('div', {"data-user-id" : re.compile(r".*")})
但我找不到实现这一目标的方法......
-那么我也有重复的问题。正如您在代码中看到的,有两种方法可以抓取数据:
1 #divs = soup.find_all('div',class_='account')
2divs = soup.find_all('div', {"data-user-id" : re.compile(r".*")})
第一句话似乎有效,但效率不够。 2 号工作正常,但似乎在最后给了我重复,因为它遍历所有 div 而不仅仅是class_='account'。
如果有人觉得我在这里有点垃圾邮件,我很抱歉,因为我在 24 小时内发布了 3 个问题......感谢那些帮助并将提供帮助的人。
【问题讨论】:
-
我注意到您正在尝试抓取 Twitter,而他们真的不希望您这样做。您是否考虑过在您的程序中使用Twitter API?
-
你好@Polkaguy6000。当我在 12 个月前考虑收集这些数据时,我对抓取一无所知(而且我仍然不太了解)。因此,当我尝试学习获取数据时,我认为某些 Twitter API 可以解决问题,但不……您无法通过 API 访问媒体。这就是为什么我正在抓取的帐户使用它来标记用户进行吹哨和传播宣传的原因,因为他们知道没有人能够真正分析他们正在做的事情的规模。
-
@MaxBaldwin 用户名的属性是什么 - 它是数据屏幕名称还是数据名称
-
@BittoBennichan 你好 :) 我刚刚再次检查,它是数据屏幕名称。
-
@BittoBennichan 我不知道,我在其他地方找到了这部分代码并粘贴了它,因为它似乎可以正常工作......
标签: python selenium csv twitter web-scraping