使用Scrapy以升序导出已擦除的数据

ioekq8ef  于 2022-11-09  发布在  其他
关注(0)|答案(1)|浏览(158)

我用scrapy刮我的网站为4列(股票数量/名称/价格/网址)。我想输出的文件是按字母顺序从名称列排序。我可以进入csv和排序它手动,但一些向导必须知道一种方法来做到这一点的脚本?
编码:

import scrapy
from scrapy.crawler import CrawlerProcess
import  csv

cs = open('results/2x2_results.csv', 'w', newline="", encoding='utf-8')
header_names = ['stk','name','price','url']
csv_writer = csv.DictWriter(cs, fieldnames=header_names)
csv_writer.writeheader()

class SCXX(scrapy.Spider):
 name = 'SCXX'
  start_urls = [
    'https://website.com'
  ]

def parse(self,response):
    product_urls  = response.css('div.grid-uniform a.product-grid-item::attr(href)').extract()

    for product_url in product_urls:
        yield scrapy.Request(url='https://website.com'+product_url,callback=self.next_parse_two)

    next_url  = response.css('ul.pagination-custom li a[title="Next »"]::attr(href)').get()
    if next_url != None:
        yield scrapy.Request(url='https://website.com'+next_url,callback=self.parse)

def next_parse_two(self,response):
    item = dict()
    item['stk'] = response.css('script#swym-snippet::text').get().split('stk:')[1].split(',')[0]
    item['name'] = response.css('h1.h2::text').get()
    item['price'] =response.css('span#productPrice-product-template span.visually-hidden::text').get()
    item['url'] = response.url
    csv_writer.writerow(item)
    cs.flush()

process = CrawlerProcess({
'USER_AGENT': 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)'
})

process.crawl(SCXX)
process.start()
6l7fqoea

6l7fqoea1#

溶液

Scrapy是异步工作的,请求的处理没有顺序,想象一下,有一群工人,有的拿苹果,有的拿香蕉,有的拿橘子,你会如何对他们排序,你可以告诉他们把每种水果摘下来放在篮子里(这就是我们所说的插入或放入排序)但在编程中,这将是一个太多的麻烦,我会建议只是为了获得数据,并基本上使用sort()对它之后。
数据没有按任何顺序写入。所有的数据都是一次启动,并在运行中写入。你可以做的是运行一个后擦除脚本,最后将其排序。这可能是最好的方法。

import scrapy
from scrapy.crawler import CrawlerProcess

class MySpider(scrapy.Spider):
    # Your spider definition
    ...

process = CrawlerProcess(settings={
    "FEEDS": {
        "items.json": {"format": "json"},
    },
})

process.crawl(MySpider)
process.start() # the script will block here until the crawling is finished

# Load the JSON and use .sort() on the dict and write it again.

with open('items.json') as file:
    data = json.load(file)
    data.sort() # we would have to use a specific key to sort it alphabetically like the title. 
with open('output.json', 'w') as outfile:
    json.dump(data, outfile) (write to a file)
附加注解

我们最好将其写入内存流io库,但我猜您不知道如何执行此操作,这就是为什么将其写入文件,然后在该文件上执行操作会更容易。
"如果你有任何问题,请告诉我“

相关问题