【发布时间】:2017-07-28 18:47:25
【问题描述】:
接下来的爬行虽然很短,但速度非常慢。我的意思是,“在一部完整的故事片中流行”,慢。
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 以访问每位女演员的 wiki,并在其中获取她的出生日期.该数据将用于计算每位女演员被提名或获得奥斯卡最佳女演员奖的年龄。除了 Big 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
【问题讨论】:
-
如果速度是第一优先,那么我建议将您的解析器重写(或集成)到
Scrapy框架。 -
感谢您的回复!该代码现在正在 Spyder 中运行,并将被传输到 Jupyter 笔记本,在那里它将与用于补充的数据分析和统计数据一起使用。 Scrapy 需要它自己的目录,并且无法与 Jupyter 中的 Pandas + stats 包集成,不是吗?
-
好吧,我认为你把事情搞混了——
Spyder和Jupyter是 IDE。换句话说,Scrapy 是一个有自己的东西的模块,例如,BeautifulSoup或任何其他用于解析的模块。我使用pandas和Scrapy,在Spyder中编写我的代码并从bash启动解析器。 -
我认为多线程/异步是@Dmitry 的观点。这里的瓶颈可能是网络 IO 但没有看到
getBestActresses()很难说。 -
@pguardiario - 不知道如何对除针之外的任何东西进行多线程处理。不过,我会发布 getBestActresses() 供您查看。没什么。它只是从 wiki 表中读取女演员姓名的链接,而且速度非常快。
标签: python-3.x web-scraping beautifulsoup web-crawler