Javascript 使用Scrapy使用无限卷轴抓取网站

Javascript 使用Scrapy使用无限卷轴抓取网站,javascript,json,python-3.x,web-scraping,scrapy,Javascript,Json,Python 3.x,Web Scraping,Scrapy,我正试图从我所在地区的旧物品中刮取一些用于个人项目的物品。我觉得这个视频很有帮助。然而,有一些微妙的差异,视频没有帮助 我需要的信息是通过json异步加载的。网站每个卷轴加载15个项目(初始加载包含30个项目除外)。json对象如下所示:接下来要加载的15项如下所示: 当我加载第一个响应data=json.loads(response.text)时,它返回30个项目的列表。第一项如下所示: {'attributes': None, 'category_id': 5, 'created_at'

我正试图从我所在地区的旧物品中刮取一些用于个人项目的物品。我觉得这个视频很有帮助。然而,有一些微妙的差异,视频没有帮助

我需要的信息是通过json异步加载的。网站每个卷轴加载15个项目(初始加载包含30个项目除外)。json对象如下所示:接下来要加载的15项如下所示:

当我加载第一个响应
data=json.loads(response.text)
时,它返回30个项目的列表。第一项如下所示:

{'attributes': None,
 'category_id': 5,
 'created_at': '2018-02-12T15:40:56+00:00',
 'currency': 'USD',
 'description': None,
 'featured': False,
 'geo': {'city': 'Asheville',
  'country_code': 'US',
  'distance': 1.1703344331099,
  'lat': 35.5889898,
  'lng': -82.5308015,
  'zip_code': '28805'},
 'id': '6080a1db-b2af-44c2-bfd8-4cc7f1ded17f',
 'image_information': 'brown ukulele',
 'images': [{'id': 'b8e78e2e-65c4-4062-b89e-c775ef9f6bc9',
   'url': 'https://img.letgo.com/images/ab/da/e2/f6/abdae2f68e34170d8f1f22d2473d1153.jpeg'}],
 'language_code': 'US',
 'name': None,
 'owner': {'avatar_url': '',
  'banned': False,
  'city': 'Asheville',
  'country_code': 'US',
  'id': 'fb0f8657-0273-4fac-ba77-9965a1dc8794',
  'is_richy': False,
  'name': 'Brock G',
  'status': 'active',
  'zip_code': '28805'},
 'price': 100,
 'price_flag': 2,
 'rejected': False,
 'status': 1,
 'thumb': {'height': 1280,
  'url': 'https://img.letgo.com/images/ab/da/e2/f6/abdae2f68e34170d8f1f22d2473d1153.jpeg?impolicy=img_200',
  'width': 960},
 'updated_at': '2018-02-12T15:41:34+00:00'}
我的目标是创建一个for循环并提取每个项目,然后继续下一个请求,该请求将加载额外的15个项目,但我不确定如何做到这一点。请注意,其他请求参数如下所示:

更新

我正在接近,但似乎不知道如何在本质上是递归调用自身的函数中简单地更新offset参数:

class LetgoSpider(scrapy.Spider):
    name = 'letgo'
    allowed_domains = ['letgo.com/en']
    start_urls = ['https://search-products-pwa.letgo.com/api/products?country_code=US&offset=0&quadkey=0320030123201&num_results=50&distance_type=mi']

    def parse(self, response):
        data = json.loads(response.text)
        for used_item in data:
            if len(data) == 0:
                break
            try:
                title = used_item['name']
                price = used_item['price']
                description = used_item['description']
                date = used_item['updated_at']
                images = [img['url'] for img in used_item['images']]
                latitude = used_item['geo']['lat']
                longitude = used_item['geo']['lng']               
            except Exception:
                pass

        yield {'Title': title,
               'Price': price,
               'Description': description,
               'Date': date,
               'Images': images,
               'Latitude': latitude,
               'Longitude': longitude          
               }    

        i = 0
        for new_items_load in response:
            i += 50 
            offset = i
            new_request = 'https://search-products-pwa.letgo.com/api/products?country_code=US&offset=' + str(i) + \
                          '&quadkey=0320030123201&num_results=50&distance_type=mi'
            yield scrapy.Request(new_request, callback=self.parse)

不知道我是否理解你的问题

如果您只需要知道如何定义参数,这可能是一种方法:

  let offset, num_results;
  for(let i = 0; i < max; i += 15) {
    offset = i;
    num_results = i + 15;
    [do the request with the parameters values]
  }
let offset,num\u结果;
对于(设i=0;i
谢谢。我只需要继续更新请求,以便在加载和刮取当前项目后继续下一个15个项目。我不知道如何停止请求,或者在没有其他物品可供刮取时说明原因。我对python和scrapy还是相当陌生。
class LetgoSpider(scrapy.Spider):name='letgo'allowed\u domains=['letgo.com/en']start\u url=['https://search-products-pwa.letgo.com/api/products?country_code=US&offset=0&quadkey=0320030123201&num_results=30&distance_type=mi']def parse(self,response):data=json.load(resonse.text)用于数据中使用的_项:yield{}
ok,有两种选择,一种是尝试访问其中一个结束页面。最后一个页面可能会返回一个空列表,一个错误…一旦您确定了差异,您将能够将此条件添加到bucle以结束它。此外,某些情况下,所有响应中都有一个属性,指定了总长度,此响应是否仅用于重复将项目列表转换为数组?或其他一些属性?嗨,基南,伊夫看了看网页,最后一个响应是一个空列表
[]
因此,您只需添加一个条件来检查list.length是否为0。不要基于<50或其他号码执行该条件,因为结束前的呼叫可能包含1到X个项目,例如,对于我的搜索,正好有33个结果,因此空响应前的呼叫大小为3,您不想丢失这3个项目;)