递归迭代多个网页并使用硒进行刮擦

时间:2014-04-05 15:36:47

标签: javascript python selenium recursion

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

我之前的问题:Pin down exact content location in html for web scraping urllib2 Beautiful Soup

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

这是我的代码

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

从网址中,您会看到如果我们导航到第二页,则看不到任何变化,否则就不会出现问题。在这种情况下,下一页点击器从服务器调用javascript。是否有一种方法我们仍然可以使用python中的selenium只是通过对我呈现的代码的一些轻微修改来刮掉它?如果有,请告诉我。

感谢。

2 个答案:

答案 0 :(得分:1)

我认为这会奏效。虽然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

答案 1 :(得分:1)

阅读每个页面后,只需点击下一步

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()