抓取下一页
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')
我有一个代码可以在 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')