我有一个代码可以用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)是为了避免网站设置限制。
答案 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由于没有更多页面而无法加载。