砂纸:从CSV,按顺序或搜索术语出口



我是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相匹配的问题。我尝试将Concurrent_requests设置为1,但这无济于事。

是否有一种方法是强迫砂纸等待每个formrequest在继续之前完成,或者包括输入搜索词及其输出以及输入词?

我的Python知识不是先进的,因此我希望对代码有一个简单的调整可以帮助。

任何指导都将不胜感激。

最简单的是在请求中添加原始行号。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 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']
            }

您可以将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'},
                                        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'^[^|]+(?=|)')
            }

最新更新