Python 如何使用scrapy为爬行蜘蛛创建规则

Python 如何使用scrapy为爬行蜘蛛创建规则,python,web-crawler,scrapy,Python,Web Crawler,Scrapy,我的目标是抓取www.mangahere.com/seinen或该网站上的任何内容。我想翻阅每一页,收集评级超过4.5的书籍。我一开始是一个basespider,并试图复制和阅读这本粗糙的教程,但它几乎超出了我的想象。我来这里是想问我该怎么做才能制定规则,以及如何制定规则。我似乎也不能让我的条件发挥作用,代码要么只返回第一个项目,不管条件如何停止,要么抓住一切,再次不管条件如何。我知道这可能是相当混乱的代码,但我仍然在努力学习。请随意修改代码或提供其他建议严格来说,这并不能回答问题,因为我的代码

我的目标是抓取www.mangahere.com/seinen或该网站上的任何内容。我想翻阅每一页,收集评级超过4.5的书籍。我一开始是一个basespider,并试图复制和阅读这本粗糙的教程,但它几乎超出了我的想象。我来这里是想问我该怎么做才能制定规则,以及如何制定规则。我似乎也不能让我的条件发挥作用,代码要么只返回第一个项目,不管条件如何停止,要么抓住一切,再次不管条件如何。我知道这可能是相当混乱的代码,但我仍然在努力学习。请随意修改代码或提供其他建议

严格来说,这并不能回答问题,因为我的代码使用了
BaseSpider
而不是
CrawlSpider
,但它确实满足OP的要求,所以

注意事项:

  • 由于所有的分页链接都不可用(您得到的是前九个,然后是最后两个),因此我采用了一种有点黑客风格的方法。使用
    parse
    回调中的第一个响应,我搜索一个类为“next”的链接(只有一个,所以请查看它对应于哪个链接),然后找到它的前一个同级链接。这为我提供了seinen类别中总页数的句柄(目前为45页)
  • 接下来,我们为
    parse\u项
    回调处理的第一个页面生成一个请求对象
  • 然后,考虑到我们已经确定总共有45个页面,我们为“/seinen/2.htm”生成一系列请求对象,一直到“/seinen/45.htm”
  • 由于
    rating
    是一个列表,其值是浮动的(我应该在条件为4.5的基础上意识到这一点),因此修复遇到的错误的方法是循环查看评级列表,并将每个项目转换为浮动
  • 无论如何,看看下面的代码,看看它是否有意义。从理论上讲,您应该能够轻松地扩展此代码以刮取多个类别,尽管这是留给OP的一个练习:)


    啊,这是有道理的,我试过浮动(评级),但由于某种原因,这不起作用,谢谢。我将重新测试代码并返回结果。它说我不能将评级转换为int,因为它是一个列表,我如何使它不返回列表?
    from scrapy.spider import BaseSpider
    from scrapy.selector import HtmlXPathSelector
    from manga.items import MangaItem
    
    class MangaHere(BaseSpider):
        name = "mangah"
        allowed_domains = ["mangahere.com"]
        start_urls = ["http://www.mangahere.com/seinen/"]
    
        def parse(self,response):
            hxs = HtmlXPathSelector(response)
            sites = hxs.select('//ul/li/div')
            items = []
            for site in sites:
                rating = site.select("p/span/text()").extract()
                if rating > 4.5:
                    item = MangaItem()
                    item["title"] = site.select("div/a/text()").extract()
                    item["desc"] = site.select("p[2]/text()").extract()
                    item["link"] = site.select("div/a/@href").extract()
                    item["rate"] = site.select("p/span/text()").extract()
                    items.append(item)
    
            return items
    
    from scrapy.spider import BaseSpider
    from scrapy.contrib.linkextractors.sgml import SgmlLinkExtractor
    from scrapy.selector import HtmlXPathSelector
    from scrapy.http import Request
    from tutorial.items import MangaItem
    from urlparse import urlparse
    
    class MangaHere(BaseSpider):
        name = "mangah2"
        start_urls = ["http://www.mangahere.com/seinen/"]
        allowed_domains = ["mangahere.com"]
    
        def parse(self, response):
            # get index depth ie the total number of pages for the category
            hxs = HtmlXPathSelector(response)
            next_link = hxs.select('//a[@class="next"]')
            index_depth = int(next_link.select('preceding-sibling::a[1]/text()').extract()[0])
    
            # create a request for the first page
            url = urlparse("http://www.mangahere.com/seinen/")
            yield Request(url.geturl(), callback=self.parse_item)
    
            # create a request for each subsequent page in the form "./seinen/x.htm"
            for x in xrange(2, index_depth):
                pageURL = "http://www.mangahere.com/seinen/%s.htm" % x
                url = urlparse(pageURL)
                yield Request(url.geturl(), callback=self.parse_item)
    
        def parse_item(self,response):
            hxs = HtmlXPathSelector(response)
            sites = hxs.select('//ul/li/div')
            items = []
            for site in sites:
                rating = site.select("p/span/text()").extract()
                for r in rating:
                    if float(r) > 4.5:
                        item = MangaItem()
                        item["title"] = site.select("div/a/text()").extract()
                        item["desc"] = site.select("p[2]/text()").extract()
                        item["link"] = site.select("div/a/@href").extract()
                        item["rate"] = site.select("p/span/text()").extract()
                        items.append(item)
            return items