簡體   English   中英

在python中創建生成器的新實例

[英]Create a new instance of a generator in python

我正在嘗試抓取一個頁面,該頁面具有指向包含廣告的頁面的許多鏈接。 我目前正在導航的工作是轉到包含廣告列表的第一頁,並獲取各個廣告的鏈接。 之后,我檢查以確保沒有通過從數據庫中提取數據來刮取任何鏈接。 下面的代碼基本上獲取了所有href屬性,並將它們作為列表加入。 之后,我根據我已抓取的頁面數據庫中存儲的鏈接列表對它進行了交叉檢查。 因此,基本上它將返回我尚未抓取的鏈接列表。

@staticmethod
def _scrape_home_urls(driver):
    home_url_list = list(home_tab.find_element_by_tag_name('a').get_attribute('href') for home_tab in driver.find_elements_by_css_selector('div[class^="nhs_HomeResItem  clearfix"]'))
    return (home_url for home_url in home_url_list if home_url not in(url[0] for url in NewHomeSource.outputDB()))

一旦抓取了該頁面的所有鏈接,便轉到下一個頁面。 我試圖通過再次調用_scrape_home_urls()重用它

    NewHomeSource.unique_home_list = NewHomeSource._scrape_home_urls(driver)
    for x in xrange(0,limit):

        try:
            home_url = NewHomeSource.unique_home_list.next()

        except StopIteration:
            page_num = int(NewHomeSource.current_url[NewHomeSource.current_url.rfind('-')+1:]) + 1 #extract page number from url and gets next page by adding 1. example: /.../.../page-3
            page_url = NewHomeSource.current_url[:NewHomeSource.current_url.rfind('-')+1] + str(page_num)
            print page_url
            driver.get(page_url)
            NewHomeSource.current_url = driver.current_url
            NewHomeSource.unique_home_list = NewHomeSource._scrape_home_urls(driver)
            home_url = NewHomeSource.unique_home_list.next()

            #and then I use the home_url to do some processing within the loop

提前致謝。

在我看來,如果您將可將連續頁面抓取的邏輯放入生成器函數中,您的代碼將簡單得多。 這將讓你使用for循環,而不是瞎搞,並呼吁next的發電機直接對象:

def urls_gen(driver):
    while True:
        for url in NewHomeSource._scrape_home_urls(driver):
            yield url
        page_num = int(NewHomeSource.current_url[NewHomeSource.current_url.rfind('-')+1:]) + 1 #extract page number from url and gets next page by adding 1. example: /.../.../page-3
        page_url = NewHomeSource.current_url[:NewHomeSource.current_url.rfind('-')+1] + str(page_num)
        print page_url
        driver.get(page_url)
        NewHomeSource.current_url = driver.current_url

這將透明地跳過沒有任何未處理鏈接的頁面。 生成器函數無限期產生url值。 要像您的舊代碼那樣以一個限制進行迭代,請使用enumerate並在達到限制時break

for i, home_url in urls_gen(driver):
    if  i == limit:
        break

    # do stuff with home_url here

除了更改迭代所需的內容之外,我沒有更改您的代碼。 但是,還有很多其他方面可以改進。 例如,使用比NewHomeSource.current_url短的變量會使該行顯示頁碼,然后顯示下一頁的URL更加緊湊和可讀。 我也不清楚該變量最初在哪里設置。 如果不在此循環之外的任何地方使用它,則可以輕松地將其更改為urls_gen的局部變量。

您的_scrape_home_urls函數可能效率也很低。 好像它對返回的每個URL進行數據庫查詢(在檢查所有URL之前不是一次查詢)。 也許這就是您想要的,但是我懷疑用另一種方法會快得多。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM