Python - for 循环产生每页只循环一次的抓取数据
Python - for loop which yields scraped data only looping once per page
为什么这个抓取代码只提取每个页面的第一个标题、作者和引用? (结果只有一个 three-row csv 文件)?
我正在使用网络爬虫 scrapy
并将数据加载到 csv 文件中。我正在使用 xpath,并且遇到了正确加载我的数据的问题。这是我第一次使用 python,我正在努力正确实现 enumerate/zip 功能。
import scrapy
class MySpider(scrapy.Spider):
name = 'test'
custom_settings = {
'FEED_FORMAT': 'csv',
'FEED_URI': 'test.csv'
}
start_urls = [
'http://quotes.toscrape.com/',
'http://quotes.toscrape.com/page/2/',
'http://quotes.toscrape.com/page/3/'
]
def parse(self, response):
titles = response.xpath("//div[contains(@class, 'col-md-4')]/h2/text()").extract()
authors = response.xpath("//small[contains(@class, 'author')]/text()").extract()
quotes = response.xpath("//div[contains(@class, 'quote')]/span[contains(@class, 'text')]/text()").extract()
for i, (title, author, quote) in enumerate(zip(titles, authors, quotes)):
yield {'index': i, 'title': title, 'author': author, 'quote': quote}
这里的问题是 zip
只创建与作为参数传递的最小列表相同数量的元素,在这种情况下 titles
只包含 1
元素,所以它for 只会迭代一次是正确的。
如果您希望所有元素都使用相同的标题,您应该只迭代 authors
和 quotes
:
title = response.xpath("//div[contains(@class, 'col-md-4')]/h2/text()").extract_first()
authors = response.xpath("//small[contains(@class, 'author')]/text()").extract()
quotes = response.xpath("//div[contains(@class, 'quote')]/span[contains(@class, 'text')]/text()").extract()
for i, (author, quote) in enumerate(zip(authors, quotes)):
yield {'index': i, 'title': title, 'author': author, 'quote': quote}
为什么这个抓取代码只提取每个页面的第一个标题、作者和引用? (结果只有一个 three-row csv 文件)?
我正在使用网络爬虫 scrapy
并将数据加载到 csv 文件中。我正在使用 xpath,并且遇到了正确加载我的数据的问题。这是我第一次使用 python,我正在努力正确实现 enumerate/zip 功能。
import scrapy
class MySpider(scrapy.Spider):
name = 'test'
custom_settings = {
'FEED_FORMAT': 'csv',
'FEED_URI': 'test.csv'
}
start_urls = [
'http://quotes.toscrape.com/',
'http://quotes.toscrape.com/page/2/',
'http://quotes.toscrape.com/page/3/'
]
def parse(self, response):
titles = response.xpath("//div[contains(@class, 'col-md-4')]/h2/text()").extract()
authors = response.xpath("//small[contains(@class, 'author')]/text()").extract()
quotes = response.xpath("//div[contains(@class, 'quote')]/span[contains(@class, 'text')]/text()").extract()
for i, (title, author, quote) in enumerate(zip(titles, authors, quotes)):
yield {'index': i, 'title': title, 'author': author, 'quote': quote}
这里的问题是 zip
只创建与作为参数传递的最小列表相同数量的元素,在这种情况下 titles
只包含 1
元素,所以它for 只会迭代一次是正确的。
如果您希望所有元素都使用相同的标题,您应该只迭代 authors
和 quotes
:
title = response.xpath("//div[contains(@class, 'col-md-4')]/h2/text()").extract_first()
authors = response.xpath("//small[contains(@class, 'author')]/text()").extract()
quotes = response.xpath("//div[contains(@class, 'quote')]/span[contains(@class, 'text')]/text()").extract()
for i, (author, quote) in enumerate(zip(authors, quotes)):
yield {'index': i, 'title': title, 'author': author, 'quote': quote}