开发者社区> 问答> 正文

当网络抓取谷歌时转到下一页

我正试着在网上搜罗谷歌酒店的名单。但是,我无法找到一种方法来绕过谷歌上的分页,因为URL实际上保持不变,只有一些内容发生了变化。请看下面的链接和截图 酒店名单都柏林在谷歌

我想知道在座的各位之前是否有人通过这个问题? 我已经成功地从第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)

下面是web页面上按钮的HTML屏幕截图

问题来源StackOverflow 地址:/questions/59383945/go-to-next-page-when-webscraping-google

展开
收起
kun坤 2019-12-26 15:47:51 1440 0
2 条回答
写回答
取消 提交回答
  • 是否因为抓去页面返回302导致?

    2020-03-28 22:27:14
    赞同 展开评论 打赏
  • 您必须找到下一页的url,然后请求并解析它。看起来您已经注释掉了可以这样做的代码。问题是您依赖于混淆的类名。它们的元素可能会得到更一致的结果。最后,我有一个更好的和更易于管理的经验使用Scrapy。 就你的评论更新我的回答: 我注意到jsname被保留为一个分页:$('div[jsname="WUPT1e"]')获取按钮,但是谷歌故意以这样一种方式对它进行编码,这样就很难解析生成的URL。漂亮的Soup和请求库不与页面交互。您将需要一个可以与AJAX交互的无头web驱动程序。我建议通过代理运行第一个URL,以获取为下一页结果生成的URL,然后用漂亮的Soup和请求解析抓取的URL。 搜索“Scrapy”和“Selenium”应该会返回有帮助的结果。你可以这样开始:https://towardsdatascience.com/web- scraping-a-simple-wayto -start-scrapy-and- seleniumpart -i-10367164c6c0

    2019-12-26 15:47:58
    赞同 展开评论 打赏
问答分类:
问答标签:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
可编程网络视角的网络创新研究 立即下载
可编程网络和SDN3.0 立即下载
开放促进创新:构建开放网络生态 立即下载