无法让我的脚本仅从顽固网站的下一页获取链接

Posted

技术标签:

【中文标题】无法让我的脚本仅从顽固网站的下一页获取链接【英文标题】:Can't make my script fetch only the links from next pages from a stubborn website 【发布时间】:2019-11-20 14:30:40 【问题描述】:

我在 python 中创建了一个脚本,仅从一个遍历多个页面的网站中抓取指向不同餐厅的链接。我可以通过查看位于右上角的某个文本来查看有多少链接,例如:

显示 18891 的 1-30

但我无法手动或使用脚本越过this link。该网站在每个分页中将其内容增加 30。

到目前为止我已经尝试过:

import requests
from bs4 import BeautifulSoup

link = 'https://www.yelp.com/search?find_desc=Restaurants&find_loc=New%20York%2C%20NY&start='

for page in range(960,1920,30): # modified the range to reproduce the issue

    resp = requests.get(link.format(page),headers="User-Agent":"Mozilla/5.0")

    print(resp.status_code,resp.url)

    soup = BeautifulSoup(resp.text, "lxml")
    for items in soup.select("li[class^='lemon--li__']"):

        if not items.select_one("h3 > a[href^='/biz/']"):continue
        lead_link = items.select_one("h3 > a[href^='/biz/']").get("href")
        print(lead_link)

以上脚本仅从其landing page 获取链接。

如何从其他页面获取链接?

【问题讨论】:

您是否在网络浏览器中查看过这些页面?我可以打开 960 的页面,但是当我按“下一步”(查看 990)时,它会显示消息 “我们很抱歉,您请求的结果页面不可用。” 是的,看到同样的事情。我写了一个有趣的爬虫,如果你想要的话,它可以提取姓名、排名、电话、地址、评级和链接。不过,页面好像坏了。 谢谢,几个月前,作为对类似问题的回答,我创建了使用框架Scrapy 从此页面下载图像的代码:github.com/furas/python-examples ... Yelp 页面使用两个 SQL 查询:第一个统计所有结果,第二个获取当前页面的数据。如果存在差异,则第一个查询可能会给出错误的数字。或者,也许他们对第二个查询添加了限制。人们宁愿不会访问这么多页面,但它可以阻止可以阻止服务器的机器人。 出于某种原因,1000 个结果似乎是截止值?如果我大喊大叫,我可能会说“除非他们正在抓取,否则为什么有人会经历超过 1000 个结果”。哈哈。 【参考方案1】:

该页面之后没有数据。

您的代码应修改为以下 -

import requests
from bs4 import BeautifulSoup

link = "https://www.yelp.com/search?find_desc=Restaurants&find_loc=New%20York%2C%20NY&start="

for page in range(0, 960, 30):  # modified the range to reproduce the issue

    resp = requests.get(link.format(page), headers="User-Agent": "Mozilla/5.0")

    print(resp.status_code, resp.url)

    soup = BeautifulSoup(resp.text, "lxml")
    for items in soup.select("li[class^='lemon--li__']"):

        if not items.select_one("h3 > a[href^='/biz/']"):
            continue
        lead_link = items.select_one("h3 > a[href^='/biz/']").get("href")
        print(lead_link)

【讨论】:

如果这是唯一的解决方案,我已经有了。也许您忘记阅读我在同一行 for page in range(0, 960, 30) 上的评论。但是,我故意修改了范围以重现该问题。谢谢。 没有超出该范围的数据。这就是为什么你没有找到链接。如果您转到 - link,您会看到它显示“很抱歉,您请求的结果页面不可用。”【参考方案2】:

Yelp 故意阻止你这样做,试图避免你正在做的事情,因为我预计很多人会尝试为他们的网站编写爬虫。

https://www.yelp.com/robots.txt 甚至有一个异想天开的介绍,特别提到了爬行,你应该联系他们。

因此,如果您确实需要数据,请联系他们,或者尝试其他可能会漏掉的东西,例如按照 cmets 中的建议过滤郊区。

无论如何,简单的答案是yelp不允许你尝试做的事情,所以这种方式是不可能的。

【讨论】:

感谢您的建议@Endre Borza。我已经多次注意到,当一个问题没有答案或难以回答时,就会出现这个 该做什么和不该做什么 的事情,否则该网站总是有多么受限制我得到的解决方案。

以上是关于无法让我的脚本仅从顽固网站的下一页获取链接的主要内容,如果未能解决你的问题,请参考以下文章

无法使用 post 请求进入下一页

带有分页的下一页链接

Scrapy中如何获取下一页链接

wordpress 如何在子页面中导航上一页和下一页

如何在角度的行的下一列中打开routerLink?

移动到报告的下一页时出现“缺少参数值”错误