3

完全な初心者で、csv から URL のリストを読み取って csv 内のアイテムを返すためにスクレイピーを取得しようとしています。ここでどこが間違っているのかを理解するのに助けが必要です:スパイダーコード:

from scrapy.spider import BaseSpider
from scrapy.selector import HtmlXPathSelector
import random

class incyspider(BaseSpider):
    name = "incyspider"
    def __init__(self):
        super(incyspider, self).__init__()
        domain_name = "incyspider.co.uk"
        f = open("urls.csv")
        start_urls = [url.strip() for url in f.readlines()]
        f.close

    def parse(self, response):
        hxs = HtmlXPathSelector(response)
        sites = hxs.select('//div[@class="Product"]')
        items = []
        for site in sites:
            item['title'] = hxs.select('//div[@class="Name"]/node()').extract()
            item['hlink'] = hxs.select('//div[@class="Price"]/node()').extract()
            item['price'] = hxs.select('//div[@class="Codes"]/node()').extract()
            items.append(item)

        return items

SPIDER = incyspider()

items.py コードは次のとおりです。

from scrapy.item import Item, Field

class incyspider(Item):
    # define the fields for your item here like:
    # name = Field()
    title = Field()
    hlink = Field()
    price = Field()
    pass

実行するには、使用しています

scrapy crawl incyspider -o items.csv -t csv

ポインタをいただければ幸いです。

4

2 に答える 2

1

これに答える最初のパントとして、スパイダー コードにincyspider項目クラスのインポートがありません。また、タイトル/hlink/価格情報を保存するためのアイテムのインスタンスを作成していないため、items.append(item)行が不平を言う可能性があります。

スパイダーも と呼ばれるためincyspider、アイテムの名前を次のように変更しincyspiderItem、次の行をスパイダー コードに追加する必要があります。

from scrapy.spider import BaseSpider
from scrapy.selector import HtmlXPathSelector
import random
from incyspider.items import incyspiderItem 

class incyspider(BaseSpider):
    name = "incyspider"
    def __init__(self):
        super(incyspider, self).__init__()
        domain_name = "incyspider.co.uk"
        f = open("urls.csv")
        start_urls = [url.strip() for url in f.readlines()]
        f.close

    def parse(self, response):
        hxs = HtmlXPathSelector(response)
        sites = hxs.select('//div[@class="Product"]')
        items = []
        for site in sites:
            item = incyspiderItem()
            item['title'] = hxs.select('//div[@class="Name"]/node()').extract()
            item['hlink'] = hxs.select('//div[@class="Price"]/node()').extract()
            item['price'] = hxs.select('//div[@class="Codes"]/node()').extract()
            items.append(item)

        return items

私が間違っている場合は、質問を編集して、コードに問題があることをどのように知っているかを説明してください。たとえば、期待される出力は実際の出力と異なりますか? もしそうなら、どのように?

于 2012-12-20T12:57:37.967 に答える
1

正確にはわかりませんが、コードをざっと見てから、少なくともこの行を置き換える必要があると思います

sites = hxs.select('//div[@class="Product"]')

この行で

sites = hxs.select('//div[@class="Product"]').extract() 
于 2012-12-20T12:56:20.543 に答える