试图刮取这个网站,代码返回一个空的csv-PYTHON刮片
试图刮取这个网站,代码返回一个空的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
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中