2017-07-18 53 views
1
刮分頁

我可以湊這個網站的第一頁:(Python 3中,BeautifulSoup 4) - 在股利

http://ratings.food.gov.uk/enhanced-search/en-GB/%5E/London/Relevance/0/%5E/%5E/0/1/10

但我嘗試使用刮網站上的所有其它頁面網站分頁中的「下一步」按鈕。

我已經點擊了下一步按鈕,我可以看到參數的變化是從0/1/10到0/2/10頁2等等。

我已經看過了分頁代碼,我可以看到,分頁是一個DIV

<div id="pagingNext" class="link-wrapper"> 

的問題是我用下面的代碼只有順利地刮取分頁從其他網站:

button_next = soup.find("a", {"class": "btn paging-next"}, href=True) 
while button_next: 
    time.sleep(2)#delay time requests are sent so we don't get kicked by server 
    soup=makesoup(url = "https://www.propertypal.com{0}".format(button_next["href"])) 

這個工作,但這個網站我目前刮似乎並沒有提供AA HREF爲下一步按鈕URL,我失去了對如何嘗試和刮它

我試過了:

button_next = soup.find("div", {"class": "paging-Next"}) 
while button_next: 
    time.sleep(2)#delay time requests are sent so we don't get kicked by server 
    soup=makesoup(url = "https://www.propertypal.com{0}".format(button_next)) 

但它似乎並沒有刮掉其他頁面,只是第一頁還在。

如果任何人都可以提供幫助,我會非常感激。

感謝

+0

我認爲你需要'Selenium'這個 –

回答

3

沒有必要覈實button_next網址,因爲你已經知道的URL是如何改變翻過所有頁面。因此,我建議使用「http://ratings.food.gov.uk/enhanced-search/en-GB/%5E/London/Relevance/0/%5E/%5E/0/1/50」,而不是使用網址「http://ratings.food.gov.uk/enhanced-search/en-GB/%5E/London/Relevance/0/%5E/%5E/0/1/10」,網站提供此選項以便一次查看50個項目,因此,而不是遍歷4044,您只會瀏覽809頁。

在while循環中,我們正在等待current爲810,所以我們知道最後一頁因爲檢查而被刮掉,/809/50是最後一頁。

import requests 
from bs4 import BeautifulSoup 

current = 0 
while current < 810: # Last page, by inspection is /809/50 
    url = "http://ratings.food.gov.uk/enhanced-search/en-GB/%5E/London/Relevance/0/%5E/%5E/0/{:d}/50".format(current) 
    data = requests.get(url).text 
    soup = BeautifulSoup(data, "html.parser") 
    print(url) 
    current += 1 
    # Do your scraping here 
+0

感謝您的回答。還有一件事,比方說我下次刮垃圾的小鎮只有4頁,例如餐廳的數據,上面的代碼每次都會查看809頁,或者當它到達時,循環可能停止最大數量的頁面,例如4頁,而不必循環訪問另外825頁不存在的鏈接? –

+0

當然,'requests.get(「http://www.thispagedoesntexists.com」)返回一個錯誤,因此你甚至不會得到文本,一個好的解決方案是添加一個try,exception,statement,所以你在頁面不存在時捕獲,而不僅僅是停止代碼的錯誤。 –

+2

總之,您可以使用'response.status_code!= 200'來打破循環。 –

3

解決方法:

,而你在你的Next按鈕的檢查有True,您可以手動創建鏈接,並通過增加數字尾巴,就像你寫的循環打開它們:從0/1 /第2頁的10到0/2/10等等。

是這樣的:

base_ur = 'http://ratings.food.gov.uk/enhanced-search/en-GB/%5E/London/Relevance/0/%5E/%5E/0/' # deleting 1/10 

incr = 0 
while button_next: 
    incr+=1 
    next_url = base_url + str(incr)+'/10' 
    page = urllib.requests.urlopen(next_url) 
    (and then scraping goes) 
+0

感謝您的回答。還有一件事,比方說我下次刮垃圾的小鎮只有4頁,例如餐廳的數據,上面的代碼每次都會查看809頁,或者當它到達時,循環可能停止最大數量的頁面,例如4頁,而不必循環訪問另外825頁不存在的鏈接?編輯刪除 –

+0

在這種情況下,當你想處理有限數量的頁面(並且你知道這個數量的頁面)我會替換''while''循環' –

1

這是在這種情況下,用盡所有的頁面,甚至不知道它有多少頁跨爲先生t.m.adam已經提到蔓延的最佳方法。試試這個。它會給你所有的名字。

import requests 
from bs4 import BeautifulSoup 

target_url = url = "http://ratings.food.gov.uk/enhanced-search/en-GB/%5E/London/Relevance/0/%5E/%5E/0/{}/10" 

page_num = 1 
while True: 
    response = requests.get(target_url.format(page_num)) 
    if response.status_code == 404: # break once the page is not found 
     break 
    print("Scraping Page Number {}".format(page_num)) 
    soup = BeautifulSoup(response.text,"lxml") 
    for item in soup.findAll("div",class_="ResultsBusinessName"): 
     name = item.findAll("a")[0].text 
     print(name.strip()) 

    page_num += 1 
+0

感謝您的回答。有一個問題,當頁面上沒有結果時,我看不到404頁面顯示在頁面上。有一條消息說「找不到結果」。正如t.m.adam所提到的,在response.text中尋找這條消息應該可行。因此,如果我將if語句更改爲response = requests.get(target_url.format(page_num)) if if response.text ==「No results Found」:#break一旦找不到頁面 break。 - 這是一個可能的解決方案嗎? –

+0

@Brendan羅傑斯,我很困惑你想從這個線程實現什麼。太多的答案,其中大部分是令人滿意的。順便說一句,爲什麼你想看404消息的原因,每當刮板發現沒有更多的頁面解析它會自動打破滿足您的要求的循環。 – SIM

+0

我不想看到404消息。我只是不確定是否在沒有找到結果的情況下顯示404消息,因爲當我訪問一個沒有結果的頁面時,即使沒有搜索結果,仍然會發送一個200狀態。 –