AJAX로 일부 사이트를 처리해야하는 Scrapy 스파이더를 작성합니다. 이론적으로는 정상적으로 작동해야하며, Scrapy 쉘에서 수동으로 fetch()를 사용하면 정상적으로 작동하지만 "scrapy crawl ..."을 실행하면 로그에 POST 요청이 표시되지 않고 항목이 스크래핑되지 않습니다. . 문제의 원인은 무엇 일 수 있으며 무엇이 될 수 있습니까?scrapy가 POST 요청을하지 않습니다.
import scrapy
from scrapy import Request, FormRequest
import json
class ExpertSpider(scrapy.Spider):
name = "expert"
allowed_domains = ["expert.fi"]
start_urls = (
'http://www.expert.fi/',
)
def parse(self, response):
categories = response.xpath('//div[@id="categories-navigation"]//a/@href').extract()
for cat in categories:
yield Request(response.urljoin(cat), callback=self.parseCat)
def parseCat(self, response):
catMenu = response.xpath('//div[@id="category-left-menu"]')
if catMenu:
subCats = catMenu.xpath('.//a[@class="category"]/@href').extract()
for subCat in subCats:
yield Request(response.urljoin(subCat), callback=self.parseCat)
else:
self.parseProdPage(response)
print "I`ve reached this point" # debug
def parseProdPage(self, response):
catId = response.css...
url = 'https://www.expert.fi/Umbraco/Api/Product/ProductsByCategory'
data = dict()
...
jsonDict = json.dumps(data)
heads = dict()
heads['Content-Type'] = 'application/json;charset=utf-8'
heads['Content-Length'] = len(jsonDict)
heads['Accept'] = 'application/json, text/plain, */*'
heads['Referer'] = response.url
return Request(url=url, method="POST", body=jsonDict, headers=heads, callback=self.startItemProc)
def startItemProc(self, response):
resDict = json.loads(response.body)
item = dict()
for it in resDict['Products']:
# Product data
...
item['Category Path'] = it['Breadcrumb'][-1]['Name'] + ''.join([' > ' + crumb['Name']
for crumb in it['Breadcrumb'][-2::-1]])
# Make the new request for delivery price
url = 'https://www.expert.fi/Umbraco/Api/Cart/GetFreightOptionsForProduct'
data = dict()
...
jsonDict = json.dumps(data)
heads = dict()
heads['Content-Type'] = 'application/json;charset=utf-8'
heads['Content-Length'] = len(jsonDict)
heads['Accept'] = 'application/json, text/plain, */*'
heads['Referer'] = item['Product URL']
req = Request(url=url, method="POST", body=jsonDict, headers=heads, callback=self.finishItemProc)
req.meta['item'] = item
yield req
def finishItemProc(self, response):
item = response.meta['item']
ansList = json.loads(response.body)
for delivery in ansList:
if delivery['Name'] == ...
item['Delivery price'] = delivery['Price']
return item
로그는 다음
2016-10-09 01:11:16 [scrapy] INFO: Dumping Scrapy stats:
{'downloader/exception_count': 9,
'downloader/exception_type_count/twisted.internet.error.DNSLookupError': 1,
'downloader/exception_type_count/twisted.internet.error.TimeoutError': 8,
'downloader/request_bytes': 106652,
'downloader/request_count': 263,
'downloader/request_method_count/GET': 263,
'downloader/response_bytes': 5644786,
'downloader/response_count': 254,
'downloader/response_status_count/200': 252,
'downloader/response_status_count/301': 1,
'downloader/response_status_count/302': 1,
'dupefilter/filtered': 19,
'finish_reason': 'finished',
'finish_time': datetime.datetime(2016, 10, 8, 22, 11, 16, 949472),
'log_count/DEBUG': 265,
'log_count/INFO': 11,
'request_depth_max': 3,
'response_received_count': 252,
'scheduler/dequeued': 263,
'scheduler/dequeued/memory': 263,
'scheduler/enqueued': 263,
'scheduler/enqueued/memory': 263,
'start_time': datetime.datetime(2016, 10, 8, 22, 7, 7, 811163)}
2016-10-09 01:11:16 [scrapy] INFO: Spider closed (finished)
필자가 지금까지 이해하고있는 한 가지 문제는 'self.myMethodName (response)'과 같은 다른 메소드에서 하나의 메소드를 호출하는 것인데, 전혀 작동하지 않는다. 그러나 왜 내가 어떻게하면 다른 메소드에서 하나의 메소드의 코드를 단순하게 빼앗는 것을 피하기 위해해야 할 일을 할 수 있을까? – vchslv13