0

这是我第一次创建蜘蛛,尽管我很努力,但它仍然没有返回任何内容到我的 csv 导出。我的代码是:

from scrapy.contrib.spiders import CrawlSpider, Rule
from scrapy.contrib.linkextractors.sgml import SgmlLinkExtractor
from scrapy.selector import Selector

class Emag(CrawlSpider):
    name = "emag"
    allowed_domains = ["emag.ro"]
    start_urls = [
        "http://www.emag.ro/"]

    rules = (Rule(SgmlLinkExtractor(allow=(r'www.emag.ro')), callback="parse", follow= True))

    def parse(self, response):
        sel = Selector(response)
        sites = sel.xpath('//a/@href').extract()
        for site in sites:
            site = str(site)

        for clean_site in site:
            name = clean_site.xpath('//[@id=""]/span').extract()
            return name

问题是,如果我打印网站,它会给我一个 URL 列表,这没关系。如果我在 scrapy shell 中的一个 URL 中搜索名称,它会找到它。问题是当我抓取所有链接中的所有名称时。我使用“scrapy crawl emag>emag.cs​​v”运行它

你能给我一个提示有什么问题吗?

4

2 回答 2

1

蜘蛛中的多个问题:

  • rules应该是一个可迭代的,在最后一个括号之前缺少逗号
  • 没有Item指定 - 您需要定义一个Item类并从蜘蛛parse()回调中返回/生成它

这是蜘蛛的固定版本:

from scrapy.contrib.spiders import CrawlSpider, Rule
from scrapy.contrib.linkextractors.sgml import SgmlLinkExtractor
from scrapy.selector import Selector
from scrapy.item import Field, Item


class MyItem(Item):
    name = Field()


class Emag(CrawlSpider):
    name = "emag"
    allowed_domains = ["emag.ro"]
    start_urls = [
        "http://www.emag.ro/"]

    rules = (Rule(SgmlLinkExtractor(allow=(r'www.emag.ro')), callback="parse", follow=True), )

    def parse(self, response):
        sel = Selector(response)
        sites = sel.xpath('//a/@href')
        for site in sites:
            item = MyItem()
            item['name'] = site.xpath('//[@id=""]/span').extract()
            yield item
于 2014-06-18T18:15:24.567 回答
0

一个问题可能是,您已被该站点的 robots.txt 禁止您可以从日志跟踪中检查。如果是这样,请转到您的 settings.py 并设置 ROBOTSTXT_OBEY=False 这解决了我的问题

于 2020-02-15T09:58:59.617 回答