Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/305.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 scrapy-如何使用数据框中的数据填充项?_Python_Pandas_Scrapy - Fatal编程技术网

Python scrapy-如何使用数据框中的数据填充项?

Python scrapy-如何使用数据框中的数据填充项?,python,pandas,scrapy,Python,Pandas,Scrapy,假设以下爬行爬行器: import scrapy from scrapy.loader import ItemLoader from scrapy.spiders import CrawlSpider, Rule from scrapy.linkextractors import LinkExtractor from tutorial.items import TestItem from scrapy.http import HtmlResponse class TestCrawlSpide

假设以下爬行爬行器:

import scrapy
from scrapy.loader import ItemLoader
from scrapy.spiders import CrawlSpider, Rule
from scrapy.linkextractors import LinkExtractor
from tutorial.items import TestItem
from scrapy.http import HtmlResponse


class TestCrawlSpider(CrawlSpider):
    name = "test_crawl"
    allowed_domains = ["www.immobiliare.it"]
    start_urls = [
        "http://www.immobiliare.it/Roma/case_in_vendita-Roma.html?criterio=rilevanza",
        "http://www.immobiliare.it/Napoli/case_in_vendita-Napoli.html?criterio=rilevanza"
    ]

    rules = (
        Rule(LinkExtractor(allow=(), restrict_xpaths=('//a[@class="no-decoration button next_page_act"]',)), callback="parse_start_url", follow= True),
    )


    def parse_start_url(self, response):
        for selector in response.css('div.content'):
            l = ItemLoader(item=TestItem(), selector=selector)
            l.add_css('Price', '.price::text')
            l.add_value('City', '...')
            l.add_value('Longitude', '...')
            l.add_value('Latitude', '...')
            yield l.load_item()
以及相应的项目.py:

import scrapy
from scrapy.loader import ItemLoader
from scrapy.loader.processors import TakeFirst, MapCompose, Join

class TestItem(scrapy.Item):
    Price = scrapy.Field(
        output_processor=MapCompose(unicode.strip),
    )
    City = scrapy.Field(serializer=str)
    Latitude = scrapy.Field(serializer=str)
    Longitude = scrapy.Field(serializer=str)
对于每个起始url,我都将相应的地理信息(“城市”、“经度”、“纬度”)存储在一个数据框中。对于上面的示例,dataframe如下所示:

     City Latitude Longitude
0    Roma    40.85     14.30
1  Napoli    41.53     12.30

如何使用存储在数据框中的信息填充“城市”、“经度”、“纬度”项?

我将使用
start\u requests()
方法填充每个城市的信息,通过将数据框转储到字典中以简化查找:

def start_requests(self):
    df = pd.DataFrame(...)

    # make a dictionary, City -> City info
    d = df.set_index('City').to_dict()

    pattern = re.compile(r"http://www.immobiliare.it/(\w+)/")
    for url in self.start_urls:
        city = pattern.search(url).group(1)
        yield scrapy.Request(url, meta={"info": d[city]})
然后,在回调中,从
response.meta
获取信息字典:

def parse_start_url(self, response):
    info = response.meta["info"]
    for selector in response.css('div.content'):
        l = ItemLoader(item=TestItem(), selector=selector)
        l.add_css('Price', '.price::text')
        l.add_value('City', info['City'])
        l.add_value('Longitude', info['Longitude'])
        l.add_value('Latitude', info['Latitude'])
        yield l.load_item()

未经测试。

谢谢您提出的解决方案。它运行良好,但是仅适用于start\u url。当对下一页进行爬网时,我会收到错误消息
info=response.meta[“info”]
keyror:'info'
。你知道我该怎么解决吗?@kanimbla啊,是的,这很有意义。
meta
没有被传递到后续的链接。。以前没有过这种情况,请看看这是否有帮助:。谢谢!我会尽快检查的。由于我将已爬网的数据写入MySQL数据库,因此也可以使用单独的例程从数据帧添加信息。我只是觉得一次完成所有事情会更容易。@kanimbla是的,我也在考虑这个问题。可能更合适的地方是自定义管道..在将提取的项目插入数据库之前填写此信息。谢谢。@kanimbla真棒,如果您在本主题中还有什么需要帮助的,请告诉我。谢谢