【问题标题】:Scrapy spider difference between Crawled pages and Scraped items抓取的页面和抓取的项目之间的 Scrapy spider 区别
【发布时间】:2013-04-04 04:24:18
【问题描述】:

我正在编写一个 Scrapy CrawlSpider,它读取第一页上的广告列表,获取一些信息,例如列表和广告 URL 的缩略图,然后向每个广告 URL 发出请求以获取其详细信息。

它在测试环境中工作和分页显然很好,但是今天尝试完整运行我在日志中意识到:

抓取 3852 个页面(以 228 页/分钟),抓取 256 个项目(以 15 个/分钟)

我不明白抓取页面和抓取的项目之间存在如此大差异的原因。任何人都可以帮助我了解这些物品在哪里丢失了?

我的蜘蛛代码:

class MySpider(CrawlSpider):
    name = "myspider"
    allowed_domains = ["myspider.com", "myspider.co"]
    start_urls = [
        "http://www.myspider.com/offers/myCity/typeOfAd/?search=fast",
    ]

    #Pagination
    rules = (
        Rule (
            SgmlLinkExtractor()
           , callback='parse_start_url', follow= True),
    )

    #1st page
    def parse_start_url(self, response):

        hxs = HtmlXPathSelector(response)

        next_page = hxs.select("//a[@class='pagNext']/@href").extract()
        offers = hxs.select("//div[@class='hlist']")

        for offer in offers:
            myItem = myItem()

            myItem['url'] = offer.select('.//span[@class="location"]/a/@href').extract()[0]
            myItem['thumb'] = oferta.select('.//div[@class="itemFoto"]/div/a/img/@src').extract()[0]

            request = Request(myItem['url'], callback = self.second_page)
            request.meta['myItem'] = myItem

            yield request

        if next_page:
            yield Request(next_page[0], callback=self.parse_start_url)


    def second_page(self,response):
        myItem = response.meta['myItem']

        loader = myItemLoader(item=myItem, response=response)

        loader.add_xpath('address', '//span[@itemprop="streetAddress"]/text()') 

        return loader.load_item()

【问题讨论】:

  • 页面可以抓取,但有些内容可能无法抓取,可能没有符合您抓取的页面上的条件

标签: python web-crawler scrapy


【解决方案1】:

假设你去你的第一个start_urls(实际上你只有一个),在这个页面上只有一个锚链接(<a>)。因此,您的蜘蛛会抓取此链接中的 href 网址,并且您可以控制回调 parse_start_url。在这个页面中,你有 5000 个 div 和 hlist 类。假设所有 5000 个后续 URL 均返回 404,未找到。

在这种情况下,你会:

  • 抓取的页面数:5001
  • 抓取的项目:0

让我们再举一个例子:在您的起始 url 页面上,您有 5000 个锚点,但这些页面中没有一个(如零)有任何类参数为 hlist 的 div。

在这种情况下,你会:

  • 抓取的页面数:5001
  • 抓取的项目:0

您的答案在于 DEBUG 日志输出。

【讨论】:

  • 其实我的 start_urls 响应的每一页都会返回 26 个有效的 url。它们都将我引向一个基本模板,即使子页面中的所有数据都是空的,项目也应该被抓取。由于我的 DEBUG 没有向我显示任何错误,我担心在提供循环中产生的这 (26) 个请求可能会在 next_page 请求的时刻以某种方式被阻止/丢失,你认为这个结构是正确的方式吗?
  • 是的,结构看起来不错,但是如果没有日志输出或实际 url,很难猜测发生了什么。
猜你喜欢
  • 2018-09-22
  • 1970-01-01
  • 2016-10-18
  • 1970-01-01
  • 1970-01-01
  • 2013-02-12
  • 1970-01-01
  • 1970-01-01
  • 2023-02-15
相关资源
最近更新 更多