刮取分页网站:抓第2页会返回第1页结果

时间:2017-12-03 19:40:44

标签: python beautifulsoup python-requests

我在python中使用请求库的get方法从网站中抓取信息,该网站被组织成页面(即在底部用数字分页)。

第1页链接:https://realfood.tesco.com/search.html?DietaryOption=Vegetarian

我能够从第一页提取我需要的数据,但是当我为第二页提供我的代码时,我从第一页获得相同的数据。现在仔细分析我的代码之后,我确定问题不是我的代码逻辑,而是第二页网址的结构方式。

所以我的问题是如何让我的代码按我的意愿工作。我怀疑这是一个参数问题,但我不是100%肯定。如果确实是我需要传递给请求的参数,我将不胜感激如何分解参数。我的第2页链接附在下面。 感谢。

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

注意:页面本身并不是真正的链接。

3 个答案:

答案 0 :(得分:1)

看起来平台是ASP.NET,分页链接由JS操作。我非常怀疑你用python会很容易,因为beautifulsoup是一个HTML解析器/提取器,所以如果你真的想使用这个站点,我建议你查看Selenium甚至是PhantomJS,因为它们完全复制了浏览器。

但在这种特殊情况下,你很幸运,因为有一个遗留的网站版本没有使用现代的铃声和口哨:)

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

答案 1 :(得分:1)

看起来此网站的分页是由您发布的第二个网址中传递的查询参数处理的,即:

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

查询字符串是url编码的。 %3D是=和%26是&amp ;.它可能更具可读性:

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

例如,如果你想撤回素食食谱的第五页,网址将如下所示:

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

您可以继续增加页码,直到获得一个没有this结果的页面。

答案 2 :(得分:0)

这个怎么样?

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'])

希望它适合你。我无法测试它,因为我的办公室阻止了这些事情。我今晚回家的时候会试一试,看看它是否应该做它应该做的......