Здравствуйте,
нужно добавить в item, основная информация для которого получается из главного response, дополнительные поля, которые находятся во внешних ссылках, например .js, другие url.
Вот чего я достиг после 5 часов чтения документации и stackoverflow, здесь парсится главная страница google, и в item добавляется словарь page_size, в котором содержатся url страниц, которые есть в
google.com и их размер в байтах.
{'page_size': [{'http://support.google.com/accounts/?hl=ru': 50526}]}
{'page_size': [{'http://support.google.com/accounts/?hl=ru': 50526},
{'http://www.google.com/intl/ru/policies/privacy/': 37644}]}
и т.д.
То есть в результате возвращаются все шаги по обновлению item до финального состояния, мне нужна только последняя итерация, а еще лучше было бы получать всю информацию в конце метода parse_item.
Есть ли какой-нибудь нормальный способ это сделать?
Заранее благодарен, ниже код про который идет речь.
class TestSpider(CrawlSpider):
name = 'test'
allowed_domains = ['google.com', 'google.ru']
start_urls = ['https://www.google.com/',]
rules = (
Rule(SgmlLinkExtractor(allow=(r'https://www.google')),
callback='parse_item',
follow=False),
)
def get_page_size(self, response):
item = response.meta['item']
if 'page_size' not in item:
item['page_size'] = list()
item['page_size'].append({
response.url:
len(response.body)
})
yield item
def parse_item(self, response):
item = TestProduct()
doc = leaf.parse(response.body)
for url in doc('a'):
if 'href' not in url.attrib:
continue
url = url.attrib['href']
if url.find('http:') != 0:
continue
request = Request(url, callback=self.get_page_size)
request.meta['item'] = item
yield request