Выскабливание следующих страниц - PullRequest
0 голосов
/ 05 мая 2019

У меня есть код для очистки отзывов об отелях на 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запросить новый URL, чтобы избежать ограничений, установленных веб-сайтом.

Ответы [ 2 ]

2 голосов
/ 05 мая 2019

Ниже приведен один из способов выполнения своей работы. Я немного изменил вашу логику обхода следующих страниц. Дайте ему шанс.

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 голос
/ 05 мая 2019

Вам просто нужно с умом смотреть на URL. Большинство веб-сайтов следуют схеме с продвижением их страниц. В этом случае кажется, что он изменяется на следующий формат для следующих страниц:

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

Где начало 20, где мы должны смотреть. Перепишите URL в конце цикла while. Как только он попадает в конец страницы, он должен добавить 20 к этому числу, а затем поместить его в строку. Вот так:

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

А затем завершить программу в попытке / исключении catch, где URL-адрес не будет загружен, потому что страниц больше нет.

...