以下抓取虽然很短,但速度很慢。我的意思是,“在一部长篇电影中流行,”慢。优化网络抓取
def bestActressDOB():
# create empty bday list
bdays = []
# for every base url
for actress in getBestActresses("https://en.wikipedia.org/wiki/Academy_Award_for_Best_Actress"):
# use actress list to create unique actress url
URL = "http://en.wikipedia.org"+actress
# connect to html
html = urlopen(URL)
# create soup object
bsObj = BeautifulSoup(html, "lxml")
# get text from <span class='bday">
try:
bday = bsObj.find("span", {"class":"bday"}).get_text()
except AttributeError:
print(URL)
bdays.append(bday)
print(bday)
return bdays
它吸引从表中一个维基百科的页面上被提名为奥斯卡奖每一个女演员的名字,然后将其转换是一个列表,使用这些名称创建URL来访问每个女演员维基,它抓起她的出生日期。这些数据将被用来计算每个女演员提名或赢得奥斯卡最佳女主角奖的年龄。除了大O之外,有没有办法实时加速实现。我几乎没有这方面的经验,所以我不确定这是多么正常。思考?
编辑:请求子程序
def getBestActresses(URL):
bestActressNomineeLinks = []
html = urlopen(URL)
try:
soup = BeautifulSoup(html, "lxml")
table = soup.find("table", {"class":"wikitable sortable"})
except AttributeError:
print("Error creating/navigating soup object")
table_row = table.find_all("tr")
for row in table_row:
first_data_cell = row.find_all("td")[0:1]
for datum in first_data_cell:
actress_name = datum.find("a")
links = actress_name.attrs['href']
bestActressNomineeLinks.append(links)
#print(bestActressNomineeLinks)
return bestActressNomineeLinks
如果速度是№1的优先级,那么我建议您将解析器重写(或集成)为['Scrapy'](https://doc.scrapy.org/en/latest/)框架。 –
感谢您的回复!这段代码现在正在Spyder中运行,并将被转移到Jupyter笔记本上,在那里它将使用数据分析和它用于补充的统计数据。 Scrapy需要一个自己的目录,无法与Jupyter中的Pandas + stats包集成,不是吗? – Ryan
好吧,我想你混淆了事情 - 'Spyder'和'Jupyter'是IDE。换句话说,如果我们称之为Scrapy是一个带有自己内容的模块,就像例如'BeautifulSoup'或任何其他用于解析的模块一样。我用'Scrapy'使用了'pandas',在'Spyder'中写了我的代码并从'bash'启动了解析器。 –