如何基于Scrapy中第一个请求的响应构造请求列表?

约翰 :

我想抓取一个API。API将返回一些数据和数据总量。我想要

  1. 请先调用一次API,然后获取总数据量。
  2. 然后,将数据总量除以页面大小即可得到总页数。
  3. 接下来,构造要发送的请求列表

但是我不确定如何在Scrapy中做到这一点。这是我的start_requests

def start_requests(self):
        url = "https://hkapi.centanet.com/api/Transaction/Map.json" 

        page = 1

        headers = {
            'lang': 'tc',
            'Content-Type': 'application/json; charset=UTF-8',
            'Connection': 'Keep-Alive',
            'User-Agent': 'okhttp/4.7.2' 
        }

        payload = {
            "daterange": 180,
            "postType": "s",
            "refdate": "20200701",
            "order": "desc",
            "page": f"{page}",
            "pageSize": 100,
            "pixelHeight": 2220,
            "pixelWidth": 1080,
            "points[0].lat": 22.695053063373795,
            "points[0].lng": 113.85844465345144,
            "points[1].lat": 22.695053063373795,
            "points[1].lng": 114.38281349837781,
            "points[2].lat": 21.993328259196705,
            "points[2].lng": 114.38281349837781,
            "points[3].lat": 21.993328259196705,
            "points[3].lng": 113.85844465345144,
            "sort": "score",
            "zoom": 9.745128631591797,
            "platform": "android"
        }

        yield scrapy.Request(url, callback=self.parse, method="POST", headers=headers, body=json.dumps(payload))

这是我的parse

    def parse(self, response):
        json_response = json.loads(response.text)
        yield json_response

我想我可以提取数据总数并计算parse函数中的页面总数但是,我怎样才能得到这个数字并构造一个有效载荷列表呢?

例如,如果页面总数为3,则我将构造一个长度为3的有效负载列表,然后遍历有效负载。

JSON响应示例:

    {
    "DITems":[],
    "TransactionCount": 34037,
    "Count": 34037,
    "MinPoint": {
        "Lat": 22.2390387561,
        "Lng": 113.9203349215
    },
    "MaxPoint": {
        "Lat": 22.5454478015,
        "Lng": 114.2243478859
    },
    "RoundTripNeeded": false
    }

谢谢!这是我使用Scrapy的第一个项目!

亚伦斯:

如果我对您的理解正确,那么您要做的就是在有效负载周围执行for循环,并在获得第一个请求的总页数后,基于该特定有效负载发送一个请求。

根据评论更新

total_pages = json.loads(response.text)['total_pages']以访问parse函数内json文件中的总页数为例

代码示例

url = "https://hkapi.centanet.com/api/Transaction/Map.json" 
headers = {
          'lang': 'tc',
          'Content-Type': 'application/json; charset=UTF-8',
          'Connection': 'Keep-Alive',
          'User-Agent': 'okhttp/4.7.2' 
         }

first_payload = {
            "daterange": 180,
            "postType": "s",
            "refdate": "20200701",
            "order": "desc",
            "page": "1",
            "pageSize": 100,
            "pixelHeight": 2220,
            "pixelWidth": 1080,
            "points[0].lat": 22.695053063373795,
            "points[0].lng": 113.85844465345144,
            "points[1].lat": 22.695053063373795,
            "points[1].lng": 114.38281349837781,
            "points[2].lat": 21.993328259196705,
            "points[2].lng": 114.38281349837781,
            "points[3].lat": 21.993328259196705,
            "points[3].lng": 113.85844465345144,
            "sort": "score",
            "zoom": 9.745128631591797,
            "platform": "android"
           }  

def start_requests(self):
   
    yield scrapy.Request(url=self.url, callback=self.parse, method="POST", headers=self.headers, body=json.dumps(self.first_payload))

def parse(self,response):
    total_pages = json.loads(response.text)['total_pages']
    for i in range(2,total_pages+1):
        page = i
        payload = {
           "daterange": 180,
           "postType": "s",
           "refdate": "20200701",
           "order": "desc",
           "page": f"{page}",
           "pageSize": 100,
           "pixelHeight": 2220,
           "pixelWidth": 1080,
           "points[0].lat": 22.695053063373795,
           "points[0].lng": 113.85844465345144,
           "points[1].lat": 22.695053063373795,
           "points[1].lng": 114.38281349837781,
           "points[2].lat": 21.993328259196705,
           "points[2].lng": 114.38281349837781,
           "points[3].lat": 21.993328259196705,
           "points[3].lng": 113.85844465345144,
           "sort": "score",
           "zoom": 9.745128631591797,
           "platform": "android"
          }
       yield scrapy.Request(url=self.url, callback=self.parse_new_requests, method="POST", headers=self.headers, body=json.dumps(payload))

def parse_new_requests(self,response):
    json_response = json.loads(response.text)
    yield json_response

说明

我们首先请求获取total_page变量。然后我们total_pages在解析函数中定义它然后,我们可以使用它来进行for循环range(2,total_page+1),因为我们不需要第一页。创建每个特定的有效负载,然后将其传递到parse_new_requests

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

是会话的第一个请求后自动创建?

如何从列表中删除第一个项目?

UIWebView的第一个请求太慢

请求,错误:无法验证第一个证书

Webclient的第一个请求很慢

如何基于第一个响应在RxJS中发出多个Ajax请求

如何使用@RequestParam在Spring MVC中请求数组类型参数时始终获取第一个参数

如何基于第一个值Python替换元组排序列表中的元组

基于子列表中的第一个元素的列表的集群列表

当第二个请求依赖第一个请求时,如何在Angular中同步http.get请求?

针对相同的第一个请求在第二个响应中声明json参数值

无法通过Python请求获得“第一个”响应

根据第一个API响应对每个数组元素发出API请求

RxJS顺序请求并返回Observable <>第一个响应

我如何提出依赖于第一个Firebase响应next.js的Firestore请求

CFHTTP:第一个请求很快,之后很慢

如何在Smarty中截断请求URI以仅获取第一个块?

DotNetNuke-第一个请求返回404

命令与第一个请求不同步

仅调用第一个请求UIWebView

得到第一个请求的响应后,调用第二个改造请求

如何在Mysql请求中取第一个字母

基于第一个元素在列表列表中对列表进行分组

如何获取列表中的第一个标签?

Google App Engine - 第一个请求很慢

如何访问列表中的第一个值?

在我得到第一个 api 的响应后向另一个 api 发出请求

如何仅获取此请求 Json 中括号之间的第一个值

如何获取列表中的第一个值