Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/327.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:FormRequestfromCSV,按顺序导出或使用搜索词导出_Python_Scrapy - Fatal编程技术网

Python Scrapy:FormRequestfromCSV,按顺序导出或使用搜索词导出

Python Scrapy:FormRequestfromCSV,按顺序导出或使用搜索词导出,python,scrapy,Python,Scrapy,我是Python和Scrapy新手,我制作的一个简单的爬虫程序使用FormRequest在搜索结果页面上抓取标题时遇到了一些问题 基本上,这个想法是让一个csv充满搜索词,并通过相同的表单运行它们,从结果页面中提取标题,然后导出到不同(或相同)的csv 搜索工作正常-输出符合要求/预期 问题是,它按照页面加载的顺序导出标题,这意味着与原始csv相比,它们的顺序不正确,并且我无法将它们与原始csv中的行进行匹配 这是我的密码: from scrapy.item import Item, Field

我是Python和Scrapy新手,我制作的一个简单的爬虫程序使用FormRequest在搜索结果页面上抓取标题时遇到了一些问题

基本上,这个想法是让一个csv充满搜索词,并通过相同的表单运行它们,从结果页面中提取标题,然后导出到不同(或相同)的csv

搜索工作正常-输出符合要求/预期

问题是,它按照页面加载的顺序导出标题,这意味着与原始csv相比,它们的顺序不正确,并且我无法将它们与原始csv中的行进行匹配

这是我的密码:

from scrapy.item import Item, Field
from scrapy.http import FormRequest
from scrapy.spider import Spider

class ExampleSpider(Spider):
    name = "examplecsv"
    allowed_domains = ["examplewebsite.com"]
    start_urls = ["https://www.examplewebsite.com"]

    def parse(self, response):
        with open('addresses.csv') as fp:
            for line in fp:
                yield FormRequest.from_response(response,
                                        formdata={'examplesearchfield':line},
                                        clickdata={'id': 'clickexamplesearch'},
                                        callback=self.parse1)

    def parse1 (self, response):

        for title in response.css('title'):
            yield {

                'title':title.css('title::text').re(r'^[^|]+(?=|)')
            }
我在StackOverflow上做了很多搜索,但在使用FormRequest方面找不到与我匹配的问题。我尝试将并发的_请求设置为1,但没有帮助

有没有办法强迫scrapy在继续之前等待每个FormRequest完成,或者将输入搜索项与其输出一起包括在内

我的Python知识并不先进,所以我希望代码中有一个简单的调整可以有所帮助


任何指导都将不胜感激

您可以将CSV数据添加到您的请求中,并将其包含在最终产量中。 这将创建一个不需要“将它们重新匹配”的输出


您可以将CSV数据添加到您的请求中,并将其包含在最终产量中。 这将创建一个不需要“将它们重新匹配”的输出


最简单的方法可能是在request.meta dict中添加原始行号,并在解析时输出它

类似这样(未经测试):


最简单的方法可能是在request.meta dict中添加原始行号,并在解析时输出它

类似这样(未经测试):

from scrapy.item import Item, Field
from scrapy.http import FormRequest
from scrapy.spider import Spider

class ExampleSpider(Spider):
    name = "examplecsv"
    allowed_domains = ["examplewebsite.com"]
    start_urls = ["https://www.examplewebsite.com"]

    def parse(self, response):
        with open('addresses.csv') as fp:
            for line in fp:
                yield FormRequest.from_response(response,
                                        formdata={'examplesearchfield':line},
                                        clickdata={'id': 'clickexamplesearch'},
                                        meta={'line' : line },
                                        callback=self.parse1)

    def parse1 (self, response):

        for title in response.css('title'):
            yield {
                'line' : response.meta.get('line')
                'title':title.css('title::text').re(r'^[^|]+(?=|)')
            }
from scrapy.item import Item, Field
from scrapy.http import FormRequest
from scrapy.spider import Spider

class ExampleSpider(Spider):
    name = "examplecsv"
    allowed_domains = ["examplewebsite.com"]
    start_urls = ["https://www.examplewebsite.com"]

    def parse(self, response):
        with open('addresses.csv') as fp:
            for i, line in enumerate(fp, start=1):
                yield FormRequest.from_response(response,
                                        formdata={'examplesearchfield':line},
                                        clickdata={'id': 'clickexamplesearch'},
                                        callback=self.parse1,
                                        meta={'lineno': i})

    def parse1 (self, response):

        for title in response.css('title'):
            yield {

                'title':title.css('title::text').re(r'^[^|]+(?=|)'),
                'lineno': response.meta['lineno']
            }