网络抓取Google时转到下一页

时间:2019-12-18 00:24:36

标签: python python-3.x web-scraping beautifulsoup

我正在尝试通过网络抓取Google宾馆上的宾馆列表。但是,我无法找出一种绕过Google分页的方法,因为URL几乎保持不变,只有一些变化。参见下面的链接和屏幕截图

Hotel List Dublin on Google

The only change I noticed in the 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屏幕截图

HTML Code on Google for Next Button

1 个答案:

答案 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

相关问题