我正在尝试通过网络抓取Google宾馆上的宾馆列表。但是,我无法找出一种绕过Google分页的方法,因为URL几乎保持不变,只有一些变化。参见下面的链接和屏幕截图
我想知道这里的人是否曾经通过过此问题?
我已经成功地从第一页抓取了数据,但是我需要为其中的每一页都做
有关我当前的代码,请参见下文。我已经注释掉了下一页的内容,因为我不知道如何使其工作
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屏幕截图
答案 0 :(得分:0)
您将必须找到下一个页面URL,然后请求并解析它。您似乎已经注释掉了可以做到这一点的代码。问题是您依赖于混淆的类名。他们的元素可能会带来更一致的结果。结束语,我使用Scrapy拥有更好,更易管理的体验。
根据您的评论更新我的答案:
我注意到jsname
保留为一个分页:$('div[jsname="WUPT1e"]')
得到了按钮,但是Google故意对按钮进行编码,这样就很难仅解析生成的URL。 Beautiful Soup和请求库不与页面交互。您将需要一个可以与AJAX交互的无头Web驱动程序。我建议通过代理运行第一个URL,以获取为下一页结果生成的URL,然后使用Beautiful Soup和请求解析获取的URL。
搜索“ Scrapy”和“ Selenium”应该会返回有用的结果。要开始使用,请:https://towardsdatascience.com/web-scraping-a-simple-way-to-start-scrapy-and-selenium-part-i-10367164c6c0