2015-10-14 3 views
0

Intro Привет, я использую Scrapy для получения данных в Yahoo Answer. Мое достижение - принять все вопросы и ответ в одном точном разделе.Использование рекурсии Spider in Scrapy [Python]

Стараюсь Использование Scrapy и селена в первую очередь я пытаюсь взять список любого вопроса в разделе, этот список запоминают в классе паука. После того, как я использую цикл For для анализа каждой отдельной страницы.

for url in self.start_urls_mod: 
     yield scrapy.Request(url, callback=self.parse_page) 
     i = i + 1 

метод parse_page структурирована для scrapying страницу вопроса, лучший ответ и все другие ответы. Это прекрасно работает.

Проблема проблема возникает, когда я пытаюсь перейти на «Следующий» вопрос, используя ссылку href в следующей строке, приведенной по следующей ссылке в правой части страницы. Я вызываю снова ту же самую функцию parse_page, передавая URL-адрес из этой ссылки. Иногда эта работа, но в другое время нет. Я не сейчас, если правильно вызывать два раза функцию parse_page, без использования какого-либо базового кода в другом, чтобы остановить рекурсию в любом случае.

Программа работает без ошибок и останавливается, но в разделе «Следующий» я не задаю никаких вопросов. Только кто-то.

Существует фрагмент кода.

def parse_page(self, response): 
    #Scraping with xpath things that interests me 
    #Go to the next similar question 
    next_page = hxs.xpath('((//a[contains(@class,"Clr-b")])[3])/@href').extract() 
    composed_string = "https://answers.yahoo.com" + next_page[0] 
    print("NEXT -> "+str(composed_string)) 
    yield scrapy.Request(urljoin(response.url, composed_string), callback=self.parse_page) 

пс. Я бы использовал паука-паука, но я не могу определить какие-либо правила, чтобы принимать только этот тип вопроса. Поэтому, пожалуйста, как я могу улучшить свою функцию.

Информация: https://answers.yahoo.com/question/index?qid=20151008101821AAuHgCk

ответ

1

Прежде всего, ваш XPath для выбора следующего URL неправильно. Вы всегда будете получать третий URL с «Clr-b», который может быть неправильным (его не существует или он не является следующим сайтом).

Для таких запросов я бы использовал текстовый поиск. В вашем случае что-то вроде этого:

next_page = response.xpath('//a[contains(@class,"Clr-b") and text()=" Next "]/@href').extract() 

Затем вы составляете свой URL, как вы делаете, и вы не должны использовать urljoin. Это не обязательно, потому что у вас уже есть правильный URL-адрес, который вам нужен yield, как и вы. Вероятно, это причина, по которой ваш паук останавливается: вы создаете URL-адрес с urljoin, который не найден - и это не URL-адрес, который вы печатаете на консоли.

И не имеет смысла использовать ту же функцию, что и обратный вызов.

+0

Спасибо, человек, так что это будет правильный доход? урожай scrapy.Request (created_string, callback = self.parse_page) – RedVelvet

+1

Добро пожаловать. Да, это будет правильный доход. – GHajba

+0

Большое спасибо, я попытаюсь с этим предложением! и я дам вам знать! – RedVelvet

 Смежные вопросы

  • Нет связанных вопросов^_^