超过网站的限制,抓取网站的所有列表

时间:2019-12-09 04:22:05

标签: python web-scraping data-science

我正在尝试抓取类似于Yelp的食品评论网站。我已经完成了抓取单个页面并获得单个餐厅信息的部分。但是我遇到了这个问题,该网站有超过90万个列表,但页码最多只有60个,最多显示1200个列表。即使我缩小过滤器范围并遍历每个过滤器选项,每个过滤器下的清单仍将超过1200。 我正在使用请求和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'])

2 个答案:

答案 0 :(得分:0)

这完全取决于站点(因此,您必须共享您实际抓取的站点以获得更多帮助),但是大多数情况下,该站点显示的内容并不是爬网的唯一方法(也许分页显示的次数超出了网站显示的限制)。

另一种替代方法是检查网站是否有robots.txt文件,该文件应在https://www.example.com/robots.txt中找到,您可以从中查看是否存在某些普通导航无法找到的链接。

最终的真正建议是使用网络爬网框架(我建议scrapy),因为如果您访问该网站的次数过多,由于以下原因,您将面临很多问题您的请求速度。该框架可以帮助您设置一些延迟并按照某些规则自动重试,因此当您面对这些常见的爬网挑战时,它将使您的生活变得更加轻松。

答案 1 :(得分:0)

像您这样的声音已经为这项工作搭建了一个非常不错的刮板;在搜索“下一页”箭头链接的类别之前,我已经做了类似的事情,以告诉我的抓取工具何时进入下一部分(在请求中使用下一个偏移量增加下一个URL);这是一种方法。第二种方法是找到一个标识符并创建一个计数器以对发生的总数进行计数,以指导您的刮板在哪里停止以及在哪里进行其他审核。

理想情况下,查找下一页标签是了解何时可以偏移和前进的最佳选择。如果您处理未知实例的动态页面,则应该找到一种方法来计数和抓取直到计数器结束;实现此目的的另一种方法是修改源代码,方法是将HTML中的文本替换为某个字符,以创建自己的地标(如果可行)。