【问题标题】:Scraping next pages抓取下一页
【发布时间】:2019-09-23 10:37:02
【问题描述】:

我有一个代码可以在 python 中抓取酒店评论(来自 yelp)。

代码完美地抓取了评论的第一页,但是,我正在努力抓取下一页。

While循环不起作用,每次循环抓取的数据都是一样的(第一页的数据)

import requests
from lxml import html
from bs4 import BeautifulSoup

url = 'https://www.yelp.com/biz/fairmont-san-francisco-san-francisco?sort_by=rating_desc'
while url:

    r = requests.get(url)
    t = html.fromstring(r.content)
    for i in t.xpath("//div[@class='review-list']/ul/li[position()>1]"):
        rev = i.xpath('.//p[@lang="en"]/text()')[0].strip()
        date = i.xpath('.//span[@class="rating-qualifier"]/text()')[0].strip()
        stars = i.xpath('.//img[@class="offscreen"]/@alt')[0].strip().split(' ')[0]
        print(rev)
        print(date) 
        print(stars) 

    next_page = soup.find('a',{'class':'next'})
    if next_page:
        url = next_page['href']
    else:
        url = None

    sleep(5)

这里 sleep(5) 在请求新 url 之前是为了避免网站设置的限制。

【问题讨论】:

    标签: python web-scraping beautifulsoup python-requests lxml


    【解决方案1】:

    以下是完成工作的方法之一。我稍微修改了您现有的遍历下一页的逻辑。试一试。

    import requests
    from lxml.html import fromstring
    
    url = 'https://www.yelp.com/biz/fairmont-san-francisco-san-francisco?sort_by=rating_desc'
    
    while True:
        res = requests.get(url)
        root = fromstring(res.text)
        for item in root.xpath("//div[@class='review-list']/ul/li[position()>1]"):
            rev = item.xpath('.//p[@lang="en"]/text()')[0].strip()
            print(rev)
    
        next_page = root.cssselect(".pagination-links a.next")
        if not len(next_page): break
        url = next_page[0].get('href')
    

    【讨论】:

      【解决方案2】:

      您只需要聪明地查看 URL。大多数网站都遵循页面进度计划。在这种情况下,它似乎更改为下一页的以下格式:

      https://www.yelp.com/biz/fairmont-san-francisco-san-francisco?start=20&sort_by=rating_desc
      

      start=20 是我们应该寻找的地方。在 while 循环结束时重写 url。一旦它到达页面的末尾,它应该将 20 添加到该数字,然后将其放入字符串中。像这样:

      pagenum = 0
      while url
          pagenum += 20
          url = "https://www.yelp.com/biz/fairmont-san-francisco-san-francisco?start=" + pagenum + "&sort_by=rating_desc"
      

      然后在 try/except catch 中终止程序,因为没有更多页面,因此无法加载 url。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-12-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-06-21
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多