用beautifulsoup抓取大量数据,进程被扼杀



每页正好有100个项目。我想是某种类型的内存限制导致了它的死亡。此外,我有一种感觉,在内存效率方面,将项目附加到列表变量很可能不是最佳实践。打开一个文本文件并写入它会更好吗?我用10个页面做了一个测试,它成功地创建了列表,花了大约12秒。然而,当我用9500个页面尝试时,这个过程在大约一个小时内自动终止。

import requests
from bs4 import BeautifulSoup
import timeit
def lol_scrape():
start = timeit.default_timer()
summoners_listed = []
for i in range(9500):
URL = "https://www.op.gg/leaderboards/tier?region=na&page="+str(i+1)
user_agent = {user-agent}
page = requests.get(URL, headers = user_agent)
soup = BeautifulSoup(page.content, "html.parser")
results = soup.find('tbody')
summoners = results.find_all('tr')
for i in range(len(summoners)):
name = summoners[i].find('strong')
summoners_listed.append(name.string)

stop = timeit.default_timer()
print('Time: ', stop - start)
return summoners_listed

信用给@1extralme

我所做的只是为每个页面制作一个csv,而不是不断地添加到一个超长的列表中。

from bs4 import BeautifulSoup
import timeit
import pandas as pd
def lol_scrape():
start = timeit.default_timer()
for i in range(6500):
# Moved variable inside loop to reset it every iteration
summoners_listed = []
URL = "https://www.op.gg/leaderboards/tier?region=na&page="+str(i+1)
user_agent = {user-agent}
page = requests.get(URL, headers = user_agent)
soup = BeautifulSoup(page.content, "html.parser")
results = soup.find('tbody')
summoners = results.find_all('tr')
for x in range(len(summoners)):
name = summoners[x].find('strong')
summoners_listed.append(name.string)

# Make a new df with the list values then save to a new csv
df = pd.DataFrame(summoners_listed)
df.to_csv('all_summoners/summoners_page'+str(i+1))  

stop = timeit.default_timer()
print('Time: ', stop - start)

也作为我未来的自己或其他阅读者的一个注解。这种方法非常优越,因为如果过程在任何时候失败,我都保存了所有成功的csv,并且可以在它停止的地方重新启动。

最新更新