Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/13.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从不同的函数向json文件添加数据_Python_Json_Function_Web Scraping_Scrapy - Fatal编程技术网

Python scrapy从不同的函数向json文件添加数据

Python scrapy从不同的函数向json文件添加数据,python,json,function,web-scraping,scrapy,Python,Json,Function,Web Scraping,Scrapy,我对scrapy和json都是新手,正在从事scrapy项目。这是我的剧本: import scrapy class MoulaviSpider(scrapy.Spider): name = "moulavi" def start_requests(self): start_urls = [ 'https://ganjoor.net/moulavi/masnavi/daftar1/sh1/', 'https://ga

我对scrapy和json都是新手,正在从事scrapy项目。这是我的剧本:

import scrapy

class MoulaviSpider(scrapy.Spider):
    name = "moulavi"

    def start_requests(self):
    start_urls = [
        'https://ganjoor.net/moulavi/masnavi/daftar1/sh1/',
        'https://ganjoor.net/moulavi/masnavi/daftar1/sh2/',
    ]
        for url in start_urls:
            yield scrapy.Request(url=url, callback=self.title)

    def title(self, response):
        #'hetitle': response.css('h2').extract(), 
        return scrapy.Request(callback=self.parse)

    def parse(self, response):
        for line in response.css('div.b'):
            yield {
                'right_column': line.css('div.m1').extract(),
                'left_column': line.css('div.m2').extract(),
}
我用
scrapy crawl moulavi-o moulavi.json
运行它

我知道我的密码现在不正确。 我想将每个页面的标题添加到“def title”中的json文件中,然后调用“def parse”将其他数据添加到json文件中。但由于我对回调或收益率不太熟悉,所以不知道该怎么办

正如您在我的代码中看到的,我已经注释了这一行,这是我希望将标题添加到json文件中的地方,但不知道如何做到这一点

所以我想做的是刮取url,找到页面的标题,然后将其写入json文件,然后启动for循环,找到所有具有类“m1”和“m2”的div标记,并将它们写入json文件。然后开始抓取下一个url

我希望有这样的输出:(如果语法正确,则不是suro)

{
“标题”:“首页标题”,
“内容”:[
“右方柱”的“右方柱”:““p>门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门“]},
“右方柱”门门门门柱:“p>5月月15日的门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门>“]},
“右图柱”的“右图柱柱”:(p1570)的门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门门

“]} ] “标题”:“第二页标题”, “内容”:[ {“右列”:(右列)‌“左栏”:(左栏)‌کند

“]}, {“右”列:“‌“左栏”:(左栏)‌اند

“]}, ]}

提前感谢:)

您不需要创建新回调来解析标题,您可以在
parse
函数中创建所需的结构,只需创建一个具有所需属性的对象即可

# -*- coding: utf-8 -*-
import scrapy

class MoulaviSpider(scrapy.Spider):
    name = 'moulavi'

    def start_requests(self):

        start_urls = [
            'https://ganjoor.net/moulavi/masnavi/daftar1/sh1/',
            'https://ganjoor.net/moulavi/masnavi/daftar1/sh2/',
        ]

        for url in start_urls:
            yield scrapy.Request(url=url, callback=self.parse)

    def parse(self, response):

        item = dict(title=response.xpath('//title/text()').extract_first(),content=[])

        for line in response.css('div.b'):
            item['content'].append({
                'right_column': line.css('div.m1').extract_first(),
                'left_column': line.css('div.m2').extract_first()})

        yield item

你不需要创建新的回调函数来解析标题,你可以在
parse
函数中创建你想要的结构,你需要做的只是创建一个具有你想要的属性的对象

# -*- coding: utf-8 -*-
import scrapy

class MoulaviSpider(scrapy.Spider):
    name = 'moulavi'

    def start_requests(self):

        start_urls = [
            'https://ganjoor.net/moulavi/masnavi/daftar1/sh1/',
            'https://ganjoor.net/moulavi/masnavi/daftar1/sh2/',
        ]

        for url in start_urls:
            yield scrapy.Request(url=url, callback=self.parse)

    def parse(self, response):

        item = dict(title=response.xpath('//title/text()').extract_first(),content=[])

        for line in response.css('div.b'):
            item['content'].append({
                'right_column': line.css('div.m1').extract_first(),
                'left_column': line.css('div.m2').extract_first()})

        yield item

通常,一个方法负责解析页面内容,然后生成解析后的数据。最后,在生成所有项之后,如果需要,该方法可以生成更多的请求以进一步解析页面

解析后的数据将用于创建的实例,然后通过项目管道进行复杂的处理和持久化。在这里,我坚持使用字典来简化示例

从您提供的所需输出中,
content
是输出json中的顶级键,其值是一个列表。列表的元素是一个字典,有两个键
left_column
right_column
,值的类型为list

在本例中,
parse
方法可能如下所示:

import scrapy

class MoulaviSpider(scrapy.Spider):
    name = "moulavi"

    def start_requests(self):
        start_urls = [
            'https://ganjoor.net/moulavi/masnavi/daftar1/sh1/',
            'https://ganjoor.net/moulavi/masnavi/daftar1/sh2/',
        ]

        for url in start_urls:
            yield scrapy.Request(url=url, callback=self.parse)

    def parse(self, response):
        # build up the content through a list comprehension
        # consider using `extract_first` instead of `extract` for 
        # less nested output
        content = [
          {'right_column': line.css('div.m1').extract(),
           'left_column': line.css('div.m2').extract()}
          for line in response.css('div.b')
        ]            
        yield {'title': response.css('h2').extract_first(),
               'content': content}

注意,对于提取
标题
,我首先使用了
提取
而不是提取。考虑使用<代码> Excel第一个< /COD>为<代码> LeftJaveStudio <代码> RealthLead 值,因为它们似乎是1个元素的列表。

< P>通常,单个方法将负责解析页面的内容,然后生成解析的数据。最后,在生成所有项之后,如果需要,该方法可以生成更多的请求以进一步解析页面

解析后的数据将用于创建的实例,然后通过项目管道进行复杂的处理和持久化。在这里,我坚持使用字典来简化示例

从您提供的所需输出中,
content
是输出json中的顶级键,其值是一个列表。列表的元素是一个字典,有两个键
left_column
right_column
,值的类型为list

在本例中,
parse
方法可能如下所示:

import scrapy

class MoulaviSpider(scrapy.Spider):
    name = "moulavi"

    def start_requests(self):
        start_urls = [
            'https://ganjoor.net/moulavi/masnavi/daftar1/sh1/',
            'https://ganjoor.net/moulavi/masnavi/daftar1/sh2/',
        ]

        for url in start_urls:
            yield scrapy.Request(url=url, callback=self.parse)

    def parse(self, response):
        # build up the content through a list comprehension
        # consider using `extract_first` instead of `extract` for 
        # less nested output
        content = [
          {'right_column': line.css('div.m1').extract(),
           'left_column': line.css('div.m2').extract()}
          for line in response.css('div.b')
        ]            
        yield {'title': response.css('h2').extract_first(),
               'content': content}

注意,对于提取
标题
,我首先使用了
提取
而不是提取。考虑使用<代码> Excel第一个< /COD>为<代码> LeftJaveStudio <代码> RealthLead 值,因为它们似乎是1个元素的列表。

什么是<代码> URL<代码> >代码> Surviv.Read(URL=URL,回调=SUIL.PARSE)< /代码>。该代码不正确,因为作用域中没有名为
url
的变量。我知道我的脚本目前不正确。我刚刚编辑了脚本并删除了url部分。是否要在函数之间传递值,并在最终返回项中收集所有属性?您可以在一个函数内完成所有操作,毕竟,您将获得包含项目的同一页面的标题,对吗?
scrapy.Request(url=url,callback=self.parse)
中的
url
是什么。该代码不正确,因为作用域中没有名为
url
的变量。我知道我的脚本目前不正确。我刚刚编辑了脚本并删除了url部分。是否要在函数之间传递值,并在最终返回项中收集所有属性?您可以在一个函数内完成所有操作,毕竟,你会得到同一页的标题,有项目,对吗?