1

csvファイルにある住所と郵便番号から通りの名前とその通りのシリアル番号を抽出する単純な Web スクレイパーを作成しました。通りの名前、シリアル番号、郵便番号を新しいファイルに保存したいのですが、メソッドにcsv郵便番号を渡す方法がわかりません。parse()cmd

scrapy crawl Geospider -o Scraped_data.csv -t csv

これは私のスパイダーです (私がスクレイピングしているページにはログインとパスワードが必要なため、コードは実際には機能しません。私のものは提供しませんが、http://download.kortforsyningen.dkで誰でもユーザーとしてサインアップできます) //content/opret-mig-som-bruger、それは私の問題の一部ではありません):

from scrapy.spider import BaseSpider
from scrapy.selector import XmlXPathSelector
from scrapy.item import Item, Field
import csv

class Road(Item):
    RoadNum = Field()
    RoadName = Field()
    PostNum = Field()

class Geospider(BaseSpider):
    name = 'Geospider'
    allowed_domains = ["http://kortforsyningen.kms.dk/"]

    def unicode_csv_reader(utf8_data, dialect=csv.excel, **kwargs):
        csv_reader = csv.reader(utf8_data, dialect=dialect, **kwargs)
        for row in csv_reader:
            yield [unicode(cell, 'utf-8') for cell in row]

    filename = 'AddressesAndZipcodes.csv'
    reader = unicode_csv_reader(open(filename))
    start_urls = []
    ZipCode = []
    for row in reader:
        Address = row[0]
        Zip = row[1]
        start_urls.append('http://kortforsyningen.kms.dk/service?ServiceName=geoV&soegemetode=0&vejnavn=%s&kommunepost=%s&format=XML&max_hits=10&login=xxx&password=xxx' % (Address, ZipCode))
        ZipCode.append(Zip)

    def parse(self, response):
        xxs = XmlXPathSelector(response)
        sites = xxs.select('//dokument/forekomst')
        items = Road()
        items['RoadNum'] = sites.select("vejkode/text()").extract()
        items['RoadName'] = sites.select("vejnavn/text()").extract()
        items['PostNum'] = ZipCode
        yield items, ZipCode

Parse()郵便番号が他の結果と一緒に保存されるように、郵便番号を渡す方法について何か考えはありますか?

ありがとう

4

1 に答える 1

2

をオーバーライドしstart_requests、そこで csv ファイルを読み取り、 を渡すziprequest.metaうまくいきます。

from scrapy.http import Request
from scrapy.spider import BaseSpider
from scrapy.selector import XmlXPathSelector
from scrapy.item import Item, Field
import csv


class Road(Item):
    RoadNum = Field()
    RoadName = Field()
    PostNum = Field()


def unicode_csv_reader(utf8_data, dialect=csv.excel, **kwargs):
    csv_reader = csv.reader(utf8_data, dialect=dialect, **kwargs)
    for row in csv_reader:
        yield [unicode(cell, 'utf-8') for cell in row]


class Geospider(BaseSpider):
    name = 'Geospider'
    allowed_domains = ["http://kortforsyningen.kms.dk/"]
    start_urls = []

    def start_requests(self):
        reader = unicode_csv_reader(open('AddressesAndZipcodes.csv'))
        for row in reader:
            address, zip_code = row[:2]
            url = 'http://kortforsyningen.kms.dk/service?ServiceName=geoV&soegemetode=0&vejnavn=%s&kommunepost=%s&format=XML&max_hits=10&login=xxx&password=xxx' % (address, zip_code)

            yield Request(url=url, meta={'zip_code': zip_code})

    def parse(self, response):
        xxs = XmlXPathSelector(response)
        sites = xxs.select('//dokument/forekomst')

        item = Road()
        item['RoadNum'] = sites.select("vejkode/text()").extract()
        item['RoadName'] = sites.select("vejnavn/text()").extract()
        item['PostNum'] = response.meta['zip_code']

        yield item

それが役立つことを願っています。

于 2013-07-03T07:59:47.040 に答える