我试图网页抓取的酒店是在谷歌酒店的名单.然而,我不能想出一个办法来绕过谷歌上的分页,作为网址保持几乎相同,只有一些事情的变化.见下面的链接和截图
Hotel List Dublin on Google
我想知道这里是否有人以前通过过这个问题?
我已经成功地从第1页的数据刮,但我需要这样做的每一页是有
我现在的代码见下面。我已经注解掉了下一页的部分,因为我不知道如何让它工作
from bs4 import BeautifulSoup
import requests
import sys
import csv
import pandas as pd
from lxml import html
url = f"https://www.google.com/travel/hotels?hrf=CgUIrAIQACIDRVVSKhYKBwjjDxAMGBMSBwjjDxAMGBQYASgAsAEAWAFoAZoBLhIGRHVibGluGiQweDQ4NjcwZTgwZWEyN2FjMmY6MHhhMDBjN2E5OTczMTcxYTCiARIKCC9tLzAyY2Z0EgZEdWJsaW6qAQoKAgghEgIIFRgBqgEWCgIIHBICCAcSAghREgIIRxICCDYYAaoBCgoCCCUSAgh3GAGqARIKAggREgIIKhICCDgSAggCGAGqARcKAgguEgIIPBICCDsSAwiBARICCCcYAaoBCgoCCFASAghPGAGqAQwKAwijARIDCKQBGAE&tcfs=EiwKCC9tLzAyY2Z0EgZEdWJsaW4aGAoKMjAxOS0xMi0xORIKMjAxOS0xMi0yMFIA&rp=aAFIAg&destination=Dublin&ap=MABoAA"
data = {
'name': [],
'star': [],
'rating': [],
'reviews': [],
'price': []
}
def export(data):
table = pd.DataFrame(data, columns=['name','rating','reviews','star','price'])
table.to_csv('Listings.csv', sep = ',', encoding = 'utf-8-sig', index=False)
def getHotel(hotel):
name = hotel.find(class_='BgYkof ogfYpf ykx2he').get_text()
star = hotel.find(class_='sSHqwe r10jJf').get_text()
rating = hotel.find(class_='sSHqwe').get_text()
reviews = hotel.find(class_='sSHqwe uTUoTb fOuaIb XLC8M').get_text()
price = hotel.find(class_='A9rngd wNqaKc idHpEf').get_text()
data['name'].append(name.strip())
data['star'].append(star.strip())
data['rating'].append(rating.strip())
data['reviews'].append(reviews.strip())
data['price'].append(price.strip())
export(data)
#def parse_page(url):
page = requests.get(url)
soup = BeautifulSoup(page.text, 'lxml')
hotels = soup.findAll(class_='f1dFQe')
for hotel in hotels:
getHotel(hotel)
# next_page_text = soup.find(class_='RveJvd snByac').text
# print(next_page_text)
# if next_page_text == 'Next':
# next_page_url = soup.find('a', class_='nextprev_on')['href']
# print(next_page_url)
# parse_page(url)
# else:
# export(data)
#parse_page(url)
下面是网页上按钮的HTML截图
2条答案
按热度按时间mec1mxoz1#
你必须找到下一个页面的url,然后请求并解析它。看起来你已经注解掉了这样做的代码。问题是你依赖于混淆的类名。你可能会有更一致的结果与它们的元素。最后,我有一个更好的和更易于管理的使用Scrapy的经验。
更新我对你的评论的回答:我注意到
jsname
被保持为一个分页:$('div[jsname="WUPT1e"]')
获取按钮,但Google故意将其编码为很难解析生成的URL。Beautiful Soup和请求库不与页面交互。您需要一个可以与 AJAX 交互的无头Web驱动程序。我建议通过一个代理运行第一个URL来抓取下一个页面结果的生成URL,然后用Beautiful解析抓取的URL汤和要求。搜索'Scrapy'和'Selenium'应该会返回有帮助的结果。https://towardsdatascience.com/web-scraping-a-simple-way-to-start-scrapy-and-selenium-part-i-10367164c6c0
f8rj6qna2#
Google酒店的UI页面已经改变,现在要获得所有您需要向下滚动页面的结果,在此期间将添加新的结果。
你可以使用python浏览器自动化,比如selenium。
在我们的示例中,可以使用
while
循环实现滚动的动态分页:检查联机IDE中的代码示例。
输出示例:
如果你想了解更多关于网站抓取的信息,可以阅读13 ways to scrape any public data from any website博客文章。