我正在尝试抓取包含crime statistics in Israel的ASP网站。
在网站上,用户应该从下拉列表中选择一个城镇:
由于某种原因,scrapy似乎正在爬网,但未返回任何内容:
[scrapy.core.engine] DEBUG: Crawled (200) <POST https://www.police.gov.il/mapskifout.aspx> (referer: https://www.police.gov.il/mapskifout.aspx)
[scrapy.extensions.logstats] INFO: Crawled 31 pages (at 31 pages/min), scraped 0 items (at 0 items/min)
代码:
import scrapy
# from ..items import ViewstateItem
class SpidyQuotesViewStateSpider(scrapy.Spider):
name = 'crimeStat'
start_urls = ['https://www.police.gov.il/mapskifout.aspx']
download_delay = 1.5
def parse(self, response):
for town in response.css('li.rcbItem::text').extract():
yield scrapy.FormRequest(
'https://www.police.gov.il/mapskifout.aspx',
formdata={
'ctl00$ctl00$ContentPlaceMain$contentPageMain$TownComboBox': town,
'__VIEWSTATE': response.css('input#__VIEWSTATE::attr(value)').extract_first()
},
callback=self.parse_results
)
def parse_results(self, response):
# items = ViewstateItem
for data in response.css("div.resultset resultsetprint"):
yield {
'crimeType': data.xpath('//*[@id="statistics"]/div/div/div[1]/div[1]/text()').get(),
'crimeAmount': data.xpath('//*[@id="statistics"]/div/div/div[1]/div[2]/text()').get(),
'carAmount': data.xpath('//*[@id="statistics"]/div/div/div[1]/div[4]/text()').get(),
}
任何提示将不胜感激,并预先感谢!
答案 0 :(得分:0)
如果您通过跟踪发送的请求来寻找数据的来源,您会发现数据来自以下链接:https://www.police.gov.il/MapSkifoutService?city=7900&street=&house=&subjects=1,2,10,11&quarter=1,2,3&year=2019
因此,通过指定年份和城市代码,您将获得所需的数据。
但是如何获得城市代码?
城市代码存在于主页源代码的脚本部分中,因此您可以像这样获得它:
import requests
import json
import re
base_url = 'https://www.police.gov.il/MapSkifoutService?' \
'city=%(city)s&street=&house=&subjects=1,2,10,11&quarter=1,2,3&year=%(year)s'
s = requests.Session()
res = s.post('https://www.police.gov.il/mapskifout.aspx')
codes = re.findall('itemData":(.*)],', res.content.decode('utf-8'))[0] + "]"
json_codes = json.loads(codes)
for town in json_codes:
json_response = json.loads(s.post(base_url % {'city': town['value'], 'year': '2019'})
.content.decode('utf-8'))
print(json_response['Stats'])
示例输出为:
[{'Title': 'נתוני עבירות פליליות', 'GroupId': 1, 'Statistics': [{'Id': 1, 'Subject': 'גניבה מתוך רכב', 'CountFact': 2, 'CountFact2': 0}, {'Id': 2, 'Subject': 'גניבת רכב ', 'CountFact': 10, 'CountFact2': 0}, {'Id': 10, 'Subject': 'התפרצות לדירות', 'CountFact': 2, 'CountFact2': 0}, {'Id': 11, 'Subject': 'התפרצות לבתי עסק ומוסדות', 'CountFact': 2, 'CountFact2': 0}], 'CountTikia': 16, 'SummaryTitle': 'סה"כ תיקי חקירה שנפתחו באזור הנבחר', 'sougTitle': 'סוג עבירה', 'countTitle': 'כמות עבירות', 'CountTikia2': 0}]
[{'Title': 'נתוני עבירות פליליות', 'GroupId': 1, 'Statistics': [{'Id': 1, 'Subject': 'גניבה מתוך רכב', 'CountFact': 4, 'CountFact2': 0}, {'Id': 2, 'Subject': 'גניבת רכב ', 'CountFact': 10, 'CountFact2': 0}, {'Id': 10, 'Subject': 'התפרצות לדירות', 'CountFact': 16, 'CountFact2': 0}, {'Id': 11, 'Subject': 'התפרצות לבתי עסק ומוסדות', 'CountFact': 5, 'CountFact2': 0}], 'CountTikia': 35, 'SummaryTitle': 'סה"כ תיקי חקירה שנפתחו באזור הנבחר', 'sougTitle': 'סוג עבירה', 'countTitle': 'כמות עבירות', 'CountTikia2': 0}]
[{'Title': 'נתוני עבירות פליליות', 'GroupId': 1, 'Statistics': [{'Id': 1, 'Subject': 'גניבה מתוך רכב', 'CountFact': 9, 'CountFact2': 0}, {'Id': 2, 'Subject': 'גניבת רכב ', 'CountFact': 12, 'CountFact2': 0}, {'Id': 10, 'Subject': 'התפרצות לדירות', 'CountFact': 17, 'CountFact2': 0}, {'Id': 11, 'Subject': 'התפרצות לבתי עסק ומוסדות', 'CountFact': 4, 'CountFact2': 0}], 'CountTikia': 40, 'SummaryTitle': 'סה"כ תיקי חקירה שנפתחו באזור הנבחר', 'sougTitle': 'סוג עבירה', 'countTitle': 'כמות עבירות', 'CountTikia2': 0}]