我在python中使用Scrapy
抓取肯德基位置时遇到了问题。https://api.kfc.de/find-a-kfc/allrestaurant这里是我的原始代码:
class KFCSpider(scrapy.Spider):
name = 'kfc'
allowed_domains = ['www.kfc.de']
start_urls = ['https://api.kfc.de/find-a-kfc/allrestaurant']
def parse(self, response):
data_json = json.loads(response.body)
shop_list = data_json
for _ , store in enumerate(shop_list):
shop = {'shop_id': store['id']}
shop['name']= store['name']
shop['disposition']=store['operatingHoursStore'][-2]['disposition']
shop['lon']= store['location']['longitude']
shop['lat'] = store['location']['latitude']
shop['address'] =store['address']
shop['city'] = store['city']
shop['accessed']= datetime.date.today()
yield shop
它没有显示任何错误(只是显示0页被刮擦的信息),并且它输出一个空的.geojson文件。如果我在json.loads(response.body)
之后添加print(data_json)
,它不会打印任何东西。
如果我尝试在命令行中使用curl,我会得到以下结果:
$ curl 'https://api.kfc.de/find-a-kfc/allrestaurant'
<HTML><HEAD>
<TITLE>Access Denied</TITLE>
</HEAD><BODY>
<H1>Access Denied</H1>
You don't have permission to access "http://api.kfc.de/find-a-kfc/allrestaurant" on this server.<P>
Reference #18.17a02417.1653923760.34c85cb
</BODY>
</HTML>
以下方法可以替代:
curl --compressed 'https://api.kfc.de/find-a-kfc/allrestaurant' -H 'User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:100.0) Gecko/20100101 Firefox/100.0' -H 'Accept-Language: en-US,en;q=0.8,de-DE;q=0.5,de;q=0.3'
但是,这对Scrapy不起作用
class KFCSpider(scrapy.Spider):
name = 'kfc'
def start_requests(self):
return [scrapy.Request('https://api.kfc.de/find-a-kfc/allrestaurant',
headers={'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64; rv:100.0) Gecko/20100101 Firefox/100.0',
'Accept-Language': 'en-US,en;q=0.8,de-DE;q=0.5,de;q=0.3',
'Host': 'api.kfc.de',
'Accept': '*/*',
'Accept-Encoding': 'deflate, gzip'
})
]
1条答案
按热度按时间uhry853o1#
1.从浏览器中复制头文件(除了cookie),并在
start_requests
函数中创建一个请求。我不知道为什么它没有为你工作,但你可以测试头文件,看看哪里出了问题。1.可选:您可以使用
response.json()
来代替json.loads()
。1.不需要每次迭代都调用
datetime.date.today()
。1.可选:添加下载延迟。
输出量: