首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >带有Scrapy请求的Kickstarter GraphQL API

带有Scrapy请求的Kickstarter GraphQL API
EN

Stack Overflow用户
提问于 2022-02-23 05:08:39
回答 2查看 687关注 0票数 0

我试图为kickstarter.com中列出的一些项目提取特定的数据。

Kickstarter.com使用GraphQL,我试图复制该API,它与Python一起工作,但是当我在刮取请求中使用它时,它一直返回错误403。

我假设问题是在内容类型,但我未能找到正确的一个,我应该使用,注意到它的工作方式与此完全一样,当我使用正常的请求库。

代码语言:javascript
运行
复制
def start_requests(self):
    url = "https://www.kickstarter.com/graph"
    payload = json.dumps([
    {
        "operationName": "Campaign",
        "variables": {
        "slug": "leightonconnor/akashic-titan-blue-bolt"
        },
        "query": "query Campaign($slug: String!) {\n  project(slug: $slug) {\n    id\n    isSharingProjectBudget\n    risks\n    story(assetWidth: 680)\n    currency\n    spreadsheet {\n      displayMode\n      public\n      url\n      data {\n        name\n        value\n        phase\n        rowNum\n        __typename\n      }\n      dataLastUpdatedAt\n      __typename\n    }\n    environmentalCommitments {\n      id\n      commitmentCategory\n      description\n      __typename\n    }\n    __typename\n  }\n}\n"
    }
    ])
    headers = {
    'content-type': 'application/json',
    'x-csrf-token': 'AZsT67Z9s-LHZt6ZJXLSQWJlNdd7biKz2XDfFMkcYMZrNufH1OWoFhNBlXIvxCrxKRzV6l8bG_Z6QlcRoYMe_g',
    'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.102 Safari/537.36',
    'cookie': '_ksr_session=fc2U7qXXaRN91foNiE53NyU3s181NZO0Ll57xPkYxZ5iyUNgus35a0HwsPBTfViBY%2ByAKbtpRirAVLxOGKzG%2BYMOmsLRBPujZep%2Fca%2B1%2FXzW3xX56VXkh5w6ItYhIctEFifQQhw3rTmvoljyHw%3D%3D--4pK6xBEgChjqgmte--LH4Q1qSnhU%2FYX9JgTzGuSQ%3D%3D;'
    }
    print('..ok')
    yield scrapy.Request(url, method="POST", headers=headers, body=payload, callback=self.parse_project)

返回:

代码语言:javascript
运行
复制
2022-02-23 07:06:55 [scrapy.core.engine] DEBUG: Crawled (403) <POST https://www.kickstarter.com/graph> (referer: None)
2022-02-23 07:06:55 [scrapy.spidermiddlewares.httperror] INFO: Ignoring response <403 https://www.kickstarter.com/graph>: HTTP status code is not handled or not allowed

Python请求(Works)中的代码:

代码语言:javascript
运行
复制
import requests
import json

url = "https://www.kickstarter.com/graph"

payload = json.dumps([
  {
    "operationName": "Campaign",
    "variables": {
      "slug": "leightonconnor/akashic-titan-blue-bolt"
    },
    "query": "query Campaign($slug: String!) {\n  project(slug: $slug) {\n    id\n    isSharingProjectBudget\n    risks\n    story(assetWidth: 680)\n    currency\n    spreadsheet {\n      displayMode\n      public\n      url\n      data {\n        name\n        value\n        phase\n        rowNum\n        __typename\n      }\n      dataLastUpdatedAt\n      __typename\n    }\n    environmentalCommitments {\n      id\n      commitmentCategory\n      description\n      __typename\n    }\n    __typename\n  }\n}\n"
  }
])
headers = {
  'content-type': 'application/json',
  'x-csrf-token': 'AZsT67Z9s-LHZt6ZJXLSQWJlNdd7biKz2XDfFMkcYMZrNufH1OWoFhNBlXIvxCrxKRzV6l8bG_Z6QlcRoYMe_g',
  'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.102 Safari/537.36',
  'cookie': '_ksr_session=fc2U7qXXaRN91foNiE53NyU3s181NZO0Ll57xPkYxZ5iyUNgus35a0HwsPBTfViBY%2ByAKbtpRirAVLxOGKzG%2BYMOmsLRBPujZep%2Fca%2B1%2FXzW3xX56VXkh5w6ItYhIctEFifQQhw3rTmvoljyHw%3D%3D--4pK6xBEgChjqgmte--LH4Q1qSnhU%2FYX9JgTzGuSQ%3D%3D;'
}

response = requests.request("POST", url, headers=headers, data=payload)
print(response.status_code)
print(response.json()[0]['data']['project']['risks'])
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-02-23 16:53:40

下面是它对我的作用:

  1. 打开要刮的页面。
  2. 查看检查工具中的“网络”选项卡。
  3. 查找包含所需信息的GraphQl请求。
  4. 右击它,然后转到复制>复制为卷曲(bash)。(这是假设您使用的是chrome,我认为其他浏览器也使用它,但我使用的是chrome)。
  5. 转到curl2scrapy并粘贴您的curl命令。它会给你头和有效载荷。
  6. 在运行它之前,将查询中的所有\n替换为\\n
票数 2
EN

Stack Overflow用户

发布于 2022-08-22 15:11:36

为了防止有人来这里(像我一样),他通常会向graphql发出post请求(在kickstarter上不是特别的)。我最初的情况是一样的,我有一个工作要求。请求,但未能将其转换为Scrapy。

tldr:在我的例子中,比较完整的请求,刮擦请求的头是不够的。

一般来说,类似的东西应该适用于刮伤(在本例中是刮擦外壳):

代码语言:javascript
运行
复制
q = """
    query GetSomething($xId: ID!) { 
          x(id: $xId) {
            title}
            }
    """

j = {'query': q, 'variables': {
                'xId': "12345",
            }}

scrapy_request = Request(url=url, method='POST',
                         body=json.dumps(j),
                         )

fetch(scrapy_request)

但请记住,请求可能会以其他方式修改您的请求,就像刮擦一样。特别是,如果您有自定义中间件或其他东西。因此,调查您的标题是否包含正确的条目,例如。

代码语言:javascript
运行
复制
'Content-Type': 'application/json'

代码语言:javascript
运行
复制
'Accept': '*/*',

要比较您的请求,有人在刮擦不和谐通道推荐http://httpbin.org/作为工具,有一个端点返回状态200。之后,您可以比较响应、正文和标头,以找到敏感的差异。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71231638

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档