【发布时间】:2019-10-14 18:30:36
【问题描述】:
使用 20k+ url 的 csv,我想抓取并找到 html 元素“super-attribute-select”。如果找到,将 url 写入 A 列,将产品编号 (sku) 写入 B 列。如果找不到,将 url 写入 C 列,将 sku 写入 D 列。最后,将数据框保存到 csv 文件。
如果我运行以下代码,它可以工作,但我的程序内存不足。它喜欢找到一种方法来优化它。现在约 1500 个网址需要 5 小时来处理。而整个 csv 是 20k。
import urllib.request
from bs4 import BeautifulSoup
import pandas as pd
import numpy as np
from pandas import Series
urlList = pd.read_csv(r"url.csv")
urlList = urlList.url.tolist()
notfound = []
found = []
skulist =[]
skumissinglist =[]
# Function scrape, pass url, open with soup, and find class
def scrape(url):
tag ='select'
classused = "super-attribute-select"
d = dict(A=np.array(found), B=np.array(skulist), C=np.array(notfound), D=np.array(skumissinglist))
try:
content = urllib.request.urlopen(url)
soup = BeautifulSoup(content, features="html.parser")
sku= soup.find("div", {"itemprop": "sku"}).string
result = soup.find(tag, class_=classused)
#soup returns None if can't find anything
if result == None:
notfound.append(url)
skumissinglist.append(sku)
else:
found.append(url)
skulist.append(sku)
except:
result = print("Some extraction went wrong")
df = pd.DataFrame(dict([(k, Series(v)) for k, v in d.items()]))
df = df.to_csv('Test.csv')
for i in urlList:
scrape(i)
【问题讨论】:
-
对于内存优化做:每次你使用 'with .... open' 抓取一行时将其转储到 csv 中,对于时间优化,使用多线程而不是顺序循环过程
-
仅供参考,它是 scrape(和 scraper、scraping、scraped)而不是 scrap
标签: python pandas optimization beautifulsoup numpy-ndarray