簡體   English   中英

抓取分頁網站:抓取第2頁返回第1頁結果

[英]Scraping a paginated website: Scraping page 2 gives back page 1 results

我正在使用python中的請求庫的get方法來從組織成頁面的網站(即,在底部用數字分頁)中抓取信息。

頁面1鏈接: https : //realfood.tesco.com/search.html?DietaryOption=Vegetarian

我能夠從第一頁中提取所需的數據,但是當我向代碼提供第二頁的URL時,也會從第一頁獲得相同的數據。 現在,在仔細分析我的代碼之后,我確定問題不是我的代碼邏輯,而是第二頁url的結構方式。

所以我的問題是如何使我的代碼按我的意願工作。 我懷疑這是參數問題,但我不確定100%。 如果確實是我需要傳遞給請求的參數,我將對如何分解參數提供一些指導。 我的第2頁鏈接附在下面。 謝謝。

第2頁鏈接: https ://realfood.tesco.com/search.html?DietaryOption = Vegetarian#!q = 'selectedobjecttype%3DRECIPES%26page%3D2%26perpage%3D30%26DietaryOption%3DVegetarian'

注意:這些頁面本身並不是真正的鏈接。

看起來平台是ASP.NET,分頁鏈接由JS操作。 我非常懷疑您使用python會容易,因為beautifulsoup是HTML解析器/提取器,因此,如果您真的想使用此網站,我建議您研究Selenium或PhantomJS,因為它們完全復制了瀏覽器。

但是在這種特殊情況下,您很幸運,因為有一個舊版網站版本沒有使用現代功能:)

http://legacy.realfood.tesco.com/recipes/search.html?st=vegetarian&cr=False&page=3&srt=search相關性

該網站的分頁似乎由您發布的第二個URL中傳遞的查詢參數處理,即:

https://realfood.tesco.com/search.html?DietaryOption=Vegetarian#!q='selectedobjecttype%3DRECIPES%26page%3D2%26perpage%3D30%26DietaryOption%3DVegetarian'

查詢字符串是url編碼的。 %3D是=,%26是&。 這樣可能更易讀:

q='selectedobjecttype=RECIPES&page=2&perpage=30&DietaryOption=Vegetarian'

例如,如果您想退回素食食譜的第五頁,URL將如下所示:

https://realfood.tesco.com/search.html?DietaryOption=Vegetarian#!q='selectedobjecttype%3DRECIPES%26page%3D5%26perpage%3D30%26DietaryOption%3DVegetarian '

您可以不斷增加頁碼,直到得到沒有結果的頁面,如下所示

那這個呢?

from bs4 import BeautifulSoup
import urllib.request

for numb in ('1', '10'):
    resp = urllib.request.urlopen("https://realfood.tesco.com/search.html?DietaryOption=Vegetarian")
    soup = BeautifulSoup(resp, from_encoding=resp.info().get_param('charset'))

    for link in soup.find_all('a', href=True):
        print(link['href'])

希望它對您有用。 我無法測試它,因為我的辦公室擋住了這類事情。 今晚回家時我會嘗試一下,看看它是否能完成應做的工作...

暫無
暫無

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

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