抓取下一页

Scraping next pages

我有一个代码可以在 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) before request new url 是为了避免网站设置的限制。

你只需要聪明地看待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 捕获中终止程序,其中 url 不会加载,因为没有更多页面。

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

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