递归迭代多个网页并使用硒进行抓取

Recursively iterate over multiple web pages and scrape using selenium

本文关键字:抓取 迭代 网页 递归      更新时间:2023-09-26

这是我关于抓取网页的查询的后续问题。

我之前的问题:在 html 中固定确切的内容位置以进行网页抓取 urllib2 美丽的汤

这个问题是关于做同样的事情,但问题是在多个页面 s/视图上递归地做同样的事情。

这是我的代码

from selenium.webdriver.firefox import web driver
driver = webdriver.WebDriver()
driver.get('http://www.walmart.com/ip/29701960?page=seeAllReviews')
for review in driver.find_elements_by_class_name('BVRRReviewDisplayStyle3Main'):
    title = review.find_element_by_class_name('BVRRReviewTitle').text
    rating =review.find_element_by_xpath('.//div[@class="BVRRRatingNormalImage"]//img').get_attribute('title')
print title, rating

从 url 中,您将看到如果我们导航到第二页,则看不到任何更改,否则不会成为问题。在这种情况下,下一页点击器从服务器调用 javascript。有没有办法我们仍然可以通过对我呈现的代码进行一些轻微的修改来在 python 中使用硒来抓取它?如果有,请告诉我。

谢谢。

阅读每页后单击下一步

from selenium.webdriver.firefox import webdriver
driver = webdriver.WebDriver()
driver.get('http://www.walmart.com/ip/29701960?page=seeAllReviews')
while True:
    for review in driver.find_elements_by_class_name('BVRRReviewDisplayStyle3Main'):
        title  = review.find_element_by_class_name('BVRRReviewTitle').text
        rating = review.find_element_by_xpath('.//div[@class="BVRRRatingNormalImage"]//img').get_attribute('title')
        print title,rating
    try:
        driver.find_element_by_link_text('Next').click()
    except:
        break
driver.quit()

或者,如果您想限制正在阅读的页数:

from selenium.webdriver.firefox import webdriver
driver = webdriver.WebDriver()
driver.get('http://www.walmart.com/ip/29701960?page=seeAllReviews')
maxNumOfPages = 10; # for example
for pageId in range(2,maxNumOfPages+2):
    for review in driver.find_elements_by_class_name('BVRRReviewDisplayStyle3Main'):
        title  = review.find_element_by_class_name('BVRRReviewTitle').text
        rating = review.find_element_by_xpath('.//div[@class="BVRRRatingNormalImage"]//img').get_attribute('title')
        print title,rating
    try:
        driver.find_element_by_link_text(str(pageId)).click()
    except:
        break
driver.quit()

我认为这会起作用。虽然 python 可能有点偏离,但这应该给你一个起点:

continue = True
while continue:
    try:
        for review in driver.find_elements_by_class_name('BVRRReviewDisplayStyle3Main'):
            title = review.find_element_by_class_name('BVRRReviewTitle').text
            rating =review.find_element_by_xpath('.//div[@class="BVRRRatingNormalImage"]//img').get_attribute('title')
        print title, rating
        driver.find_element_by_name('BV_TrackingTag_Review_Display_NextPage').click()
    except:
        print "Done!"
        continue = False