【问题标题】:Scrape all of a website's listings, Exceeding the page limit抓取网站的所有列表,超出页面限制
【发布时间】:2020-04-02 04:20:29
【问题描述】:

我正在尝试抓取类似于 Yelp 的食品评论网站。我已经完成了抓取单个页面并获取单个餐厅信息的部分。但是我遇到过这个问题,网站有超过 900k 个列表,但页码最多只有 60 个,最多显示 1200 个列表。即使我缩小过滤器并遍历每个过滤器选项,每个过滤器下的列表仍将超过 1200 个。 我正在使用 requests 和 beautifulsoup 进行抓取。 有更好或更有效的解决方案的想法吗?

def crawl_listing(url):
    response = requests.get(url)
    soup = BeautifulSoup(response.content, "html.parser")
    #code for obtaining url of each listing on this page
    return (#dict of restaurant names and urls)

def crawl_detail(url):
    response = requests.get(url)
    soup = BeautifulSoup(response.content, "html.parser")
    #code for getting all needed information about the restaurant

def main():
    full_list = []
    for page in range(30):
        address = f"https://www.example.com/list/{page}"
        full_list = full_list + crawl_listing(address)

    for restaurant in full_list:
        crawl_detail(restaurant['url'])

【问题讨论】:

    标签: python web-scraping data-science


    【解决方案1】:

    这完全取决于网站(因此您必须分享您实际抓取的网站以获得更多帮助),但大多数时候网站显示的内容并不是抓取它的唯一方法(也许可能有比网站中显示的限制更多的分页)。

    另一种方法是检查站点是否有一个robots.txt 文件,该文件应该在https://www.example.com/robots.txt 中找到,您可以从中查看是否有一些您无法正常导航的链接。

    最后也是真正的建议是使用网络爬虫框架(我推荐scrapy),因为如果您访问该网站的次数过多,您将因为速度而面临很多问题您的要求。该框架可以帮助您设置一些延迟并根据某些规则自动重试,因此当您面对那些常见的爬行挑战时,它会让您的生活更轻松。

    【讨论】:

      【解决方案2】:

      听起来你已经为这项工作构建了一个相当不错的刮板;我之前做过类似的事情,我搜索“下一页”箭头链接的类来教我的爬虫什么时候去下一部分(用下一个偏移量增加请求中的下一个 URL);这是一种方法。第二种方法是找到一个标识符并创建一个计数器来计算总出现次数,告诉你的爬虫在哪里停止以及在哪里存在其他评论。

      理想情况下,定位下一页标签是了解何时可以偏移和前进的最佳选择。如果您处理未知实例的动态页面,您应该找到一种计数和刮擦直到计数器结束的方法;另一种实现方式是通过用特定字符替换 HTML 中的文本来修改源代码,以便在有意义的情况下创建您自己的地标。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-04-29
        • 1970-01-01
        • 1970-01-01
        • 2020-04-25
        • 2013-10-01
        相关资源
        最近更新 更多