Царапать вместо паука?
Поскольку ваша исходная задача требует многократной навигации по последовательному и повторяющемуся набору контента вместо дерева контента неизвестного размера, используйте mechanize (http://wwwsearch.sourceforge.net/mechanize/) и beautifulsoup (http://www.crummy.com/software/BeautifulSoup/).
). Вот примерсоздание экземпляра браузера с использованием mechanize. Кроме того, использование br.follow_link (text = "foo") означает, что, в отличие от xpath в вашем примере, ссылки все равно будут отслеживаться независимо от структуры элементов в пути предка., если они обновляют свой HTML, ваш скрипт ломается. Более слабая связь сэкономит вам некоторое обслуживание. Вот пример:
br = mechanize.Browser()
br.set_handle_equiv(True)
br.set_handle_redirect(True)
br.set_handle_referer(True)
br.set_handle_robots(False)
br.addheaders = [('User-agent', 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:9.0.1)Gecko/20100101 Firefox/9.0.1')]
br.addheaders = [('Accept-Language','en-US')]
br.addheaders = [('Accept-Encoding','gzip, deflate')]
cj = cookielib.LWPCookieJar()
br.set_cookiejar(cj)
br.open("http://amazon.com")
br.follow_link(text="Today's Deals")
print br.response().read()
Кроме того, в «следующих 15» разделах, вероятно, есть что-то, указывающее на нумерацию страниц, например & index= 15. Если общее количество элементов на всех страницах доступно на первой странице, то:
soup = BeautifulSoup(br.response().read())
totalItems = soup.findAll(id="results-count-total")[0].text
startVar = [x for x in range(int(totalItems)) if x % 15 == 0]
Затем просто переберите startVar и создайте URL, добавьте значение startVar в URL, br.open () и очистите данные. Таким образом, вам не нужно программно «находить» «следующую» ссылку на странице.Чтобы выполнить переход на следующую страницу, нажмите на нее и нажмите на нее, чтобы узнать все действительные URL-адреса.Минимизация манипулирования страницей с помощью кода только теми данными, которые вам нужны, ускорит извлечение.