0

ヘッダー、クッキー、フォームデータ、本文も試しましたが、401 と 500 のステータス コードが返されました。このサイトでは、最初のページは GET メソッドにあり、HTML 応答を返し、それ以降のページは POST メソッドにあり、JSON 応答を返します。しかし、これらのステータスコードは無許可で届きますが、検索したところ、Web ページのヘッダーに CSRF トークンまたは認証トークンが見つかりませんでした。

import scrapy
from SouthShore.items import Product
from scrapy.http import Request, FormRequest

class OjcommerceDSpider(scrapy.Spider):
    handle_httpstatus_list = [401,500]
    name = "ojcommerce_d"
    allowed_domains = ["ojcommerce.com"]
    #start_urls = ['http://www.ojcommerce.com/search?k=south%20shore%20furniture']


    def start_requests(self):
        return [FormRequest('http://www.ojcommerce.com/ajax/search.aspx/FetchDataforPaging',
                        method ="POST",
                        body = '''{"searchTitle" : "south shore furniture","pageIndex" : '2',"sortBy":"1"}''',
                        headers={'Content-Type': 'application/json; charset=UTF-8', 'Accept' : 'application/json, text/javascript, */*; q=0.01',
                                 'Cookie' :'''vid=eAZZP6XwbmybjpTWQCLS+g==;
                                              _ga=GA1.2.1154881264.1480509732;
                                              ASP.NET_SessionId=rkklowbpaxzpp50btpira1yp'''},callback=self.parse)]

    def parse(self,response):
        with open("ojcommerce.json","wb") as f:
            f.write(response.body)
4

1 に答える 1

0

次のコードで動作するようになりました。

import json

from scrapy import Request, Spider


class OjcommerceDSpider(Spider):
    name = "ojcommerce"
    allowed_domains = ["ojcommerce.com"]
    custom_settings = {
        'LOG_LEVEL': 'DEBUG',
        'COOKIES_DEBUG': True,
        'DEFAULT_REQUEST_HEADERS': {
            'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.82 Safari/537.36',
        },
    }

    def start_requests(self):
        yield Request(
            url='http://www.ojcommerce.com/search?k=furniture',
            callback=self.parse_search_page,
        )

    def parse_search_page(self, response):
        yield Request(
            url='http://www.ojcommerce.com/ajax/search.aspx/FetchDataforPaging',
            method='POST',
            body=json.dumps({'searchTitle': 'furniture', 'pageIndex': '2', 'sortBy': '1'}),
            callback=self.parse_json_page,
            headers={
                'Content-Type': 'application/json; charset=UTF-8',
                'Accept': 'application/json, text/javascript, */*; q=0.01',
                'X-Requested-With': 'XMLHttpRequest',
            },
        )

    def parse_json_page(self,response):
        data = json.loads(response.body)
        with open('ojcommerce.json', 'wb') as f:
            json.dump(data, f, indent=4)

2 つの観察:

  • 「新しい」ASP.NET_SessionIdCookieを取得するには、別のサイト ページへの以前のリクエストが必要です。
  • を使用して動作させることができませんでした。代わりFormRequestに使用してください。Request
于 2016-12-14T15:45:25.660 に答える