我正在使用一个基本的蜘蛛,从网站上的链接获取特定信息。我的代码如下所示:
import sys
from scrapy import Request
import urllib.parse as urlparse
from properties import PropertiesItem, ItemLoader
from scrapy.crawler import CrawlerProcess
class BasicSpider(scrapy.Spider):
name = "basic"
allowed_domains = ["web"]
start_urls = ['www.example.com']
objectList = []
def parse(self, response):
# Get item URLs and yield Requests
item_selector = response.xpath('//*[@class="example"]//@href')
for url in item_selector.extract():
yield Request(urlparse.urljoin(response.url, url), callback=self.parse_item, dont_filter=True)
def parse_item(self, response):
L = ItemLoader(item=PropertiesItem(), response=response)
L.add_xpath('title', '//*[@class="example"]/text()')
L.add_xpath('adress', '//*[@class="example"]/text()')
return L.load_item()
process = CrawlerProcess()
process.crawl(BasicSpider)
process.start()
我现在想要的是将每个类实例“L”附加到名为objectList的列表中。我试过改变代码如下:
def parse_item(self, response):
global objectList
l = ItemLoader(item=PropertiesItem(), response=response)
l.add_xpath('title', '//*[@class="restaurantSummary-name"]/text()')
l.add_xpath('adress', '//*[@class="restaurantSummary-address"]/text()')
item = l.load_item()
objectList.append([item.title, item.adress])
return objectList
但是当我运行这段代码时,我收到一条消息:
l = ItemLoader(item=PropertiesItem(), response=response)
NameError: name 'PropertiesItem' is not defined
问:如何将刮刀找到的每个项目附加到列表objectList?
编辑:
我想将结果存储在列表中,因为我可以保存结果:
import pandas as pd
table = pd.DataFrame(objectList)
writer = pd.ExcelWriter('DataAll.xlsx')
table.to_excel(writer, 'sheet 1')
writer.save()
答案 0 :(得分:1)
要保存结果,您应该使用scrapy的Feed Feeders功能,如文档here中所述
实施抓取工具时最常需要的功能之一就是能够正确存储已删除的数据,这通常意味着生成一个带有已删除数据(通常称为“导出Feed”)的“导出文件”通过其他系统。
Scrapy通过Feed Exports提供此功能,允许您使用多个序列化格式和存储后端生成带有已删除项目的Feed。
根据您的情况,请参阅csv section。
另一种更习惯的方法是使用scrapy' Item Pipelines。有一个简单的json writer here的例子可以很容易地修改为输出csv或任何其他格式。
例如,这段代码会将所有项目输出到项目目录中的test.csv
文件:
import scrapy
class MySpider(scrapy.Spider):
name = 'feed_exporter_test'
# this is equivalent to what you would set in settings.py file
custom_settings = {
'FEED_FORMAT': 'csv',
'FEED_URI': 'test.csv'
}
start_urls = ['http://stackoverflow.com/questions/tagged/scrapy']
def parse(self, response):
titles = response.xpath("//a[@class='question-hyperlink']/text()").extract()
for i, title in enumerate(titles):
yield {'index': i, 'title': title}
此示例生成50行长csv文件。