【问题标题】:How to scrape multiple divs (and put them in a csv)?如何抓取多个 div(并将它们放在 csv 中)?
【发布时间】: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


【解决方案1】:

Python 有一个内置的csv module 用于编写 csv 文件。

此外,您使用的滚动脚本似乎没有工作,因为它没有一直向下滚动并在一定时间后停止。我刚刚用你的脚本在 csv 文件中获得了 1400 条记录。我已经用 pagedown 键替换了它。您可能需要调整no_of_pagedowns 来控制您想要向下滚动的数量。即使使用200 pagedowns,我也得到了大约 2200 条记录。请注意,这个数字是没有删除重复的。

我添加了一些额外的修改,以仅将唯一数据写入文件。

from bs4 import BeautifulSoup
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import time
import csv
driver = webdriver.Firefox()
driver.get("http://twitter.com/RussiaUN/media")
time.sleep(1)
elem = driver.find_element_by_tag_name("html")
no_of_pagedowns = 200
while no_of_pagedowns:
    elem.send_keys(Keys.PAGE_DOWN)
    time.sleep(2)
    no_of_pagedowns-=1


src = driver.page_source

soup = BeautifulSoup(src, 'html.parser')
divs = soup.find_all('div',class_='account')
all_data=[]
#get only unique data
for div in divs:
    single=[div['data-user-id'],div['data-screen-name']]
    if single not in all_data:
        all_data.append(single)
with open('file.csv','w') as f:
    writer = csv.writer(f, delimiter=",")
    #headers
    writer.writerow(["ID","USERNAME"])
    writer.writerows(all_data)

输出

ID,USERNAME
255493944,MID_RF
2230446228,Rus_Emb_Sudan
1024596885661802496,ambrus_drc
2905424987,Russie_au_Congo
2174261359,RusEmbUganda
285532415,tass_agency
34200559,rianru
40807205,kpru
177502586,nezavisimaya_g
23936177,vzglyad
255471924,mfa_russia
453639812,pass_blue
...

如果你想要重复,只需删除 if 条件

for div in divs:
    single=[div['data-user-id'],div['data-screen-name']]
    all_data.append(single)

【讨论】:

  • 完美地处理 csv 文件,非常感谢!!但我确实想要复制品。你的代码很好,只是有人帮助了我,给了我一些代码,给了我更多的重复。我想要做的是计算每个用户被帐户标记的次数。否则我现在保留我的滚动方法,因为它对我有用,但你的更好,因为你可以微调它。
  • 伙计,这太完美了!再次感谢!
猜你喜欢
  • 2019-08-10
  • 2019-04-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-15
  • 1970-01-01
  • 2013-04-16
相关资源
最近更新 更多