当 url 保持不变(但给出 ajax 响应)时,Web 抓取多个页面

Posted

技术标签:

【中文标题】当 url 保持不变(但给出 ajax 响应)时,Web 抓取多个页面【英文标题】:Webscraping multiple pages when the url remains the same (but given an ajax response) 【发布时间】:2017-12-26 19:17:40 【问题描述】:

我正在尝试从 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>

总的来说,我对网络抓取非常陌生,不知道如何从中获取我需要的信息。任何朝着正确方向的点都会很棒。

谢谢

【问题讨论】:

要么注意 Ajax 请求 URL 的模式,要么使用 selenium 【参考方案1】:

如果您要“驱动”网页,那么我建议您使用网络驱动程序。 https://www.seleniumhq.org/projects/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 对象在页面上,你很漂亮。您可以使用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

您可以将此过程置于循环中,直到不再出现“下一页”元素为止。

【讨论】:

以上是关于当 url 保持不变(但给出 ajax 响应)时,Web 抓取多个页面的主要内容,如果未能解决你的问题,请参考以下文章

从 url 不变的站点中抓取响应表

java重定向时如何保持地址栏不变

ajax加载的内容页面刷新之后,内容怎么保持不变?

如何用ajax实现,刷新页面时,页面设置的下拉菜单(select)、raido保持不变?

如何通过 URL 更改而不是页面重定向进行 ajax 加载?

父页面刷新 保持iframe页面url不变