试图刮取这个网站,代码返回一个空的csv-PYTHON刮片

试图刮取这个网站,代码返回一个空的csv-PYTHON刮片,python,html,scrapy,Python,Html,Scrapy,试图刮取这个网站,代码返回一个空的csv-PYTHON刮片 import scrapy from scrapy.item import Field from scrapy.item import Item from scrapy.spiders import CrawlSpider, Rule from scrapy.selector import Selector from scrapy.loader.processors import MapCompose from scrapy.linke

试图刮取这个网站,代码返回一个空的csv-PYTHON刮片

import scrapy
from scrapy.item import Field
from scrapy.item import Item
from scrapy.spiders import CrawlSpider, Rule
from scrapy.selector import Selector
from scrapy.loader.processors import MapCompose
from scrapy.linkextractors import LinkExtractor
from scrapy.loader import ItemLoader


class Articulo(Item): 
    titulo = Field()
    precio = Field()
    descripcion = Field()

class MercadolibreCrawler(CrawlSpider):
    name = 'El Bosquimano'
    custom_settings = {
        'USER_AGENT': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.149 Safari/537.36',
        'CLOSESPIDER_PAGECOUNT': 20
    }

    download_delay = 1  

    allowed_domains = ['listado.mercadolibre.com.ar','articulo.mercadolibre.com.ar'] 
    start_urls = ['https://listado.mercadolibre.com.ar/sillon#D[A:sillon,L:undefined]'] 

    rules = ( 

        Rule(
            LinkExtractor(
                allow=r'/_Desde_\d+'
            ),follow=True 
        ),
        
        Rule(
             LinkExtractor( 
                 allow=r'/MLA-' 
             ), follow=True, callback='parse_items'
        ),
    )

def limpiartexto(self, texto):
    nuevotexto = texto.replace('\n','').replace('\n,').replace('\t','').strip()
    return nuevotexto


def parse_items(self,response): 
    item = ItemLoader(Articulo(),response)    
    item.add_xpath('titulo','//h1[@class="item-title__primary "]/text()', MapCompose(self.limpiartexto))
    item.add_xpath('descripcion','//div[@class="ui-pdp-description"]/p/text()') 
    item.add_xpath('precio','//span[@class="price-tag-fraction"]/text()')
yield item.load_item()
当我在pycharm中使用命令“scrapy runspider namefile.py-o namecv.csv-t csv”执行代码时,它返回一个csv空白 所以我相信问题出在parse_items代码中,特别是在网站的xpath中,但我不知道为什么以及应该使用什么

网站: 从那里我想得到标题,价格(只有数字)和描述


我是一个傻瓜,我将非常感谢您的帮助。看起来您的代码基本上是正确的。在
MercadolibreCrawler()
类中只存在一些缩进问题。以下是缩进的方式:

class Mercadolibricrawler(爬行蜘蛛):
名称='El Bosquimano'
自定义设置={
“用户代理”:“Mozilla/5.0(Windows NT 10.0;Win64;x64)AppleWebKit/537.36(KHTML,类似Gecko)Chrome/80.0.3987.149 Safari/537.36”,
“CLOSESPIDER_PAGECOUNT”:20
}
下载延迟=1
允许的_域=['listado.mercadolibre.com.ar','articulo.mercadolibre.com.ar']
起始URL=['https://listado.mercadolibre.com.ar/sillon#D[A:sillon,L:未定义]']
规则=(
统治(
链接抽取器(
允许=r'/\u Desde\ud+'
),follow=True
),
统治(
LinkedExtractor(
允许=r'/MLA-'
),follow=True,callback='parse_items'
),
)
def limpiartexto(自我,文本):
nuevotexto=texto.replace('\n','').replace('\n',).replace('\t','').strip()
返回新文本
def解析_项(自身、响应):
item=ItemLoader(Articulo(),响应)
item.add_xpath('titulo','//h1[@class=“item-title_uuprimary”]/text(),MapCompose(self.limpiartexto))
item.add_xpath('description','//div[@class=“ui-pdp-description”]/p/text())
item.add_xpath('precio','//span[@class=“price tag fraction”]/text())
屈服项。加载_项()
要使
limpiartexto()
parse_items()
成为
mercadolibrawler()
类的一部分,它们必须缩进
class mercadolibrawler(爬行蜘蛛):
行的右侧一级。类似地,作为
parse_items()
函数的一部分,
yield item.load_item()
应该缩进
def parse_items(self,response):
行右侧一级

运行上面的代码会给你一个CSV,上面有描述和价格,但是标题有问题。在您提供的网页上,标题是这样写的:

“锡龙冥河3号线索——雪尼尔和反斯加罗”
因此,我们可以重写标题的
add_xpath
调用来查找
ui-pdp-title
类:

item.add_xpath('titulo','//h1[@class=“ui-pdp-title”]/text())
我们的
parse_items()
函数现在应该如下所示:

def parse_项(自身、响应):
item=ItemLoader(Articulo(),响应)
item.add_xpath('titulo','//h1[@class=“ui-pdp-title”]/text())
item.add_xpath('description','//div[@class=“ui-pdp-description”]/p/text())
item.add_xpath('precio','//span[@class=“price tag fraction”]/text())
屈服项。加载_项()
如果在
mercadolibribrecrawler()
类中更新该脚本并重新运行脚本,则应将标题、说明和价格保存到CSV中