抓取ASPX网站无法正常工作-抓取31页(每分钟31页),抓取0个项目(每分钟0个项目)

时间:2019-12-07 23:33:04

标签: python asp.net scrapy

我正在尝试抓取包含crime statistics in Israel的ASP网站。 在网站上,用户应该从下拉列表中选择一个城镇: enter image description here

选择之后,用户的结果将返回到同一页面的底部: enter image description here

由于某种原因,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(),
            }

任何提示将不胜感激,并预先感谢!

1 个答案:

答案 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}]