刮下一页

时间:2019-05-05 16:47:34

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

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

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:1)

您只需要对查看URL有所了解。大多数网站都遵循页面进度计划。在这种情况下,下一页似乎更改为以下格式:

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

我们应该从哪里开始= 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由于没有更多页面而无法加载。