gpt4 book ai didi

python - Scrapy 数据流以及项目和项目加载器

转载 作者:行者123 更新时间:2023-12-01 09:17:39 24 4
gpt4 key购买 nike

我正在查看Architecture Overview Scrapy 文档中的页面,但我仍然有一些关于数据和/或控制流的问题。

零碎架构 enter image description here

Scrapy 项目的默认文件结构

scrapy.cfg
myproject/
__init__.py
items.py
middlewares.py
pipelines.py
settings.py
spiders/
__init__.py
spider1.py
spider2.py
...

item.py

# -*- coding: utf-8 -*-

# Define here the models for your scraped items
#
# See documentation in:
# https://doc.scrapy.org/en/latest/topics/items.html

import scrapy

class MyprojectItem(scrapy.Item):
# define the fields for your item here like:
# name = scrapy.Field()
pass

我假设,会变成

import scrapy

class Product(scrapy.Item):
name = scrapy.Field()
price = scrapy.Field()
stock = scrapy.Field()
last_updated = scrapy.Field(serializer=str)

以便在尝试填充 Product 的未声明字段时抛出错误实例

>>> product = Product(name='Desktop PC', price=1000)
>>> product['lala'] = 'test'
Traceback (most recent call last):
...
KeyError: 'Product does not support field: lala'

问题#1

我们的爬虫在何处、何时以及如何意识到 items.py如果我们创建了 class CrowdfundingItemitems.py

这是在...完成的

  • __init__.py
  • my_crawler.py
  • def __init__()mycrawler.py
  • settings.py
  • pipelines.py
  • def __init__(self, dbpool)pipelines.py
  • 其他地方?

问题#2

一旦我声明了一个项目,例如 Product ,然后如何通过创建 Product 的实例来存储数据在类似于下面的上下文中?

import scrapy

class MycrawlerSpider(CrawlSpider):
name = 'mycrawler'
allowed_domains = ['google.com']
start_urls = ['https://www.google.com/']
def parse(self, response):
options = Options()
options.add_argument('-headless')
browser = webdriver.Firefox(firefox_options=options)
browser.get(self.start_urls[0])
elements = browser.find_elements_by_xpath('//section')
count = 0
for ele in elements:
name = browser.find_element_by_xpath('./div[@id="name"]').text
price = browser.find_element_by_xpath('./div[@id="price"]').text

# If I am not sure how many items there will be,
# and hence I cannot declare them explicitly,
# how I would go about creating named instances of Product?

# Obviously the code below will not work, but how can you accomplish this?

count += 1
varName + count = Product(name=name, price=price)
...

最后,假设我们放弃命名 Product完全实例,而不是简单地创建未命名实例。

for ele in elements:
name = browser.find_element_by_xpath('./div[@id="name"]').text
price = browser.find_element_by_xpath('./div[@id="price"]').text
Product(name=name, price=price)

如果这些实例确实存储在某个地方,那么它们存储在哪里?通过这种方式创建实例,会不会无法访问它们?

最佳答案

使用Item是可选的;它们只是声明数据模型和应用验证的便捷方法。您还可以使用普通的 dict 来代替。

如果您选择使用Item,则需要导入它以便在蜘蛛中使用。它不会自动发现。对于您的情况:

from items import CrowdfundingItem

当蜘蛛在每个页面上运行 parse 方法时,您可以将提取的数据加载到 Itemdict 中。加载后,yield 将其传递回 scrapy 引擎,以便在下游、管道或导出器中进行处理。这就是 scrapy 如何“存储”您抓取的数据。

例如:

yield Product(name='Desktop PC', price=1000) # uses Item
yield {'name':'Desktop PC', 'price':1000} # plain dict

关于python - Scrapy 数据流以及项目和项目加载器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51092757/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com