使用Python使用AJAX分页的站点使用BeautifulSoup进行刮擦

时间:2014-12-28 16:47:10

标签: python ajax selenium pagination beautifulsoup

我对编码和Python相当新,所以如果这是一个愚蠢的问题我会道歉。我喜欢一个遍历所有19,000个搜索结果页面的脚本,并为每个网址抓取所有网址。我已经完成了所有的报废工作,但无法弄清楚如何处理页面使用AJAX进行分页的事实。通常我只是用网址循环来捕获每个搜索结果,但这是不可能的。这是页面:http://www.heritage.org/research/all-research.aspx?nomobile&categories=report

这是我到目前为止的脚本:

with io.open('heritageURLs.txt', 'a', encoding='utf8') as logfile:
    page = urllib2.urlopen("http://www.heritage.org/research/all-research.aspx?nomobile&categories=report")
    soup = BeautifulSoup(page)
    snippet = soup.find_all('a', attrs={'item-title'})
    for a in snippet:
        logfile.write ("http://www.heritage.org" + a.get('href') + "\n")

print "Done collecting urls"

显然,它会刮掉第一页的结果,仅此而已。

我已经查看了一些相关的问题,但似乎没有人使用Python,或者至少不是以我能理解的方式。预先感谢您的帮助。

1 个答案:

答案 0 :(得分:5)

为了完整起见,您可以尝试访问POST请求并找到一种方法来访问下一页,就像我在评论中建议的那样,如果可以使用 Selenium 很容易达到你想要的效果。

以下是使用 Selenium 解决问题的简单解决方案:

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from time import sleep

# uncomment if using Firefox web browser
driver = webdriver.Firefox()

# uncomment if using Phantomjs
#driver = webdriver.PhantomJS()

url = 'http://www.heritage.org/research/all-research.aspx?nomobile&categories=report'
driver.get(url)

# set initial page count
pages = 1
with open('heritageURLs.txt', 'w') as f:
    while True:
        try:
            # sleep here to allow time for page load
            sleep(5)
            # grab the Next button if it exists
            btn_next = driver.find_element_by_class_name('next')
            # find all item-title a href and write to file
            links = driver.find_elements_by_class_name('item-title')
            print "Page: {} -- {} urls to write...".format(pages, len(links))
            for link in links:
                f.write(link.get_attribute('href')+'\n')
            # Exit if no more Next button is found, ie. last page
            if btn_next is None:
                print "crawling completed."
                exit(-1)
            # otherwise click the Next button and repeat crawling the urls
            pages += 1
            btn_next.send_keys(Keys.RETURN)
        # you should specify the exception here
        except:
            print "Error found, crawling stopped"
            exit(-1)

希望这有帮助。