我用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()
1条答案
按热度按时间6l7fqoea1#
溶液
Scrapy是异步工作的,请求的处理没有顺序,想象一下,有一群工人,有的拿苹果,有的拿香蕉,有的拿橘子,你会如何对他们排序,你可以告诉他们把每种水果摘下来放在篮子里(这就是我们所说的插入或放入排序)但在编程中,这将是一个太多的麻烦,我会建议只是为了获得数据,并基本上使用
sort()
对它之后。数据没有按任何顺序写入。所有的数据都是一次启动,并在运行中写入。你可以做的是运行一个后擦除脚本,最后将其排序。这可能是最好的方法。
附加注解
我们最好将其写入内存流
io
库,但我猜您不知道如何执行此操作,这就是为什么将其写入文件,然后在该文件上执行操作会更容易。"如果你有任何问题,请告诉我“