Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/340.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使web刮刀产生更多信息_Python_Web Scraping_Scrapy - Fatal编程技术网

Python 使web刮刀产生更多信息

Python 使web刮刀产生更多信息,python,web-scraping,scrapy,Python,Web Scraping,Scrapy,我已经编写了一个简单的web scraper,它从csv文件中的地址和邮政编码中提取街道名称和该街道的序列号。我想将街道名称、序列号和邮政编码保存在一个新的csv文件中,但我不知道如何将邮政编码传递给我的parse()方法,因为我通过以下方式从cmd调用爬行器: scrapy crawl Geospider -o Scraped_data.csv -t csv 这是我的spider(由于我正在抓取的页面需要登录名和密码,所以代码实际上无法工作,我不会提供我的,但任何人都可以注册为用户,这不是我

我已经编写了一个简单的web scraper,它从
csv
文件中的地址和邮政编码中提取街道名称和该街道的序列号。我想将街道名称、序列号和邮政编码保存在一个新的
csv
文件中,但我不知道如何将邮政编码传递给我的
parse()
方法,因为我通过以下方式从
cmd
调用爬行器:

scrapy crawl Geospider -o Scraped_data.csv -t csv
这是我的spider(由于我正在抓取的页面需要登录名和密码,所以代码实际上无法工作,我不会提供我的,但任何人都可以注册为用户,这不是我的问题的一部分):

关于如何将ZipCode传递到
Parse()
,以便将ZipCode与其他结果一起保存,您有什么想法吗


感谢您

覆盖
启动请求
,读取那里的csv文件并在
请求中传递
zip
。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
希望对您有所帮助。

有关如何使用request.meta和Scrapy识别的特殊密钥,请参见。
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