Javascript 使用Scrapy使用无限卷轴抓取网站
我正试图从我所在地区的旧物品中刮取一些用于个人项目的物品。我觉得这个视频很有帮助。然而,有一些微妙的差异,视频没有帮助 我需要的信息是通过json异步加载的。网站每个卷轴加载15个项目(初始加载包含30个项目除外)。json对象如下所示:接下来要加载的15项如下所示: 当我加载第一个响应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'
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个项目;)