以下に示す解析メソッドがあります。最初にページをロードするためにセレンを使用し、スパイダーから直接スクレイピングではアクセスできない特定のページにアクセスし、ページからアイテムを抽出する別の解析メソッドに個々の URL を収集します。問題は、この解析メソッドが、すべてのページにアクセスするまで他の解析をブロックすることです。これはシステムを詰まらせます。スリープを追加してみましたが、これはこのparse
方法だけでなく、エンジン全体を停止します。
これを最適化する方法、または少なくともエンジンを停止しないようにスリープを機能させる方法についての指針はありますか?
def parse(self, response):
'''Parse first page and extract page links'''
item_link_xpath = "/html/body/form/div[@class='wrapper']//a[@title='View & Apply']"
pagination_xpath = "//div[@class='pagination']/input"
page_xpath = pagination_xpath + "[@value=%d]"
display = Display(visible=0, size=(800, 600))
display.start()
browser = webdriver.Firefox()
browser.get(response.url)
log.msg('Loaded search results', level=log.DEBUG)
page_no = 1
while True:
log.msg('Scraping page: %d'%page_no, level=log.DEBUG)
for link in [item_link.get_attribute('href') for item_link in browser.find_elements_by_xpath(item_link_xpath)]:
yield Request(link, callback=self.parse_item_page)
page_no += 1
log.msg('Using xpath: %s'%(page_xpath%page_no), level=log.DEBUG)
page_element = browser.find_element_by_xpath(page_xpath%page_no)
if not page_element or page_no > settings['PAGINATION_PAGES']:
break
page_element.click()
if settings['PAGINATION_SLEEP_INTERVAL']:
seconds = int(settings['PAGINATION_SLEEP_INTERVAL'])
log.msg('Sleeping for %d'%seconds, level=log.DEBUG)
time.sleep(seconds)
log.msg('Scraped listing pages, closing browser.', level=log.DEBUG)
browser.close()
display.stop()