Python爬虫框架pyspider中如何抓取相同URL接口但参数不同的数据?
点击 run 之后只能看到这么一个 url, 而且参数是 json 格式时,貌似无法携带参数, 用 requests 却没有问题。
Python爬虫框架pyspider中如何抓取相同URL接口但参数不同的数据?
2 回复
在pyspider里抓相同URL不同参数的数据,直接在on_start里循环生成带参数的URL就行。比如你要抓分页数据,可以这样搞:
from pyspider import Spider, Request
class MySpider(Spider):
def on_start(self):
base_url = 'http://example.com/api/data'
for page in range(1, 11): # 假设抓10页
params = {'page': page, 'size': 20}
url = base_url + '?' + '&'.join([f'{k}={v}' for k, v in params.items()])
self.crawl(url, callback=self.parse_page)
def parse_page(self, response):
# 解析每页数据的逻辑
data = response.json
for item in data.get('items', []):
# 处理每个数据项
yield item
如果参数是动态的或者需要从之前的响应里提取,就在回调函数里继续生成新请求。比如先抓列表页拿到ID,再拼详情页URL:
def parse_list(self, response):
# 从列表页提取ID
ids = response.doc('.item-id').text()
for id in ids:
detail_url = f'http://example.com/detail/{id}'
self.crawl(detail_url, callback=self.parse_detail)
关键就是把参数拼到URL里,然后交给self.crawl去抓。用循环、列表推导式或者从之前响应提取都行。
总结:在on_start或回调函数里循环生成带参URL并调用self.crawl。
url 后面加#,后面跟一个随机参数,我一般是加一个时间戳加一个 random 的随机数字

