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

时间:2017-07-20 21:49:07

标签: python html ajax web-scraping beautifulsoup

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

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

由于

1 个答案:

答案 0 :(得分:0)

如果您要“驱动”网页,那么我建议您使用网络驱动程序。 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

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