Python 如何从两个不同的部分刮取物品?
我是一个新的刮擦和网页爬行,我一直在网页www.mercadolibre.com.mx上工作,我必须(从起始页)获得一些关于那里显示的产品的数据(描述和价格)。这是我的items.py:Python 如何从两个不同的部分刮取物品?,python,mysql,xpath,web-scraping,scrapy,Python,Mysql,Xpath,Web Scraping,Scrapy,我是一个新的刮擦和网页爬行,我一直在网页www.mercadolibre.com.mx上工作,我必须(从起始页)获得一些关于那里显示的产品的数据(描述和价格)。这是我的items.py: from scrapy.item import Item, Field class PruebaMercadolibreItem(Item): producto = Field() precio = Field() 这是我的蜘蛛: from scrapy.spider import Base
from scrapy.item import Item, Field
class PruebaMercadolibreItem(Item):
producto = Field()
precio = Field()
这是我的蜘蛛:
from scrapy.spider import BaseSpider
from scrapy.selector import HtmlXPathSelector
from prueba_mercadolibre.items import PruebaMercadolibreItem
class MLSpider(BaseSpider):
name = "mlspider"
allowed_domains = ["mercadolibre.com"]
start_urls = ["http://www.mercadolibre.com.mx"]
def parse (self, response):
hxs = HtmlXPathSelector(response)
titles = hxs.select("//div[@class='item-data']")
items = []
for titles in titles:
item = PruebaMercadolibreItem()
item["producto"] = titles.select("p[@class='tit le']/@title").extract()
item["precio"] = titles.select("span[@class='ch-price']/text()").extract()
items.append(item)
return items
问题是,当我更改此行时,在中得到相同的结果:
titles = hxs.select("//div[@class='item-data']")
为此:
titles = hxs.select("//div[@class='item-data'] | //div[@class='item-data item-data-mp']")
我得到的数据与我使用第一行时的数据不一样
有人能帮我吗?我的xPath选择中有错误吗
另外,我也找不到一个好的教程来使用MySQL与scrapy,我将感谢任何帮助。Thx如果要获取包含
项目数据的所有div
标记,请更好地使用包含类:
titles = hxs.select("//div[contains(@class, 'item-data')]")
此外,spider中还有其他问题:
- 在循环中,您正在覆盖
标题
producto
xpath中的类名应该是title
,而不是title
- 您可能不希望在
字段中有列表
值,请从ed列表中取出第一个项目
HtmlXPathSelector
已弃用,请改用
select()
已弃用,请改用
BaseSpider
已重命名为
以下是经过修改的代码:
from scrapy.spider import Spider
from scrapy.selector import Selector
from scrapy.item import Item, Field
from prueba_mercadolibre.items import PruebaMercadolibreItem
class MLSpider(Spider):
name = "mlspider"
allowed_domains = ["mercadolibre.com"]
start_urls = ["http://www.mercadolibre.com.mx"]
def parse (self, response):
hxs = Selector(response)
titles = hxs.xpath("//div[contains(@class, 'item-data')]")
for title in titles:
item = PruebaMercadolibreItem()
item["producto"] = title.xpath("p[@class='title']/@title").extract()[0]
item["precio"] = title.xpath("span[@class='ch-price']/text()").extract()[0]
yield item
输出中的示例项:
{'precio': u'$ 35,000', 'producto': u'Cuatrimoto, Utv De 500cc 4x4 ,moto , Motos, Atv ,'}
{'precio': u'$ 695', 'producto': u'Reloj Esp\xeda Camara Oculta Video Hd 16 Gb! Sony Compara.'}
好的,thx的提示,我不知道很多东西,但是,我这里真正的问题是,我是否可以从不同的来源获得数据,例如,我需要来自“//div[contains(@class,'item data')]”和//div[contains(@class,'item data item data mp')]的数据,我该怎么做?@AlexLezama我发布的代码已经在这样做了。它在contains
的帮助下处理这两种情况。我仍然有一些疑问,在www.mercadolibre.com.mx页面上,我可以看到超过24个项目,而这个代码总是只返回我24个,你知道为什么吗?@AlexLezama是的,我现在知道了。情况有点复杂,item data mp
items不存在于html scrapy-get中,因为构建web页面时涉及到一个javascript函数。我担心从页面上获取其他项目(使用itemdatamp
class)并不容易。如果你不知道怎么做,那么我现在就无法解决这个问题,你知道我在哪里可以找到一个关于如何将信息从这个蜘蛛传递到MySQL数据库的好教程吗?我是新来的scrapy,我不习惯所有的辛塔克斯和我在其他地方读过的东西,我真的希望得到任何帮助。顺便说一句,我使用的是Windows8