Python 使用Scrapy在规则中的URL列表上使用参数进行爬网迭代

Python 使用Scrapy在规则中的URL列表上使用参数进行爬网迭代,python,python-3.x,web-scraping,scrapy,scrapy-spider,Python,Python 3.x,Web Scraping,Scrapy,Scrapy Spider,我是Scrapy和Python的新手。我想做以下工作: 访问url并获取包含“店铺/产品”的所有链接,作为url的一部分。这些链接看起来像:“ 废弃一个起始url的url,并获取产品总数,total。在代码中,总计=每个类别的项目数 最后,向url添加“?sort=Top&size=12&start=PARAM”。在每次迭代中,PARAM必须增加12,以防PARAM爬行器访问urlhttp://www.example.com/shop/products,提取元素中的所有链接,并使用parse\u

我是Scrapy和Python的新手。我想做以下工作:

  • 访问url并获取包含“店铺/产品”的所有链接,作为url的一部分。这些链接看起来像:“

  • 废弃一个起始url的url,并获取产品总数,total。在代码中,总计=每个类别的项目数


  • 最后,向url添加“?sort=Top&size=12&start=PARAM”。在每次迭代中,PARAM必须增加12,以防PARAM爬行器访问url
    http://www.example.com/shop/products
    ,提取
  • 元素中的所有链接,并使用
    parse\u list
    回调获取所有链接。在我看来,这并不是你所期待的行为——相反,你应该在规则中使用一些包含种子url和提取器的起始url,其中包含
    allow=r“shop/products”

    此外,此部分
    '%s?sort=Top&size=12&start=%s%%(response.url,next_start)
    是错误的,因为response.url包含完整的url,包括GET参数,因此每次您将带有参数的部分附加到现有参数字符串中时,都会像这样
    ?sort=Top&size=12&start=0?sort=Top&size=12&start=12?sort=Top&size=12&start=24
    。在添加新字符串之前从url中清除参数,或者只使用
    FormRequest
    作为传递参数的更方便的方法


    顺便说一句,Scrapy有非常方便的交互式控制台用于调试,您可以使用
    Scrapy.shell.inspect\u response

    从spider的任何部分调用它,谢谢,mizhgun!这就是正在发生的事情!我将和debbuger一起测试这类东西。
    import scrapy
    import re
    import datetime
    
    from scrapy.spiders import CrawlSpider, Rule
    from scrapy.linkextractors.lxmlhtml import LxmlLinkExtractor
    from scrapy.http.request import Request
    
    class MySpider(CrawlSpider):
        name = 'my_spider'
        allowed_domains = ['example.com']
        start_urls = ['http://www.example.com/shop/products']
        rules = (
            Rule(LxmlLinkExtractor(
                restrict_xpaths=('.//li[@class="item"]/a')),
                follow=False,
                callback='parse_list'
            ),
         )
    
        def parse_list(self, response):
            SET_SELECTOR = '.product'
            for item in response.css(ITEM_SELECTOR):
                NAME_SELECTOR = 'div[@class="product"]/h2/a/@title'
                yield {
                    'name': item.xpath(NAME_SELECTOR).extract_first()
                }
    
            NUM_ITEMS_PER_CATEGORY_SELECTOR = 'div[@id="search"]/@data-count'
            num_items_per_category = item.xpath(NUM_ITEMS_PER_CATEGORY_SELECTOR).extract_first()
            nipc = int(0 if num_items_per_category is None else num_items_per_category)
            try:
                next_start = response.meta["next_start"]
            except KeyError:
                next_start = 0
            if next_start <= nipc:
                yield scrapy.Request(
                    response.urljoin('%s?sort=Top&size=12&start=%s' % (response.url, next_start)),
                    meta={"next_start": next_start + 12},
                    dont_filter=True,
                    callback = self.parse_list
                )