(Python 3,BeautifulSoup 4)-在Div中进行刮页分页

(Python 3,BeautifulSoup 4)-在Div中进行刮页分页,python,web-scraping,beautifulsoup,Python,Web Scraping,Beautifulsoup,我可以浏览此网站的第一页: 但我正试图通过使用网站分页中的“下一步”按钮来刮除网站上的所有其他页面 我单击了Next按钮,可以看到第2页的参数从0/1/10更改为0/2/10,以此类推 我已经查看了分页代码,我可以看到分页在一个Div中 <div id="pagingNext" class="link-wrapper"> 这是可行的,但由于我目前正在抓取的这个网站似乎没有为下一个按钮URL提供a href,我不知道如何尝试和抓取它 我试过: button_next = soup

我可以浏览此网站的第一页:

但我正试图通过使用网站分页中的“下一步”按钮来刮除网站上的所有其他页面

我单击了Next按钮,可以看到第2页的参数从0/1/10更改为0/2/10,以此类推

我已经查看了分页代码,我可以看到分页在一个Div中

 <div id="pagingNext" class="link-wrapper">
这是可行的,但由于我目前正在抓取的这个网站似乎没有为下一个按钮URL提供a href,我不知道如何尝试和抓取它

我试过:

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))
但它似乎并没有刮去其他页面,只是第一页

如果有人能提供帮助,我将不胜感激

谢谢

解决方法:

当您在检查
Next
按钮时有
True
,您可以手动创建链接并通过递增数字尾在循环中打开它们,如您所写:第2页从0/1/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)
解决方法:

当您在检查
Next
按钮时有
True
,您可以手动创建链接并通过递增数字尾在循环中打开它们,如您所写:第2页从0/1/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)

无需验证
按钮\u next
url,因为您已经知道url在所有页面上的变化。因此,与使用url“我建议使用”不同,该网站提供了一次查看50个项目的选项,因此您只需浏览809个页面,而不是重复浏览4044

在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
导入请求
从bs4导入BeautifulSoup
电流=0
当前<810:#最后一页,经检查为/809/50
url=”http://ratings.food.gov.uk/enhanced-search/en-GB/%5E/London/Relevance/0/%5E/%5E/0/{:d}/50“。格式(当前)
data=requests.get(url).text
soup=BeautifulSoup(数据,“html.parser”)
打印(url)
电流+=1
#你在这儿刮吗

无需验证
按钮\u next
url,因为您已经知道url在所有页面上的变化。因此,与使用url“我建议使用”不同,该网站提供了一次查看50个项目的选项,因此您只需浏览809个页面,而不是重复浏览4044

在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
导入请求
从bs4导入BeautifulSoup
电流=0
当前<810:#最后一页,经检查为/809/50
url=”http://ratings.food.gov.uk/enhanced-search/en-GB/%5E/London/Relevance/0/%5E/%5E/0/{:d}/50“。格式(当前)
data=requests.get(url).text
soup=BeautifulSoup(数据,“html.parser”)
打印(url)
电流+=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

正如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

我想你需要
Selenium
来做这件事我想你需要
Selenium
来做这件事谢谢你的回答。还有一件事,假设town I a scraping next time只有4页,例如餐厅数据,上面的代码是否每次都会查看809页,或者循环是否可能在达到最大页数时停止,例如4页,不用再循环浏览825页不存在的链接?当然,
requests.get(“http://www.thispagedoesntexists.com“”
返回错误,因此您甚至无法获取文本,一个好的解决方案是添加try、exception、statement、,因此,您可以捕获页面不存在时的错误,而不仅仅是停止代码时的错误。简而言之,您可以使用
response.status\u code!=200
来打破循环。感谢您的回复,有一件事是我尝试在下面的页面中输入“无结果”,因为伦敦只有大约4000页的餐馆,但它似乎仍然提供HTTP 200响应代码。我认为这意味着没有结果的页面在scraper中仍然会存在,并且中断循环的代码不会运行,这是对的吗?在这种情况下,可以使用页面内容链接到无结果页面,例如:
“无结果”作为响应。text
。感谢您的回答。还有一件事,假设town I a scraping next time只有4页,例如餐厅数据,上面的代码是否每次都会查看809页,或者循环是否可能在达到最大页数时停止,例如4页,不用再循环浏览825页不存在的链接?当然,
requests.get(“http://www.thispagedoesntexists.com“”
返回错误,因此您甚至无法获取文本,一个好的解决方案是添加try、exception、statement、,因此,您可以捕获页面不存在时的错误,而不仅仅是停止代码时的错误。简而言之,您可以使用
response.status\u code!=200
来打破循环。感谢您的回复,有一件事是我尝试在下面的页面中输入“无结果”,因为伦敦只有大约4000页的餐馆,但它似乎仍然提供HTTP 200响应代码。我认为这意味着没有结果的页面在scraper中仍然会存在,并且中断循环的代码不会运行,这是对的吗?链接到页面