当网址保持不变时(但给出ajax响应),网页刮刮多个网页

问题描述 投票:3回答:1

我正试图在Goodreads.com上搜索特定书籍的所有评论。

url= https://www.goodreads.com/book/show/320.One_Hundred_Years_of_Solitude?ac=1&from_search=true

这在使用python和Beautiful Soup的第一页上非常成功,但我的问题是试图抓住后续评论页面。我遇到了问题,因为生成的每个新页面都有相同的URL(所以我只在第1页上获得评论)。当我检查html时,似乎新页面是通过ajax请求生成的。

<a class="previous_page" href="#" onclick="new Ajax.Request('/book/reviews/320.One_Hundred_Years_of_Solitude?authenticity_token=sZXyhbZUmjF0yvXFy3p2w3PllReMI02adUUeA5yOHzvY1ypaIv1z9e70UMgH1mDpx5FHr%2FakQ4rG7Ge5ZoD6zQ%3D%3D&amp;amp;hide_last_page=true&amp;amp;page=1', {asynchronous:true, evalScripts:true, method:'get', parameters:'authenticity_token=' + encodeURIComponent('4sfXlAmAjNZyCOAnywx+OVJZ1rHkR3E065/m/pbsTC6LhQ9LnSllEug2RSoHoGgT5i0ECZ7AfyRYNp9EbOKp2A==')}); return false;">« previous</a>

我对网络抓取很新,并且不知道如何从中获取我需要的信息。正确方向上的任何点都会很棒。

谢谢

python html ajax web-scraping beautifulsoup
1个回答
0
投票

如果您要“开车”网页,那么我建议您使用网络驱动程序。 https://www.seleniumhq.org/projects/webdriver/

Webdriver可以打开一个“无头”浏览器,您可以使用Selenium的API进行操作。例如,在这种情况下,您将打开浏览器并通过以下方式导航到您的页面:

from selenium import webdriver
browser = webdriver.Firefox() # open a browser
browser.get("https://www.goodreads.com/book/show/320.One_Hundred_Years_of_Solitude?ac=1&from_search=true") # open your webpage

现在你是browser对象是在页面上你是美丽的souping。您可以使用browser.page_source获取html,然后将其炖煮:

html = browser.page_source
soup = BeautifulSoup(html, 'html.parser')

然后你可以用汤做任何你想做的事。当您准备好接收下一页评论时,您可以告诉浏览器单击按钮,等待一秒钟加载,然后再次获取汤:

element = browser.find_element_by_id("your_element_id")
element.click()
time.sleep(3) # sleep three seconds so page can load

html = browser.page_source # now this has new reviews on it
soup = BeautifulSoup(html, 'html.parser') # now you have soup again, but with new reviews

您可以循环执行此过程,直到不再显示“下一页”元素。

© www.soinside.com 2019 - 2024. All rights reserved.